Πως να προστατευτούμε από επίθεση SQLi [GET METHOD]

Όπως έχουμε πει με τα google dorks inurl:.php?id=1 , που δίνουμε στην google να καταλάβει ότι θέλουμε να ψάξουμε στην αναζήτη ΜΟΝΟ ιστοσελίδες και σελίδες που έχουν ΜΟΝΟ παράμετρο ID στο URL τους… Ε αυτό θα κάνουμε σήμερα. Θα μάθουμε πως να μην τρώει MYSQL ERROR η σελίδα όταν βάζουμε το quote ”   ‘   ” δίπλα από την παράμετρο. Π.Χ id=1 .

Αφήνω λοιπόν την πολλή εξήγηση και πάμε να μπούμε στο ψητό.

 

100

 

Εδώ του λέμε να πάρει το ID το οποίο το έχουμε ορίσει και user_id και μετά φτιάχνουμε ένα query με users όπου id=$user_id.

 

101

102

 

Πρώτα απ’ όλα βλέπουμε τον κώδικά μας. Έχουμε χτίσει ένα 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 ).

  Πως να προστατευτούμε από επίθεση SQLi [POST METHOD]

103

 

Εδώ έχουμε τα tables που είπα πρίν. Και με ID χρήστη τον αριθμό 64. (όσοι χρήστες υπάρχουν μέσα στην βάση τόσο θα αυξάνεται η λίστα). Πατάμε λοιπόν edit να δούμε τι γίνεται στο url.

104

Όπως βλέπουμε, το URL δείχνει τον αριθμό 64 στην παράμετρο ID. Αυτό γίνεται επειδή πρίν στο href βάλαμε το $row[‘id’] όπως σας εξήγησα παραπάνω.

Πάμε λοιπόν να βάλουμε ένα QUOTE στην παράμετρο να δούμε πως και ΓΙΑΤΙ αντιδράει η ιστοσελίδα με ERROR.

105

106

Όσοι έχετε πάει να κάνετε SQL INJECTION επίθεση σίγουρα έχετε παρατηρίσει κάποιο τέτοιο error. To error αυτό ονομάζεται ERROR-BASED SQL INJECTION. Error based ονομάζεται όταν το quote (‘) «σπάει» το Syntax. Γι αυτό και γράφει “You have an error in your SQL Syntax”.

Πάμε να το εκμεταλλευτούμε αυτό; Θα είναι πανεύκολο γιατί ο απρόσεκτος Developer ξέχασε να βάλει τα φίλτρα στον κώδικά του οπότε εγώ σαν κακόβουλος θα μπορέσω να τον εκμεταλλευτώ…

107

Πάμε και γράφουμε λοιπόν

sqlmap -u "http://.com/edit.php?id=1" --dbs

Το –dbs είναι για να βρεί τις βάσεις δεδομένων.

Μας πετάει cookies και πατάμε Y για να τα χρησιμοποιήσουμε.

108

 

Πόσο ευχάριστο για εμάς ε; Εδώ μας λέει ΄΄οτι ΠΙΘΑΝΟΝ η παράμετρος ID να είναι ευπαθής και η ΠΙΘΑΝΗ Database είναι MySQL.

Θέλουμε να κάνουμε skip τα άλλα payload tests για άλλες dbmses? Και πατάμε Yes. Διότι δεν χρειαζόμαστε κάτι άλλο.

109

Τι είπαμε πριν; Error-based. Πάμε παρακάτω τα εξήγησα πρίν αυτά.

110

Η παράμετρος ID είναι ευπαθής. Θές να τσεκάρεις κι άλλες παραμέτρους; (Δεν χρειάζεται οπότε NO)

111

Τι κακό τον βρήκε……. Αν θυμάστε από τον προηγούμενο οδηγό η database λεγόταν ergasiasxol. Πάμε να μπούμε σε αυτήν γράφοντας

sqlmap -u "http://.com/edit.php?id=64" -D ergasiasxol --tables

-D ergasiasxol για να μπούμε σε αυτήν την βάση, και το –tables για να μας εμφανίσει τα tables.

  Η επαναφορά εργοστασιακών ρυθμίσεων αφαιρεί τους ιούς;

 

112

 

Βλέπουμε πως υπάρχει το table users. Οπότε πάμε να μπούμε σε αυτό και να δούμε τα columns.

sqlmap -u "http://.com/edit.php?id=64" -D ergasiasxol -T users --columns

 

113

 

Εδώ βλέπουμε τα columns. Εμείς χρειαζόμαστε μόνο το username και το password. Πάμε να τα κάνουμε DUMP για να τα δούμε.

sqlmap -u "http://.com/edit.php?id=64" -D ergasiasxol -T users -C username,password --dump

 

114

 

Φτάσαμε στον στόχο μας. Βέβαια ο κωδικός είναι σε κρυπτογράφηση md5 έχω εξηγήσει εδώ πως το κάνουμε αυτό, οπότε απλά παίρνουμε το hash και το σπάμε (αν δεν υπάρχει σε online tool προτείνω crunch για να φτιάξετε λίστα).

#######################################

ΠΡΟΣΤΑΣΙΑ

#######################################

Πάμε λοιπόν τώρα να δούμε πως μπορούμε να προστατευτούμε από αυτήν την επίθεση. Πρέπει να πάμε ξανά στον κώδικά μας και να βρούμε που είναι το variable που έχουμε ορίσει για την $_GET[‘id’]; .

115

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.

116

Απολύτως καμία αντίδραση. Πάμε να κάνουμε πάλι επίθεση λοιπόν

117

CRITICAL. Δεν μας αφήνει να βρούμε βάση. Πάμε να δοκιμάσουμε και με risk και level  και με v 6

118

 

119

 

Πάλι critical. Οπότε είμαστε καλυμμένοι.

Συντάκτης άρθρου: Attednev Vrof

SQLi,GET METHOD,iguru

Written by Anastasis Vasileiadis

Οι μεταφράσεις είναι σαν τις γυναίκες. Όταν είναι ωραίες δεν είναι πιστές και όταν είναι πιστές δεν είναι ωραίες.

Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *

Το μήνυμα σας δεν θα δημοσιευτεί εάν:
1. Περιέχει υβριστικά, συκοφαντικά, ρατσιστικά, προσβλητικά ή ανάρμοστα σχόλια.
2. Προκαλεί βλάβη σε ανηλίκους.
3. Παρενοχλεί την ιδιωτική ζωή και τα ατομικά και κοινωνικά δικαιώματα άλλων χρηστών.
4. Διαφημίζει προϊόντα ή υπηρεσίες ή διαδικτυακούς τόπους .
5. Περιέχει προσωπικές πληροφορίες (διεύθυνση, τηλέφωνο κλπ).


  +  7  =  14