- 29 Luglio 2010
- 271
- 0
- Miglior risposta
- 0
Oramai nel web 2.0, vulnerabilità web come le SQL Injection sono molto diffuse e anche i non professionisti possono utilizzarle per attacare un portale.
La SQL Injection colpisce le applicazioni web che si appogiano ad un database del tipo SQL (come MySQL), ed è causata da un mancato controllo sui dati che vengono ricevuti in input, lasciando modo all'attaccante di inserire del codice malevolo (in questo tipologia di attacco si tratta appunto di codice SQL).
Infatti con questa tecnica, è possibile ad esempio autenticarsi come Admin in un form di login, oppure dumpare (copiare e salvare nel proprio pc) interi databases al fine di avere sotto mano tutti gli ID e le Password degli utenti di un sito.
Con gli anni questa tecnica si è sempre più diffusa e migliorata.
Non mi dilungo in spiegazioni basilari sulle SQL Injection perché in questo articolo parleremo di un’evoluzione molto delicata e invasiva di questa tecnica hacker: la Remote Command Execution (più precisamente, la Remote SQL Command Execution).
Se non foste ancora a conoscenza di come funziona una semplice SQL Injection, vi riporto alla guida base scritta dal mio amico e collega Gold3n, sulle SQL Injections che potete trovare nella sezione Hacking di Higeneration.it
Per seguire l’articolo che segue, vi serviranno delle basi del linguaggio SQL, sapere come funziona un database che usa questo tipo di linguaggio, e conoscere le SQL Injection.
Abbiamo tutti i requisiti? Cominciamo!.
Per prima cosa supponiamo di avere la nostra pagina PHP vulnerabile ad una semplice SQL Injection o ad una complessa Blind SQL Injection.
Chiamiamo la pagina article.php e scriviamo al suo interno queste poche righe:
Vediamo un po' questo codice:
-Avviene la connessione al database con il comando "mysql_connect".
-Viene selezionato il database "articoli" tramite "mysql_select_db".
-Viene eseguita la query all'interno delle parentesi tonde con"mysql_query" e viene messa dentro la variabile $query.
-Vengono presi i risultati della query e messi nella variabile $row tramite "mysql_fetch_row".
Questo è uno script vulnerabile, in quanto non avviene nessun controllo sui dati che entrano in input.
Potremmo provare una SQL Injection, o una Blind SQL Injection.
Ma perchè accontentarci del database, quando potremmo avere l’intero server?
Ebbene sì, prendere il controllo completo del server sfruttando la vulnerabilità SQL è possibile grazie alla Remote SQL Command Execution.
Infatti con questa tecnica è possibile eseguire l’upload di una shell sul server remoto, raggiungibile da browser, in modo da eseguire dei comandi con massimi permessi da remoto.
Vediamo quindi come un hacker può fare ciò.
Per prima cosa, ci serve sapere la rootpath:
La rootpath è la path dove è conservata la nostra pagina article.php .
Ci serve quest’informazione, in modo da sapere dove uppare (caricare) la shell.
E qui che ci viene in aiuto un'altra tecnica, chiamata "Full Path Disclosure".
Grazie a questa tecnica si è in grado di risalire alla rootpath dei webserver, in vari modi:
[1] metodo
Se, come nel nostro caso, abbiamo una variabile $_GET nell'URL, la trasformiamo in un array, mettendoci due parantesi quadre ('[]') prima del segno uguale ('='), in questo modo:
Questa genererà un errore o un warning, come questo
Warning: opendir(Array): failed to open dir: No such file or directory in /htdocs/var/www/cartella/article.php on line 27
fornendoci il full path dove si trova la pagina article.php (in questo caso la full path è "/htdocs/var/www/cartella/article.php").
[2] metodo
Se il sito utilizza le sessioni, con un PHPSESSID, possiamo annullare la sessione con un codice Javascript, in questo modo:
questo genererà un warning di questo tipo:
Warning: session_start() [function.session-start]: The session id contains illegal characters,
valid characters are a-z, A-Z, 0-9 and '-,' in /htdocs/var/www/cartella/article.php on line 52.
[3] metodo
Se la variabile che esegue la query, è una variabile $_GET, possiamo forzarla ad eseguire un errore, che molto spesso contiene la rootpath, in questo modo:
quindi mettendo dopo la variabile id, un'apice (').
Questo genera un errore del tipo:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line xxx
PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /htdocs/var/www/cartella/article.php on line 124
Bene, mettiamo il caso che la rootpath sia "/htdocs/var/www/cartella/article.php".
Esiste in SQL, un comando chiamato "INTO OUTFILE", che salva il risultato di una query su un file nel server remoto.
Ad esempio, la query
salva tutto quello che che è contenuto nella tabella articoli, in un file che si chiamerà pagina.txt
E se il file non fosse un file in formato txt, ma in formato PHP? E se questo file contenesse delle righe di codice PHP?
Se noi al posto del * (valore jolly del SQL che seleaziona ogni informaioni), mettessimo dei caratteri o dei numeri, verrebbero stampati sul file.
Quindi ad esempio se mettiamo
la query stamperà sul file .txt la scritta "3 pagina".
Vediamo nella prossima pagina come creare quindi l'attacco che ci permetterà di avere il completo controllo sul server vittima.
Fonte: Mia.
La SQL Injection colpisce le applicazioni web che si appogiano ad un database del tipo SQL (come MySQL), ed è causata da un mancato controllo sui dati che vengono ricevuti in input, lasciando modo all'attaccante di inserire del codice malevolo (in questo tipologia di attacco si tratta appunto di codice SQL).
Infatti con questa tecnica, è possibile ad esempio autenticarsi come Admin in un form di login, oppure dumpare (copiare e salvare nel proprio pc) interi databases al fine di avere sotto mano tutti gli ID e le Password degli utenti di un sito.
Con gli anni questa tecnica si è sempre più diffusa e migliorata.
Non mi dilungo in spiegazioni basilari sulle SQL Injection perché in questo articolo parleremo di un’evoluzione molto delicata e invasiva di questa tecnica hacker: la Remote Command Execution (più precisamente, la Remote SQL Command Execution).
Se non foste ancora a conoscenza di come funziona una semplice SQL Injection, vi riporto alla guida base scritta dal mio amico e collega Gold3n, sulle SQL Injections che potete trovare nella sezione Hacking di Higeneration.it
Per seguire l’articolo che segue, vi serviranno delle basi del linguaggio SQL, sapere come funziona un database che usa questo tipo di linguaggio, e conoscere le SQL Injection.
Abbiamo tutti i requisiti? Cominciamo!.
Per prima cosa supponiamo di avere la nostra pagina PHP vulnerabile ad una semplice SQL Injection o ad una complessa Blind SQL Injection.
Chiamiamo la pagina article.php e scriviamo al suo interno queste poche righe:
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Vediamo un po' questo codice:
-Avviene la connessione al database con il comando "mysql_connect".
-Viene selezionato il database "articoli" tramite "mysql_select_db".
-Viene eseguita la query all'interno delle parentesi tonde con"mysql_query" e viene messa dentro la variabile $query.
-Vengono presi i risultati della query e messi nella variabile $row tramite "mysql_fetch_row".
Questo è uno script vulnerabile, in quanto non avviene nessun controllo sui dati che entrano in input.
Potremmo provare una SQL Injection, o una Blind SQL Injection.
Ma perchè accontentarci del database, quando potremmo avere l’intero server?
Ebbene sì, prendere il controllo completo del server sfruttando la vulnerabilità SQL è possibile grazie alla Remote SQL Command Execution.
Infatti con questa tecnica è possibile eseguire l’upload di una shell sul server remoto, raggiungibile da browser, in modo da eseguire dei comandi con massimi permessi da remoto.
Vediamo quindi come un hacker può fare ciò.
Per prima cosa, ci serve sapere la rootpath:
La rootpath è la path dove è conservata la nostra pagina article.php .
Ci serve quest’informazione, in modo da sapere dove uppare (caricare) la shell.
E qui che ci viene in aiuto un'altra tecnica, chiamata "Full Path Disclosure".
Grazie a questa tecnica si è in grado di risalire alla rootpath dei webserver, in vari modi:
[1] metodo
Se, come nel nostro caso, abbiamo una variabile $_GET nell'URL, la trasformiamo in un array, mettendoci due parantesi quadre ('[]') prima del segno uguale ('='), in questo modo:
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Questa genererà un errore o un warning, come questo
Warning: opendir(Array): failed to open dir: No such file or directory in /htdocs/var/www/cartella/article.php on line 27
fornendoci il full path dove si trova la pagina article.php (in questo caso la full path è "/htdocs/var/www/cartella/article.php").
[2] metodo
Se il sito utilizza le sessioni, con un PHPSESSID, possiamo annullare la sessione con un codice Javascript, in questo modo:
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
questo genererà un warning di questo tipo:
Warning: session_start() [function.session-start]: The session id contains illegal characters,
valid characters are a-z, A-Z, 0-9 and '-,' in /htdocs/var/www/cartella/article.php on line 52.
[3] metodo
Se la variabile che esegue la query, è una variabile $_GET, possiamo forzarla ad eseguire un errore, che molto spesso contiene la rootpath, in questo modo:
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
quindi mettendo dopo la variabile id, un'apice (').
Questo genera un errore del tipo:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'' at line xxx
PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /htdocs/var/www/cartella/article.php on line 124
Bene, mettiamo il caso che la rootpath sia "/htdocs/var/www/cartella/article.php".
Esiste in SQL, un comando chiamato "INTO OUTFILE", che salva il risultato di una query su un file nel server remoto.
Ad esempio, la query
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
salva tutto quello che che è contenuto nella tabella articoli, in un file che si chiamerà pagina.txt
E se il file non fosse un file in formato txt, ma in formato PHP? E se questo file contenesse delle righe di codice PHP?
Se noi al posto del * (valore jolly del SQL che seleaziona ogni informaioni), mettessimo dei caratteri o dei numeri, verrebbero stampati sul file.
Quindi ad esempio se mettiamo
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
la query stamperà sul file .txt la scritta "3 pagina".
Vediamo nella prossima pagina come creare quindi l'attacco che ci permetterà di avere il completo controllo sul server vittima.
Fonte: Mia.