MSSQL Injection
MSSQL Εισαγωγή
Απαρίθμηση Active Directory
Είναι δυνατόν να απαριθμήσετε τους χρήστες του domain μέσω SQL injection εντός ενός MSSQL server χρησιμοποιώντας τις παρακάτω συναρτήσεις MSSQL:
SELECT DEFAULT_DOMAIN()
: Πάρτε το τρέχον όνομα του domain.master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Εάν γνωρίζετε το όνομα του domain (DOMAIN σε αυτό το παράδειγμα), αυτή η συνάρτηση θα επιστρέψει το SID του χρήστη Administrator σε μορφή hex. Αυτό θα μοιάζει με0x01050000000[...]0000f401
, παρατηρήστε πώς τα τελευταία 4 bytes είναι το νούμερο 500 σε μορφή big endian, το οποίο είναι το κοινό ID του χρήστη administrator. Αυτή η συνάρτηση θα σας επιτρέψει να μάθετε το ID του domain (όλα τα bytes εκτός από τα τελευταία 4).SUSER_SNAME(0x01050000000[...]0000e803)
: Αυτή η συνάρτηση θα επιστρέψει το όνομα χρήστη του καθορισμένου ID (εάν υπάρχει), σε αυτή την περίπτωση 0000e803 σε μορφή big endian == 1000 (συνήθως αυτό είναι το ID του πρώτου κανονικού χρήστη που δημιουργήθηκε). Έπειτα μπορείτε να φανταστείτε ότι μπορείτε να δοκιμάσετε με βία τα IDs χρηστών από 1000 έως 2000 και πιθανότατα να πάρετε όλα τα ονόματα χρηστών του domain. Για παράδειγμα, χρησιμοποιώντας μια συνάρτηση όπως η παρακάτω:
Εναλλακτικές μέθοδοι βασισμένες σε σφάλματα
Οι SQL επιθέσεις βασισμένες σε σφάλματα συνήθως παρουσιάζουν κατασκευές όπως +AND+1=@@version--
και παραλλαγές που βασίζονται στον τελεστή «OR». Οι ερωτήματα που περιέχουν τέτοιες εκφράσεις συνήθως αποκλείονται από τα WAFs. Για να παρακάμψετε αυτό, συνδυάστε ένα συμβολοσειριακό χαρακτήρα χρησιμοποιώντας τον χαρακτήρα %2b με το αποτέλεσμα συγκεκριμένων κλήσεων συναρτήσεων που προκαλούν σφάλμα μετατροπής τύπου δεδομένων στα επιθυμητά δεδομένα.
Ορισμένα παραδείγματα τέτοιων συναρτήσεων:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
Παράδειγμα χρήσης της συνάρτησης USER_NAME()
:
SSRF
Αυτά τα κόλπα SSRF προήλθαν από εδώ
fn_xe_file_target_read_file
fn_xe_file_target_read_file
Απαιτεί δικαιώματα VIEW SERVER STATE
στον διακομιστή.
fn_get_audit_file
fn_get_audit_file
Απαιτεί την άδεια CONTROL SERVER
.
fn_trace_gettabe
fn_trace_gettabe
Απαιτεί την άδεια CONTROL SERVER
.
xp_dirtree
, xp_fileexists
, xp_subdirs
xp_dirtree
, xp_fileexists
, xp_subdirs
Οι αποθηκευμένες διαδικασίες όπως η xp_dirtree
, αν και δεν έχουν τεκμηριωθεί επίσημα από τη Microsoft, έχουν περιγραφεί από άλλους σε απευθείας σύνδεση λόγω της χρησιμότητάς τους στις λειτουργίες δικτύου εντός του MSSQL. Αυτές οι διαδικασίες χρησιμοποιούνται συχνά για την εξαγωγή δεδομένων εκτός ζώνης, όπως φαίνεται σε διάφορα παραδείγματα και άρθρα.
Για παράδειγμα, η αποθηκευμένη διαδικασία xp_dirtree
χρησιμοποιείται για να πραγματοποιήσει αιτήσεις δικτύου, αλλά περιορίζεται μόνο στη θύρα TCP 445. Ο αριθμός θύρας δεν είναι τροποποιήσιμος, αλλά επιτρέπει την ανάγνωση από κοινόχρηστους φακέλους δικτύου. Η χρήση απεικονίζεται στον παρακάτω κώδικα SQL:
Είναι αξιοσημείωτο ότι αυτή η μέθοδος μπορεί να μην λειτουργεί σε όλες τις ρυθμίσεις συστήματος, όπως σε Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
που εκτελείται σε Windows Server 2016 Datacenter
με τις προεπιλεγμένες ρυθμίσεις.
Επιπλέον, υπάρχουν εναλλακτικές αποθηκευμένες διαδικασίες όπως η master..xp_fileexist
και η xp_subdirs
που μπορούν να επιτύχουν παρόμοια αποτελέσματα. Περισσότερες λεπτομέρειες για την xp_fileexist
μπορούν να βρεθούν σε αυτό το άρθρο του TechNet.
xp_cmdshell
xp_cmdshell
Φυσικά, μπορείτε επίσης να χρησιμοποιήσετε την xp_cmdshell
για να εκτελέσετε κάτι που θα προκαλέσει ένα SSRF. Για περισσότερες πληροφορίες, διαβάστε τη σχετική ενότητα στη σελίδα:
MSSQL Ορισμένη από τον χρήστη Συνάρτηση - SQLHttp
Η δημιουργία μιας CLR UDF (Common Language Runtime User Defined Function), η οποία είναι κώδικας που έχει γραφτεί σε οποιαδήποτε γλώσσα .NET και έχει μεταγλωττιστεί σε ένα DLL, για να φορτωθεί μέσα στο MSSQL για την εκτέλεση προσαρμοσμένων λειτουργιών, είναι ένας διαδικασία που απαιτεί πρόσβαση dbo
. Αυτό σημαίνει ότι συνήθως είναι εφικτό μόνο όταν η σύνδεση στη βάση δεδομένων γίνεται ως sa
ή με έναν ρόλο Διαχειριστή.
Ένα έργο Visual Studio και οδηγίες εγκατάστασης παρέχονται στο αποθετήριο Github αυτό για να διευκολύνουν τη φόρτωση του δυαδικού αρχείου στο MSSQL ως CLR συλλογή, επιτρέποντας έτσι την εκτέλεση αιτημάτων HTTP GET από το εσωτερικό του MSSQL.
Η καρδιά αυτής της λειτουργικότητας είναι ενσωματωμένη στο αρχείο http.cs
, το οποίο χρησιμοποιεί την κλάση WebClient
για να εκτελέσει ένα αίτημα GET και να ανακτήσει περιεχόμενο, όπως φαίνεται παρακάτω:
Πριν εκτελέσετε την εντολή SQL CREATE ASSEMBLY
, συνίσταται να εκτελέσετε το ακόλουθο απόσπασμα SQL για να προσθέσετε το SHA512 hash της συναρμολόγησης στη λίστα των εμπιστευμένων συναρμολογήσεων του διακομιστή (προβλέψιμο μέσω select * from sys.trusted_assemblies;
).
Αφού προστεθεί με επιτυχία η συλλογή και δημιουργηθεί η συνάρτηση, μπορεί να χρησιμοποιηθεί ο παρακάτω κώδικας SQL για να πραγματοποιηθούν αιτήσεις HTTP:
Γρήγορη Εκμετάλλευση: Ανάκτηση Περιεχομένου Ολόκληρου Πίνακα με Μία Ερώτηση
Μια συνοπτική μέθοδος για την ανάκτηση του πλήρους περιεχομένου ενός πίνακα με μία ερώτηση περιλαμβάνει τη χρήση της δήλωσης FOR JSON
. Αυτή η προσέγγιση είναι πιο συνοπτική από τη χρήση της δήλωσης FOR XML
, η οποία απαιτεί ένα συγκεκριμένο mode όπως το "raw". Η δήλωση FOR JSON
προτιμάται για τη συντομία της.
Παρακάτω παρουσιάζεται πώς να ανακτήσετε το σχήμα, τους πίνακες και τις στήλες από την τρέχουσα βάση δεδομένων:
1' AND 1=(SELECT CONCAT_WS(0x3a, table_schema, table_name, column_name) FROM information_schema.columns FOR JSON AUTO)--
Retrieving the Current Query
For users granted the VIEW SERVER STATE
permission on the server, it's possible to see all executing sessions on the SQL Server instance. However, without this permission, users can only view their current session. The currently executing SQL query can be retrieved by accessing sys.dm_exec_requests and sys.dm_exec_sql_text:
To check if you have the VIEW SERVER STATE permission, the following query can be used:
MSSQL Injection
Εισαγωγή
Η εισαγωγή SQL (Structured Query Language) είναι μια ευρέως γνωστή επίθεση που συμβαίνει όταν ο εισαγωγέας δεδομένων δεν επικυρώνει σωστά τις εισαγωγές του χρήστη και επιτρέπει στον επιτιθέμενο να εκτελέσει κακόβουλες SQL εντολές. Αυτό μπορεί να οδηγήσει σε αποκάλυψη ευαίσθητων πληροφοριών, τροποποίηση βάσης δεδομένων ή ακόμη και πλήρη παράκαμψη της εφαρμογής.
Επίθεση MSSQL Injection
Η επίθεση MSSQL Injection συμβαίνει όταν ο επιτιθέμενος εκμεταλλεύεται μια ευπάθεια σε μια εφαρμογή που χρησιμοποιεί τη Microsoft SQL Server ως βάση δεδομένων. Ο επιτιθέμενος εισάγει κακόβουλο SQL κώδικα μέσω των εισαγωγικών πεδίων της εφαρμογής, με σκοπό να εκτελέσει εντολές που δεν έχουν εξουσιοδοτηθεί.
Ένα παράδειγμα επίθεσης MSSQL Injection είναι η παρακάτω URL:
Σε αυτό το παράδειγμα, ο επιτιθέμενος προσπαθεί να εκτελέσει μια εντολή UNION SELECT για να ανακτήσει την έκδοση της βάσης δεδομένων. Ο κακόβουλος κώδικας εισάγεται μέσω της παραμέτρου "id" και το "--" χρησιμοποιείται για να αγνοηθεί ο υπόλοιπος κώδικας της εφαρμογής.
Προστασία από MSSQL Injection
Για να προστατευτείτε από επιθέσεις MSSQL Injection, πρέπει να εφαρμόσετε τις εξής προφυλάξεις:
Χρησιμοποιήστε παραμετροποίηση ερωτημάτων (parameterized queries) ή προετοιμασμένες δηλώσεις (prepared statements) για την εκτέλεση SQL ερωτημάτων.
Επικυρώστε και φιλτράρετε τις εισαγωγές του χρήστη πριν τις χρησιμοποιήσετε σε SQL ερωτήματα.
Χρησιμοποιήστε την αρχή της αρχής του λιγότερου προνομίου (principle of least privilege) για τα δικαιώματα πρόσβασης στη βάση δεδομένων.
Ενημερώστε την εφαρμογή και το λογισμικό της βάσης δεδομένων σας με τις τελευταίες ενημερώσεις και διορθώσεις ασφαλείας.
Ακολουθώντας αυτές τις προφυλάξεις, μπορείτε να μειώσετε σημαντικά τον κίνδυνο επίθεσης MSSQL Injection στην εφαρμογή σας.
MSSQL Injection
Union-Based SQL Injection
Basic Union-Based SQL Injection
The basic union-based SQL injection technique can be used to extract information from a vulnerable MSSQL database. By injecting a UNION SELECT statement into the vulnerable parameter, it is possible to retrieve data from other database tables.
The following are examples of union-based SQL injection payloads:
To perform a union-based SQL injection attack, the injection point must be identified and the number of columns in the SELECT statement must be determined. By using the UNION SELECT
statement, it is possible to retrieve data from other tables in the database.
Greek Translation
MSSQL Εισαγωγή
Εισαγωγή με βάση την Ένωση SQL
Βασική Εισαγωγή με βάση την Ένωση SQL
Η βασική τεχνική εισαγωγής με βάση την Ένωση SQL μπορεί να χρησιμοποιηθεί για την εξαγωγή πληροφοριών από μια ευπαθή βάση δεδομένων MSSQL. Με την εισαγωγή μιας δήλωσης UNION SELECT στην ευπαθή παράμετρο, είναι δυνατή η ανάκτηση δεδομένων από άλλους πίνακες της βάσης δεδομένων.
Τα παρακάτω είναι παραδείγματα φορτίων εισαγωγής με βάση την Ένωση SQL:
Για να πραγματοποιηθεί μια επίθεση εισαγωγής με βάση την Ένωση SQL, πρέπει να εντοπιστεί το σημείο εισαγωγής και να προσδιοριστεί ο αριθμός των στηλών στη δήλωση SELECT. Χρησιμοποιώντας τη δήλωση UNION SELECT
, είναι δυνατή η ανάκτηση δεδομένων από άλλους πίνακες της βάσης δεδομένων.
MSSQL Injection
Εισαγωγή
Η εισαγωγή SQL (Structured Query Language) είναι μια ευρέως γνωστή επίθεση που στοχεύει σε ευπαθείς εφαρμογές που χρησιμοποιούν βάσεις δεδομένων MSSQL. Αυτή η επίθεση επιτρέπει στον εισβολέα να εκτελέσει κακόβουλες SQL εντολές στη βάση δεδομένων, παρακάμπτοντας την αυθεντικοποίηση και αποκτώντας μη εξουσιοδοτημένη πρόσβαση σε ευαίσθητες πληροφορίες.
Εκμετάλλευση MSSQL Injection
Για να εκμεταλλευτείτε μια ευπάθεια MSSQL Injection, μπορείτε να χρησιμοποιήσετε την εξής μορφή επίθεσης:
Σε αυτό το παράδειγμα, η επίθεση εκτελεί μια εντολή UNION SELECT για να ανακτήσει την έκδοση της MSSQL βάσης δεδομένων. Η εντολή UNION SELECT συνδυάζει τα αποτελέσματα δύο ερωτημάτων SQL σε ένα αποτέλεσμα. Στην περίπτωση αυτή, το πρώτο ερώτημα επιστρέφει NULL, η δεύτερη επιστρέφει την έκδοση της MSSQL και το τρίτο επιστρέφει ξανά NULL. Το from.users
χρησιμοποιείται για να προσπελάσει τον πίνακα "users" στη βάση δεδομένων.
Με αυτόν τον τρόπο, ο εισβολέας μπορεί να ανακτήσει πληροφορίες όπως ονόματα χρηστών, κωδικούς πρόσβασης και άλλα ευαίσθητα δεδομένα από τη βάση δεδομένων MSSQL.
Προστασία από MSSQL Injection
Για να προστατευτείτε από επιθέσεις MSSQL Injection, πρέπει να εφαρμόσετε τις εξής προφυλάξεις:
Χρησιμοποιήστε παραμετροποιημένα ερωτήματα SQL για να αποτρέψετε την εκτέλεση κακόβουλων εντολών.
Επιβεβαιώστε την είσοδο του χρήστη πριν την εκτέλεση εντολών SQL.
Περιορίστε τα δικαιώματα πρόσβασης του χρήστη στη βάση δεδομένων, προσδιορίζοντας αυστηρά τα προνόμια που χρειάζεται για την εφαρμογή.
Ενημερώστε την MSSQL βάση δεδομένων σας με τις τελευταίες ενημερώσεις και διορθώσεις ασφαλείας.
Ακολουθώντας αυτές τις βασικές προφυλάξεις, μπορείτε να μειώσετε τον κίνδυνο επιθέσεων MSSQL Injection και να προστατεύσετε την εφαρμογή σας από παραβιάσεις ασφαλείας.
MSSQL Injection
Εισαγωγή
Η εισαγωγή SQL (Structured Query Language) είναι μια ευρέως γνωστή επίθεση που στοχεύει στην εκμετάλλευση των ευπαθειών των εφαρμογών που χρησιμοποιούν βάσεις δεδομένων MSSQL. Με τη χρήση αυτής της επίθεσης, ο εισβολέας μπορεί να εκτελέσει κακόβουλες εντολές SQL στη βάση δεδομένων, προκαλώντας ποικίλες επιπτώσεις, όπως αποκάλυψη ευαίσθητων πληροφοριών, τροποποίηση δεδομένων ή ακόμη και πλήρης κατάληψη του συστήματος.
Εκμετάλλευση MSSQL Injection
Για να εκμεταλλευτείτε μια ευπάθεια MSSQL Injection, πρέπει να εντοπίσετε ένα σημείο εισαγωγής SQL στην εφαρμογή. Ένα από τα συνηθέστερα σημεία εισαγωγής είναι οι παράμετροι των URL. Ας υποθέσουμε ότι έχουμε τον παρακάτω κωδικό URL:
Σε αυτό το παράδειγμα, η παράμετρος id
φαίνεται να είναι ευάλωτη σε επίθεση MSSQL Injection. Ο εισβολέας μπορεί να εκμεταλλευτεί αυτήν την ευπάθεια για να εκτελέσει κακόβουλες εντολές SQL.
Εκτέλεση Κακόβουλων Εντολών SQL
Για να εκτελέσετε κακόβουλες εντολές SQL, πρέπει να εισαγάγετε τον κατάλληλο κώδικα SQL στην παράμετρο id
. Στο παράδειγμα μας, ο εισβολέας χρησιμοποιεί την εντολή UNION SELECT
για να ανακτήσει πληροφορίες από τον πίνακα users
. Η εντολή @@version
επιστρέφει την έκδοση της βάσης δεδομένων MSSQL.
Ο κατάλληλος κώδικας SQL για το παράδειγμα μας είναι ο εξής:
Μετά την εκτέλεση της επίθεσης, ο εισβολέας θα λάβει την έκδοση της βάσης δεδομένων MSSQL από την απόκριση του διακομιστή.
Προστασία από MSSQL Injection
Για να προστατευτείτε από επιθέσεις MSSQL Injection, πρέπει να εφαρμόσετε τις παρακάτω προφυλάξεις:
Χρησιμοποιήστε παραμετροποίηση ερωτημάτων (query parameterization) για να αποτρέψετε την εκτέλεση κακόβουλων εντολών SQL.
Επιβεβαιώστε την είσοδο του χρήστη και εφαρμόστε αποτρεπτικούς ελέγχους για να αποφύγετε την εισαγωγή κακόβουλου κώδικα SQL.
Ενημερώστε την MSSQL βάση δεδομένων σας στην τελευταία έκδοση και εφαρμόστε τις απαραίτητες ενημερώσεις ασφαλείας.
Ακολουθώντας αυτές τις προφυλάξεις, μπορείτε να μειώσετε σημαντικά τον κίνδυνο επίθεσης MSSQL Injection στην εφαρμογή σας.
Προσθήκη άχρηστης exec() στο τέλος και καθιστώντας το WAF να πιστέψει ότι αυτό δεν είναι έγκυρο ερώτημα
admina'union select 1,'admin','testtest123'exec('select 1')--
Αυτό θα γίνει:
SELECT id, username, password FROM users WHERE username = 'admina'union select 1,'admin','testtest123' exec('select 1')--'
Χρήση περίεργα κατασκευασμένων ερωτημάτων
admin'exec('update[users]set[password]=''a''')--
Αυτό θα γίνει:
SELECT id, username, password FROM users WHERE username = 'admin' exec('update[users]set[password]=''a''')--'
Ή ενεργοποίηση του xp_cmdshell
admin'exec('sp_configure''show advanced option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
Αυτό θα γίνει:
select * from users where username = ' admin' exec('sp_configure''show advanced option'',''1''reconfigure') exec('sp_configure''xp_cmdshell'',''1''reconfigure')--'
Last updated