Web Fuzzing ή διαφορετικά χνουδιάζω τον ιστό

Συγγραφέας: Γεράσιμος Κασσάρας, IT Risk Consultant,Msc in Information Security, CISSP

Fuzzing
Το Web Fuzzing σε ελεύθερη μετάφραση σημαίνει  χνουδιάζω τον ιστό και απέχει πολύ από το χνούδιασμα του βαμβακιού. Το Web Fuzzing είναι ένας από του πλέον αποτελεσματικούς τρόπους ανακάλυψης bugs που προκαλούν DoS attacks κυρίως, XSS αλλά και SQL Injections . Σκοπός αυτού του άρθρου είναι να κατανοήσει ο αναγνώστης τι είναι ένας Web Fuzzer και πως μπορούμε να γράψουμε ένα Fuzzer με την χρήση της γλώσσας προγραμματισμού Python και πιο συγκεκριμένα να με τη βιβλιοθήκη HTTPLIB.

Το HTTPLib
To HTTPLIB είναι ένας ελαφρύς wrapper για το socket module.  Με την χρήση της βιβλιοθήκης HTTPLIB ένας προγραμματιστής μπορεί γράφοντας μόνο μερικές γραμμές κώδικα να αρχίσει να αλληλεπιδρά με το HTTP και κατ επέκταση να δημιουργεί HTTP GET αιτήματα και να κατεβάζει ιστοσελίδες. Ο παρακάτω κώδικας κατεβάζει το URL: http://blog.kassaras.com/?p=55. Αν το αίτημα εκτελεστεί με επιτυχία, το HTTP επιστρέψει κωδικό 200 τότε τυπώνει και την ιστοσελίδα που κατέβηκε.

import httplib,os,sys
hostToFuzz = ‘blog.kassaras.com’
#Handling Http header…
httpHeader = httplib.HTTP(hostToFuzz)
httpHeader.putrequest(‘GET’, ‘/?p=55′)
httpHeader.putheader(‘Host’, hostToFuzz)
httpHeader.putheader(‘User-agent’,'python-httplib’)
httpHeader.endheaders()
#Handling Http return codes…
returncode, returnmsg, headers = httpHeader.getreply()
if returncode == 200:  #OK
file = httpHeader.getfile()
print file.read()

Το παράδειγμα που ακολουθεί είναι πανομοιότυπο με το παραπάνω και η μόνη διαφορά που έχει είναι πως έχει προστεθεί ένα loop και κάνει looping την αίτηση που είδαμε πιο πάνω 5 φορές.

import httplib,os,sys
hostToFuzz = ‘blog.kassaras.com’
counter =0
while counter <= 4:
counter=counter+1
# Handling Http header…
httpHeader = httplib.HTTP(hostToFuzz)
httpHeader.putrequest(‘GET’, ‘/?p=55′)
httpHeader.putheader(‘Host’, hostToFuzz)
httpHeader.putheader(‘User-agent’,'python-httplib’)
httpHeader.endheaders()
# Handling Http return codes…
returncode, returnmsg, headers = httpHeader.getreply()
print returncode

Το παράδειγμα που ακολουθεί είναι πανομοιότυπο με το παραπάνω και η μόνη διαφορά που έχει είναι πως αυτή τη φορά η μεταβλητή p παίρνει τις τιμές του μετρητή που χρησιμοποιεί το loop για να κάνει 10000000000000000000000 αιτήσεις HTTP αυξάνοντας κάθε φορά τον μετρητή κατα 1.

import httplib,os,sys
hostToFuzz = ‘blog.kassaras.com’
counter = 0
while counter <= 10000000000000000000000:
counter = counter+1
page_counter = counter
print ‘counter:’
print counter
print ‘page_counter:’
print page_counter
# Handling Http header…
httpHeader = httplib.HTTP(hostToFuzz
httpHeader.putrequest('GET', '/?p='+str(page_counter))
httpHeader.putheader(‘Host’, hostToFuzz)
httpHeader.putheader(‘User-agent’,'python-httplib’)
httpHeader.endheaders()
#Handling Http return codes…
returncode, returnmsg, headers = httpHeader.getreply()
print returncode

Πρακτική Χρήση των Fuzzers
Πώς μπορεί να χρησιμοποιηθεί όμως ο Fuzzer για να ανιχνεύσει ευπάθειες των εφαρμογών; Αυτό μπορεί να γίνει με το να δούμε πως η εφαρμογή μπορεί να χειριστεί μεγάλους ακεραίους (long integer handling), τι δεδομένα θα επιστέψει η εφαρμογή ζητόντας μεγάλους ακεραίους (information disclosure issues) και τέλος τεστάρουμε την εφαρμογή πώς συμπεριφέρετε σε stress testing συνθήκες. Ο παραπάνω κώδικας τυπώνει μόνο χρήσιμες πληροφορίες για το τεστ όπως τον HTTP κωδικό. Μια παραπάνω προέκταση μπορεί να προσθέσει εγγραφή των αποτελεσμάτων σε αρχεία, εξέταση το μεγέθους της ιστοσελίδας μέσα απο το HTTP header αλλά και άλλα χαρακτηριστικά. Αυτό όμως που μπορει να κάνει κάποιος για να αυξήσει δραματικά την χρησιμότητα ενος Fuzzer είναι να αναλύει τα δεδομένα κάνοντας parsing κλπ.

Advertisements

0 Responses to “Web Fuzzing ή διαφορετικά χνουδιάζω τον ιστό”



  1. Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s





%d bloggers like this: