2012-01-29 22 views
10

Sto lavorando su un sito che è stato violato tramite SQL Injection (a prima vista solo le voci di database sono corrotte con lo scripting cross-site) la potenziale vulnerabilità che ho trovato dopo aver visto il codice è che c'è un sacco di chiamate mysql_query i cui ingressi non sono affatto sfuggiti.SQL Injection tramite mysql_query

Il buon vecchio:

$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'"; /*HACK HERE*/ 
mysql_query($query, $connection); 

Tuttavia non riesco a trovare come si possa fare qualcosa di fresco da che la vulnerabilità di iniezione (da freddo intendo qualcosa di simile a un inserimento o un aggiornamento). Ho provato a creare una dichiarazione come questa:

SELECT * FROM mytable where name LIKE '%' AND WHERE id IN (INSERT INTO secondtable (id,description) VALUES (15, 'Fifteenth description');--%' 

Nessun successo. Immagino che l'INSERT non abbia nulla da fare qui.

In questo momento sto sfuggendo a tutti gli input dell'utente nel codice, ma non ho capito come gli hacker hanno penetrato questo sito, quindi non sono sicuro al 100% che la mia correzione faccia il lavoro. Qualche suggerimento geniale?

Grazie

+1

Immagino che questo sito non sia il posto giusto per chiedere come farlo :) – Mike

+0

Assicurarsi che il 'nome' quando concatenato con le stringhe di base formi sql valido. – EBarr

+0

Un utente malintenzionato potrebbe facilmente 'UNIRE' /' UNIONE' un'altra tabella e ottenere le credenziali di accesso dell'amministratore. Quindi, con privilegi elevati poteva fare più cose cattive, ad es. caricare una shell PHP per eseguire comandi arbitrari sul server – knittl

risposta

-3
$query = "SELECT * FROM mytable where name LIKE '%".$_GET['name']."%'"; 

$_GET['name']="'; DROP TABLE mytable; -- "; 

così

$query = "SELECT * FROM mytable where name LIKE '%'; DROP TABLE mytable; -- %'"; 
+0

Qualche altra elaborazione perché questo è sbagliato? –

+1

sì, guarda i commenti qui sotto xbonez 'answer – joni

+0

mysql_query richiede solo una query, ma grazie – AsTeR

0

adesso, è stato un po 'che ha fatto alcun php, ma nella maggior parte librerie generali di accesso ai dati hanno una sorta di SQL con parametri per ridurre il rischio. Un rapido google si avvicinò con questo per php: http://php.net/manual/en/pdo.prepared-statements.php

L'altro poster ha già descritto come eseguire una iniezione sql, quindi non entrerò in quello.

+0

"quindi non sono sicuro al 100% che la mia correzione farà il lavoro. - Ho suggerito una correzione alternativa – Daniel

+0

questa correzione della stessa natura con una usata. ma l'op ha chiesto la diversa natura. semplicemente non capisco la domanda –

+0

IMO è abbastanza una grande differenza tra una soluzione laminata a casa contro una lib provata e testata – Daniel

1

Possibile scenario 1
Le password/hashing deboli consentono a un utente malintenzionato di selezionare la password dell'amministratore.
Sarebbe opportuno cambiare tutte le password degli amministratori.

+0

Non c'è modo di fare un INSERT o UPDATE diretto? – AsTeR

+2

per quanto ne so - no. –

2

Perché mysql_query non supporta più query, quindi qualsiasi iniezione che sta facendo come '; DROP TABLE mytable; -- non avrà esito positivo.

Tuttavia, l'utente malintenzionato può combinare con un'altra istruzione select per selezionare le altre informazioni come le informazioni sulla password.

0

Sono abbastanza sicuro che un hacker sarebbe in grado di modificare facilmente la query. Anche se mysql_query() non supporta più query, ci sono modi per aggirarle. potresti semplicemente usare una dichiarazione IF mysql aggiunta alla fine e, naturalmente, che eseguirà una query completamente nuova.

+0

grazie per il vostro impegno, la domanda era "quali sono i modi", non "c'è un modo". –

3

A seconda della versione di mysql che si sta utilizzando e dell'impostazione della connessione, mysql_query può consentire more than one statement.

Si dovrebbe osservare come viene creata la connessione e per qualsiasi utilizzo di mysql_set_server_option.

Problemi correlati