Securing PhP, μέρος 2

Nick Papanotas's Facebook profile Γράφει ο Νίκος Παπανώτας | View CommentsLeave a Comment
Τελευταία ενημέρωση: Tuesday, July 7, 2009 | 10210 Views

Πέρασε αρκετός καιρός απο το προηγούμενο post σχετικά με PhP, και έτσι είπα να επανέλθω με ακόμα ένα άρθρο για php security. Ως γνωστόν η ασφάλεια είναι ένα απο τα σημαντικότερα πράγματα που πρέπει να προσέξουμε στο web development αφού οι συνέπειες μιας πιο ανάλαφρης αντιμετώπισης του θέματος μπορεί να είναι τουλάχιστον καταστροφικές. Παρακάτω θα προσπαθήσω να αναλύσω μερικές παραμέτρους που δέν ανέπτυξα στο προηγούμενο άρθρο για το θέμα:

Register_Globals

Θα ξεκινήσουμε με κάτι απλό που έχει ειπωθεί αρκετές φορές – μια και που είναι αρκετά παλιά “τρύπα” – το register globals. Το register_globals είναι ένα directive στο php.ini το οποίο κάνει register ως μεταβλητές οτιδήποτε υπάρχει στο $_COOKIE, το $_SESSION, το $_POST και το $_GET. Με άλλα λόγια αν για παράδειγμα κάποιος καλέσει ένα url και προσθέσει στο τέλος “?a=1″, μέσα στην εφαρμογή θα υπάρχει η μεταβλητή $a που θα έχει τιμή 1.

Με μια πρώτη ματιά δέν φαίνεται να υπάρχει πρόβλημα, ωστόσο φανταστείτε τί μπορεί να γίνει στο παρακάτω παράδειγμα αν ο χρήστης έχει προσθέσει στο url το εξής: “?admin=1″


if ( isset( $_SESSION['admin']) && $_POST['security_code'] == '12345' ){
$admin = true;
}

eval

Η eval() είναι μια function που εξ’ορισμού θέλει πολύ προσοχή αφού η λάθος χρήση της μπορεί να επιτρέψει σε κάποιον να τρέξει οτιδήποτε στον server μας. Το σημαντικό είναι να μήν χρησιμοποιούμε ποτέ δεδομένα απο τον χρήστη($_POST, $_GET) μέσα στην eval() ή αν το κάνουμε αυτό τουλάχιστον να είμαστε σίγουροι πως ο χρήστης δέν μπορεί να “βγεί” απο την εντολή που θέλουμε (αυτό κυρίως γίνεται με την εισαγωγή ενός ελληνικού ερωτηματικού)

Remote file inclusion

Ακόμα ένα σημαντικό θέμα είναι το remote file inclusion. Στα περισσότερα default setup της php είναι ενεργοποιημένο, και αυτό που κάνει είναι να επιτρέπει να κάνουμε include scripts απο άλλους servers. Για το συγκεκριμένο vurnerability έχουν γραφτεί αρκετά exploits τα οποία μπορούν να δώσουν full access στον server. Για να σιγουρευτείτε οτι δέν έχετε πρόβλημα πρέπει αφενός να μήν χρησιμοποιείτε ποτέ στην include δεδομένα που σας δίνει ο χρήστης (αυτό είναι γενικά πρόβλημα, όχι μόνο για τα remote file inclusions) ενώ παράλληλα φροντίστε στο php.ini το directive allow_url_include να είναι Off.

Session fixation

Το session fixation είναι ένα σχετικά χαμηλού ρίσκου vurnerability, το οποίο ουσιαστικά επιτρέπει σε κάποιον “κακόβουλο” να πάρει πρόσβαση με τα στοιχεία κάποιου χρήστη της εφαρμογής μας. Για το συγκεκριμένο θέμα μπορούμε να κάνουμε δύο κινήσεις. Το πρώτο να έχουμε διαφορετικά path για τα session ανα domain (αλλάζοντας το session.save_path στο htaccess του κάθε site) και το δεύτερο είναι το να χρησιμοποιούμε συχνά μέσα στην εφαρμογή μας την εντολή session_regenerate_id(). Βέβαια η απόλυτη λύση – η οποία βοηθάει γενικότερα – είναι το να έχουμε custom session handler, ωστόσο αυτό είναι κάπως advanced θέμα.

Error reporting

Ένα απλό αλλα εξίσου σημαντικό θέμα είναι πως στον production server πρέπει να μήν εμφανίζονται τα λάθη της php γιατί εφόσον εμφανίζονται κάνουμε την ζωή του hacker πολύ πιο εύκολη :) . Ο τρόπος να το λύσουμε αυτό είναι απλά να αλλάξουμε το directive display_errors σε Off. Φυσικά για να μπορούμε να παρακολουθούμε τα προβλήματα που έχει η εφαρμογή μας σε production περιβάλλον μπορούμε να χρησιμοποιήσουμε log files (directive: log_errors) ή ακόμα και να δημιουργήσουμε custom error handlers.

PhP Security scripts

Για το τέλος άφησα μερικά scripts που έχω ανακαλύψει και μπορούν να σας βοηθήσουν στο να ανακαλύπτετε security προβλήματα με τις εφαρμογές σας.

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

  • http://Autocompare.gr Paraskevas

    Poly kalo arthro nikolio … Idika to Remote file inclusion
    mou thimise mia palia istoria php.gif .pisteuw ti thimase kai esy alla kai o thek.

    Na prosthesw pws simantiko einai se php na dilonoume kai tous tipous twn metavlitwn px (int,string etc) alla kai na filtraroume kathe input apo get kai post prin to dwsoume gia opoiodipote erwtima sth mysql.H php exei tetoiou idous functions pou perimenoun na tis xrisimopoihsoume .

  • http://blogged.gr/ paranic

    και ασφαλώς όσο μπορούμε triple check operator :-)
    πχ if ($admin === true)
    έτσι και να έχουμε ξεχάσει το register globals δεν θα μπορέσει κάποιος να μας φέρει bool από ένα $_GET η $_POST

    γράφοντας έτσι ξεφεύγεις απο slacky scripter και γίνεσαι πιο programmer :-)

    εγώ έχω αρκετά χρόνια που με ρωτάνε τι κάνεις και τους λέω προγραμματιστής :-) ενώ γράφω μόνο php :-)

  • Chris

    Thank you for sharing this useful information.

    http://fastessays.co.uk/

blog comments powered by Disqus