MS Access SQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Η σύνθεση συμβολοσειρών είναι δυνατή με τους χαρακτήρες & (%26)
και + (%2b)
.
Δεν υπάρχουν σχόλια στο MS Access, αλλά προφανώς είναι δυνατόν να αφαιρεθεί το τελευταίο ενός ερωτήματος με έναν χαρακτήρα NULL:
Αν αυτό δεν λειτουργεί, μπορείτε πάντα να διορθώσετε τη σύνταξη του ερωτήματος:
Δεν υποστηρίζονται.
Ο LIMIT
χειριστής δεν έχει υλοποιηθεί. Ωστόσο, είναι δυνατόν να περιορίσετε τα αποτελέσματα του SELECT query στις πρώτες N γραμμές του πίνακα χρησιμοποιώντας τον TOP
χειριστή. Ο TOP
δέχεται ως παράμετρο έναν ακέραιο, που αντιπροσωπεύει τον αριθμό των γραμμών που θα επιστραφούν.
Ακριβώς όπως το TOP, μπορείτε να χρησιμοποιήσετε το LAST
το οποίο θα πάρει τις γραμμές από το τέλος.
Σε μια SQLi, συνήθως θα θέλετε να εκτελέσετε μια νέα ερώτηση για να εξάγετε πληροφορίες από άλλους πίνακες. Η MS Access απαιτεί πάντα ότι σε υποερωτήσεις ή επιπλέον ερωτήσεις πρέπει να υποδεικνύεται ένα FROM
.
Έτσι, αν θέλετε να εκτελέσετε ένα UNION SELECT
ή UNION ALL SELECT
ή ένα SELECT
μέσα σε παρένθεση σε μια συνθήκη, πρέπει πάντα να υποδείξετε ένα FROM
με ένα έγκυρο όνομα πίνακα.
Επομένως, πρέπει να γνωρίζετε ένα έγκυρο όνομα πίνακα.
Αυτό θα σας επιτρέψει να εξάγετε τιμές του τρέχοντος πίνακα χωρίς να χρειάζεται να γνωρίζετε το όνομα του πίνακα.
MS Access επιτρέπει παράξενη σύνταξη όπως '1'=2='3'='asd'=false
. Όπως συνήθως, η SQL injection θα είναι μέσα σε μια WHERE
ρήτρα και μπορούμε να το εκμεταλλευτούμε αυτό.
Φανταστείτε ότι έχετε μια SQLi σε μια βάση δεδομένων MS Access και γνωρίζετε (ή μαντέψατε) ότι ένα όνομα στήλης είναι username, και αυτό είναι το πεδίο που θέλετε να εξάγετε. Θα μπορούσατε να ελέγξετε τις διαφορετικές απαντήσεις της εφαρμογής ιστού όταν χρησιμοποιείται η τεχνική chaining equals και ενδεχομένως να εξάγετε περιεχόμενο με μια boolean injection χρησιμοποιώντας τη λειτουργία Mid
για να αποκτήσετε υποσυμβολοσειρές.
Αν γνωρίζετε το όνομα του πίνακα και τη στήλη που θέλετε να εξάγετε, μπορείτε να χρησιμοποιήσετε έναν συνδυασμό μεταξύ Mid
, LAST
και TOP
για να διαρρεύσετε όλες τις πληροφορίες μέσω boolean SQLi:
Feel free to check this in the online playground.
Χρησιμοποιώντας την τεχνική της αλυσίδας ίσων, μπορείτε επίσης να bruteforce table names με κάτι σαν:
Μπορείτε επίσης να χρησιμοποιήσετε έναν πιο παραδοσιακό τρόπο:
Feel free to check this in the online playground.
Sqlmap κοινά ονόματα πινάκων: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
Υπάρχει μια άλλη λίστα στο http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Μπορείτε να brute-force τα τρέχοντα ονόματα στηλών με το κόλπο της αλυσίδας ίσων με:
Ή με ένα group by:
Ή μπορείτε να κάνετε brute-force τα ονόματα στηλών ενός διαφορετικού πίνακα με:
Έχουμε ήδη συζητήσει την τεχνική αλυσίδωσης ισότητας για να εξάγουμε δεδομένα από τον τρέχοντα και άλλους πίνακες. Αλλά υπάρχουν και άλλοι τρόποι:
In a nutshell, the query uses an “if-then” statement in order to trigger a “200 OK” in case of success or a “500 Internal Error” otherwise. Taking advantage of the TOP 10 operator, it is possible to select the first ten results. The subsequent usage of LAST allows to consider the 10th tuple only. On such value, using the MID operator, it is possible to perform a simple character comparison. Properly changing the index of MID and TOP, we can dump the content of the “username” field for all rows.
Mid('admin',1,1)
πάρε υποσυμβολο από θέση 1 μήκος 1 (η αρχική θέση είναι 1)
LEN('1234')
πάρε μήκος της συμβολοσειράς
ASC('A')
πάρε την ascii τιμή του χαρακτήρα
CHR(65)
πάρε συμβολοσειρά από την ascii τιμή
IIF(1=1,'a','b')
αν τότε
COUNT(*)
μέτρησε τον αριθμό των στοιχείων
From here you can see a query to get tables names:
Ωστόσο, σημειώστε ότι είναι πολύ συνηθισμένο να βρίσκετε SQL Injections όπου δεν έχετε πρόσβαση για να διαβάσετε τον πίνακα MSysObjects
.
Η γνώση της απόλυτης διαδρομής του καταλόγου ιστοσελίδας μπορεί να διευκολύνει περαιτέρω επιθέσεις. Εάν τα σφάλματα της εφαρμογής δεν είναι εντελώς κρυμμένα, η διαδρομή του καταλόγου μπορεί να αποκαλυφθεί προσπαθώντας να επιλέξετε δεδομένα από μια ανύπαρκτη βάση δεδομένων.
http://localhost/script.asp?id=1'+'+UNION+SELECT+1+FROM+FakeDB.FakeTable%00
Η MS Access απαντά με ένα μήνυμα σφάλματος που περιέχει την πλήρη διαδρομή του καταλόγου ιστού.
Ο ακόλουθος επιθετικός παράγοντας μπορεί να χρησιμοποιηθεί για να συμπεράνει την ύπαρξη ενός αρχείου στο απομακρυσμένο σύστημα αρχείων. Εάν το καθορισμένο αρχείο υπάρχει, η MS Access ενεργοποιεί ένα μήνυμα σφάλματος που ενημερώνει ότι η μορφή της βάσης δεδομένων είναι μη έγκυρη:
http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00
Ένας άλλος τρόπος για να καταμετρήσετε αρχεία είναι να καθορίσετε ένα στοιχείο database.table. Εάν το καθορισμένο αρχείο υπάρχει, η MS Access εμφανίζει ένα μήνυμα σφάλματος μορφής βάσης δεδομένων.
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00
Το όνομα αρχείου βάσης δεδομένων (.mdb) μπορεί να συμπεραστεί με την ακόλουθη ερώτηση:
http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00
Όπου name[i] είναι ένα όνομα αρχείου .mdb και realTable είναι ένας υπαρκτός πίνακας μέσα στη βάση δεδομένων. Αν και η MS Access θα ενεργοποιήσει πάντα ένα μήνυμα σφάλματος, είναι δυνατόν να διακριθεί μεταξύ ενός μη έγκυρου ονόματος αρχείου και ενός έγκυρου ονόματος αρχείου .mdb.
Access PassView είναι ένα δωρεάν εργαλείο που μπορεί να χρησιμοποιηθεί για να ανακτήσει τον κύριο κωδικό πρόσβασης της βάσης δεδομένων του Microsoft Access 95/97/2000/XP ή Jet Database Engine 3.0/4.0.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)