MSSQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
È possibile enumerare gli utenti di dominio tramite SQL injection all'interno di un server MSSQL utilizzando le seguenti funzioni MSSQL:
SELECT DEFAULT_DOMAIN()
: Ottieni il nome del dominio corrente.
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Se conosci il nome del dominio (DOMAIN in questo esempio), questa funzione restituirà il SID dell'utente Administrator in formato esadecimale. Questo apparirà come 0x01050000000[...]0000f401
, nota come gli ultimi 4 byte siano il numero 500 in formato big endian, che è il ID comune dell'utente administrator.
Questa funzione ti permetterà di conoscere l'ID del dominio (tutti i byte tranne gli ultimi 4).
SUSER_SNAME(0x01050000000[...]0000e803)
: Questa funzione restituirà il nome utente dell'ID indicato (se presente), in questo caso 0000e803 in big endian == 1000 (di solito questo è l'ID del primo ID utente regolare creato). Poi puoi immaginare di poter forzare gli ID utente da 1000 a 2000 e probabilmente ottenere tutti i nomi utente degli utenti del dominio. Ad esempio, utilizzando una funzione come la seguente:
Le iniezioni SQL basate su errori somigliano tipicamente a costruzioni come +AND+1=@@version--
e varianti basate sull'operatore «OR». Le query contenenti tali espressioni sono solitamente bloccate dai WAF. Come bypass, concatenare una stringa utilizzando il carattere %2b con il risultato di chiamate a funzioni specifiche che attivano un errore di conversione del tipo di dato sui dati ricercati.
Alcuni esempi di tali funzioni:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
Esempio di utilizzo della funzione USER_NAME()
:
Questi trucchi SSRF sono stati presi da qui
fn_xe_file_target_read_file
Richiede il permesso VIEW SERVER STATE
sul server.
fn_get_audit_file
Richiede il permesso CONTROL SERVER
.
fn_trace_gettabe
Richiede il permesso CONTROL SERVER
.
xp_dirtree
, xp_fileexists
, xp_subdirs
Le stored procedure come xp_dirtree
, sebbene non ufficialmente documentate da Microsoft, sono state descritte da altri online a causa della loro utilità nelle operazioni di rete all'interno di MSSQL. Queste procedure sono spesso utilizzate nell'Out of Band Data exfiltration, come mostrato in vari esempi e post.
La stored procedure xp_dirtree
, ad esempio, viene utilizzata per effettuare richieste di rete, ma è limitata solo alla porta TCP 445. Il numero di porta non è modificabile, ma consente di leggere dalle condivisioni di rete. L'uso è dimostrato nello script SQL qui sotto:
È importante notare che questo metodo potrebbe non funzionare su tutte le configurazioni di sistema, come su Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
in esecuzione su un Windows Server 2016 Datacenter
con impostazioni predefinite.
Inoltre, ci sono procedure memorizzate alternative come master..xp_fileexist
e xp_subdirs
che possono ottenere risultati simili. Ulteriori dettagli su xp_fileexist
possono essere trovati in questo articolo di TechNet.
xp_cmdshell
Ovviamente potresti anche usare xp_cmdshell
per eseguire qualcosa che attiva un SSRF. Per ulteriori informazioni leggi la sezione pertinente nella pagina:
Creare una CLR UDF (Common Language Runtime User Defined Function), che è codice scritto in qualsiasi linguaggio .NET e compilato in un DLL, da caricare all'interno di MSSQL per eseguire funzioni personalizzate, è un processo che richiede accesso dbo
. Ciò significa che di solito è fattibile solo quando la connessione al database viene effettuata come sa
o con un ruolo di Amministratore.
Un progetto di Visual Studio e istruzioni per l'installazione sono forniti in questo repository Github per facilitare il caricamento del binario in MSSQL come assembly CLR, abilitando così l'esecuzione di richieste HTTP GET dall'interno di MSSQL.
Il nucleo di questa funzionalità è racchiuso nel file http.cs
, che utilizza la classe WebClient
per eseguire una richiesta GET e recuperare contenuti come illustrato di seguito:
Prima di eseguire il comando SQL CREATE ASSEMBLY
, è consigliato eseguire il seguente frammento SQL per aggiungere l'hash SHA512 dell'assembly alla lista delle assembly fidate del server (visibile tramite select * from sys.trusted_assemblies;
):
Dopo aver aggiunto con successo l'assembly e creato la funzione, il seguente codice SQL può essere utilizzato per eseguire richieste HTTP:
Un metodo conciso per estrarre il contenuto completo di una tabella in una singola query prevede l'utilizzo della clausola FOR JSON
. Questo approccio è più conciso rispetto all'uso della clausola FOR XML
, che richiede una modalità specifica come "raw". La clausola FOR JSON
è preferita per la sua brevità.
Ecco come recuperare lo schema, le tabelle e le colonne dal database corrente:
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:
Non-standard whitespace characters: %C2%85 или %C2%A0:
Scientific (0e) and hex (0x) notation for obfuscating UNION:
A period instead of a whitespace between FROM and a column name:
\N separator between SELECT and a throwaway column:
According to this blog post it's possible to stack queries in MSSQL without using ";":
So for example, multiple queries such as:
Can be reduced to:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)