Όπως έχουμε πει με τα google dorks inurl:.php?id=1 , που δίνουμε στην google να καταλάβει ότι θέλουμε να ψάξουμε στην αναζήτη ΜΟΝΟ ιστοσελίδες και σελίδες που έχουν ΜΟΝΟ παράμετρο ID στο URL τους… Ε αυτό θα κάνουμε σήμερα. Θα μάθουμε πως να μην τρώει MYSQL ERROR η σελίδα όταν βάζουμε το quote ” ‘ ” δίπλα από την παράμετρο. Π.Χ id=1‘ .
Αφήνω λοιπόν την πολλή εξήγηση και πάμε να μπούμε στο ψητό.
Εδώ του λέμε να πάρει το ID το οποίο το έχουμε ορίσει και user_id και μετά φτιάχνουμε ένα query με users όπου id=$user_id.
Πρώτα απ’ όλα βλέπουμε τον κώδικά μας. Έχουμε χτίσει ένα table γράφοντας κώδικα HTML ΜΕΣΑ ΣΤΗΝ PHP, και με τα $row που έχουμε ορίσει πιο πάνω από το foreach και $sql_run, του δείχνουμε να καταλάβει πως θέλουμε στα tables να εμφανίζετε ΚΑΘΕ χρήστης μέσα από την βάση. (θα δείτε παρακάτω σε screenshot).
Ακριβώς από κάτω από αυτά τα $row, δίνουμε άλλο ένα row και το πιο σημαντικό γι αυτό το topic. Του λέμε όταν πατηθεί το «κουμπί» EDIT που θα υπάρχει στο table, να μας ανακατευθύνει ( href ) στην σελίδα edit.php (που έχουμε φτιάξει) αλλά όχι μόνο εκεί, αλλά και στην παράμετρο. Δηλαδή για παράδειγμα θέλουμε να κάνουμε edit τα στοιχεία του χρήστη MATA ο οποίος mata μέσα στην βάση σαν ID έχει τον αριθμό 64. Οπότε θα γράψεις στο url edit.php?id= (Και τον αριθμό του id του χρήστη μέσα στην βάση) $row[‘id’]. Προφανώς το ID αν δεν ξέρετε πως το διαβάζει μέσα από την βάση, το διαβάζει διότι κάναμε πριν query “SELECT * FROM users”. Δηλαδή; Επέλεξέ τα όλα (*) από το table users. Και αμέσως μετά τρέξαμε το $sql_run = mysqli_query($conn, $sql) (το sql ήταν το variable που είχαμε ορίσει για το query ( $sql = “SELECT * FROM users ).
Εδώ έχουμε τα tables που είπα πρίν. Και με ID χρήστη τον αριθμό 64. (όσοι χρήστες υπάρχουν μέσα στην βάση τόσο θα αυξάνεται η λίστα). Πατάμε λοιπόν edit να δούμε τι γίνεται στο url.
Όπως βλέπουμε, το URL δείχνει τον αριθμό 64 στην παράμετρο ID. Αυτό γίνεται επειδή πρίν στο href βάλαμε το $row[‘id’] όπως σας εξήγησα παραπάνω.
Πάμε λοιπόν να βάλουμε ένα QUOTE στην παράμετρο να δούμε πως και ΓΙΑΤΙ αντιδράει η ιστοσελίδα με ERROR.
Όσοι έχετε πάει να κάνετε SQL INJECTION επίθεση σίγουρα έχετε παρατηρίσει κάποιο τέτοιο error. To error αυτό ονομάζεται ERROR-BASED SQL INJECTION. Error based ονομάζεται όταν το quote (‘) «σπάει» το Syntax. Γι αυτό και γράφει “You have an error in your SQL Syntax”.
Πάμε να το εκμεταλλευτούμε αυτό; Θα είναι πανεύκολο γιατί ο απρόσεκτος Developer ξέχασε να βάλει τα φίλτρα στον κώδικά του οπότε εγώ σαν κακόβουλος θα μπορέσω να τον εκμεταλλευτώ…
Πάμε και γράφουμε λοιπόν
sqlmap -u "http://<target>.com/edit.php?id=1" --dbs
Το –dbs είναι για να βρεί τις βάσεις δεδομένων.
Μας πετάει cookies και πατάμε Y για να τα χρησιμοποιήσουμε.
Πόσο ευχάριστο για εμάς ε; Εδώ μας λέει ΄΄οτι ΠΙΘΑΝΟΝ η παράμετρος ID να είναι ευπαθής και η ΠΙΘΑΝΗ Database είναι MySQL.
Θέλουμε να κάνουμε skip τα άλλα payload tests για άλλες dbmses? Και πατάμε Yes. Διότι δεν χρειαζόμαστε κάτι άλλο.
Τι είπαμε πριν; Error-based. Πάμε παρακάτω τα εξήγησα πρίν αυτά.
Η παράμετρος ID είναι ευπαθής. Θές να τσεκάρεις κι άλλες παραμέτρους; (Δεν χρειάζεται οπότε NO)
Τι κακό τον βρήκε……. Αν θυμάστε από τον προηγούμενο οδηγό η database λεγόταν ergasiasxol. Πάμε να μπούμε σε αυτήν γράφοντας
sqlmap -u "http://<target>.com/edit.php?id=64" -D ergasiasxol --tables
-D ergasiasxol για να μπούμε σε αυτήν την βάση, και το –tables για να μας εμφανίσει τα tables.
Βλέπουμε πως υπάρχει το table users. Οπότε πάμε να μπούμε σε αυτό και να δούμε τα columns.
sqlmap -u "http://<target>.com/edit.php?id=64" -D ergasiasxol -T users --columns
Εδώ βλέπουμε τα columns. Εμείς χρειαζόμαστε μόνο το username και το password. Πάμε να τα κάνουμε DUMP για να τα δούμε.
sqlmap -u "http://<target>.com/edit.php?id=64" -D ergasiasxol -T users -C username,password --dump
Φτάσαμε στον στόχο μας. Βέβαια ο κωδικός είναι σε κρυπτογράφηση md5 έχω εξηγήσει εδώ πως το κάνουμε αυτό, οπότε απλά παίρνουμε το hash και το σπάμε (αν δεν υπάρχει σε online tool προτείνω crunch για να φτιάξετε λίστα).
#######################################
ΠΡΟΣΤΑΣΙΑ
#######################################
Πάμε λοιπόν τώρα να δούμε πως μπορούμε να προστατευτούμε από αυτήν την επίθεση. Πρέπει να πάμε ξανά στον κώδικά μας και να βρούμε που είναι το variable που έχουμε ορίσει για την $_GET[‘id’]; .
To user_id είναι το variable που έχουμε ορίσει για την GET. Το filtered_userid variable υπάρχει για να το προσθέσουμε μετά στο id=$filtered_userid στο query. Επίσης στο variable filtered_userid γράφουμε το εξής
filter_var($user_id, FILTER_SANITIZE_NUMBER_INT);
To filter_var είναι συνάρτηση της php η οποία χρησιμοποιείται για το φιλτράρισμα της μεταβλητής (variable). Στην περίπτωσή μας θέλουμε να φιλτράρουμε το variable $user_id που είναι της GET -> id=$row[‘id’] -> id=64 (στην προκειμένη περίπτωση).
To FILTER_SANITIZE_NUMBER_INT αποτρέπει χαρακτήρες όπως το QUOTE.
Πάμε λοιπόν τώρα να δούμε αν η σελίδα μας αντιδράει σε error.
Απολύτως καμία αντίδραση. Πάμε να κάνουμε πάλι επίθεση λοιπόν
CRITICAL. Δεν μας αφήνει να βρούμε βάση. Πάμε να δοκιμάσουμε και με risk και level και με v 6
Πάλι critical. Οπότε είμαστε καλυμμένοι.
Συντάκτης άρθρου: Attednev Vrof