MS Access SQL Injection
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο 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.
Χρησιμοποιώντας την τεχνική chaining equals μπορείτε επίσης να 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, το ερώτημα χρησιμοποιεί μια δήλωση “if-then” προκειμένου να ενεργοποιήσει ένα “200 OK” σε περίπτωση επιτυχίας ή ένα “500 Internal Error” διαφορετικά. Εκμεταλλευόμενοι τον τελεστή TOP 10, είναι δυνατόν να επιλέξουμε τα πρώτα δέκα αποτελέσματα. Η επακόλουθη χρήση του LAST επιτρέπει να εξετάσουμε μόνο την 10η πλειάδα. Σε αυτή την τιμή, χρησιμοποιώντας τον τελεστή MID, είναι δυνατόν να εκτελέσουμε μια απλή σύγκριση χαρακτήρων. Αλλάζοντας σωστά τον δείκτη του MID και του TOP, μπορούμε να εξάγουμε το περιεχόμενο του πεδίου “username” για όλες τις γραμμές.
Mid('admin',1,1)
get substring from position 1 length 1 (initial position is 1)
LEN('1234')
get length of string
ASC('A')
get ascii value of char
CHR(65)
get string from ascii value
IIF(1=1,'a','b')
if then
COUNT(*)
Count number of items
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)