Quali sono i pericoli di SQL injection con php?

2

Ho creato una build di app web SQL-iniettabile con PHP per ottenere una migliore comprensione di ciò che sta accadendo e automatizzato tutto con sqlmap.

Il codice pertinente è il seguente:

mysqli_query($conn, SELECT trans FROM 'dictionary' WHERE 'word' LIKE '$unfiltered_variable');

Ho giocato con SQLMap e l'unica cosa che sono riuscito a ottenere era il contenuto del dizionario (dato che si trattava di un sito web del dizionario) ma non potevo fare nient'altro visto che la funzione sqli_query() di PHP non supporta le query impilate .

Quindi domande:

1) C'è qualcosa che può essere sfruttato per fare qualcosa di diverso da ottenere il contenuto del database?

2) Se il contenuto del database non è destinato a essere tenuto segreto, c'è qualche punto nel garantire questa vulnerabilità?

    
posta Slava Knyazev 10.07.2015 - 22:34
fonte

2 risposte

4

Rimuoviamo completamente PHP dall'equazione per un momento.

L'iniezione SQL consente a un utente malintenzionato di manipolare la query SQL per essere ciò che desidera che la query venga eseguita. Questo può essere il dumping del contenuto del database, la modifica dei dati e persino l'esecuzione del codice.

L'esempio che hai fornito è effettivamente vulnerabile all'iniezione SQL. Ai fini della dimostrazione, permettimi di semplificarlo un po ':

mysqli_query($conn, "SELECT trans FROM dictionary WHERE word = '$search'");

Dato un valore di security , la query risultante apparirebbe così:

SELECT trans FROM dictionary WHERE word = 'security';

Questo è innocente e normale. Tuttavia, dato quanto segue, un utente malintenzionato può ottenere la versione di MySQL in esecuzione:

' @@version -- -

Questo causerebbe alla query il risultato di quanto segue:

SELECT trans FROM dictionary WHERE word = '' @@version -- - ';

In definitiva, a seconda delle autorizzazioni e della configurazione, un utente malintenzionato può passare da un database all'altro nel server del database, leggere i file dal filesystem o eseguire il codice. Ecco un esempio di come un utente malintenzionato può leggere file da un sistema operativo basato su Linux:

' LOAD_FILE('/etc/passwd') -- -'

Ciò quindi comporterà la seguente query:

SELECT trans FROM dictionary WHERE word = '' LOAD_FILE('/etc/passwd') -- -'

Ci sono un paio di cose da tenere a mente a questo punto:

  • Non tutte le vulnerabilità di SQL injection sono uguali a
  • Le tecniche per leggere i file, eseguire codice e eseguire il dump dei database varieranno ampiamente dalla lingua, dal server database di back-end e dalle circostanze che circondano la vulnerabilità stessa

Indipendentemente da ciò, raccomanderei vivamente che una vulnerabilità di SQL injection venga corretta mediante la parametrizzazione o la whitelist di input dell'utente in base alle esigenze della funzionalità in questione.

Ho iniziato con la rimozione di PHP dalla discussione perché l'iniezione SQL non è dipendente dalla lingua e dal framework: influisce su qualsiasi linguaggio che consenta la connettività del database. Indipendentemente dalla lingua, l'input dell'utente deve essere trattato con sospetto e gestito in modo appropriato.

    
risposta data 11.07.2015 - 03:37
fonte
1

Se sei limitato alla dichiarazione corrente, lo sfruttamento è limitato anche alle funzionalità del tipo di istruzione corrente .

In generale, una dichiarazione di SELECT consente:

  • lettura dei dati da tabelle e database accessibili
  • lettura dei file utilizzando la funzione LOAD_FILE
  • scrittura di file utilizzando la sintassi INTO …
  • esecuzione di stored procedure

Naturalmente, il modo in cui il server web elabora la query SQL, le autorizzazioni dell'utente MySQL e il punto di iniezione all'interno dell'istruzione possono avere ulteriori limitazioni allo sfruttamento.

Tuttavia, nel tuo caso, potresti provare a trovare la posizione della directory root dei documenti del server web e provare a scrivere una shell PHP su di essa. Ciò consentirebbe l'esecuzione di codice PHP arbitrario e quindi comandi sul server web.

    
risposta data 11.07.2015 - 14:29
fonte

Leggi altre domande sui tag