SQL Injection non funziona quando penso che dovrebbe

1

Sto cercando di conoscere PHP e SQL Injection, quindi ho creato un modulo di login in cui gli utenti introducono il loro nome utente e password e fanno clic sul pulsante Login. Più tardi nel server ottengo i parametri passati usando $ _POST variabile globale.

Questo è il codice utilizzato per verificare se le credenziali dell'utente sono valide:

$email = $_POST['u_email'];
$password = $_POST['u_password'];

$query = "SELECT * FROM User WHERE EMAIL='$email' AND PASSWORD='$password'";
$result = $mysqli->query($query);
$counter = mysqli_num_rows($result);

if($counter == 1)//Correct Login

Il problema è che penso che se un utente immette il seguente testo nei campi username e password, l'accesso dovrebbe essere eseguito (anche se non sono valori validi perché non esistono nel DB).

Username: xxx' OR '1'='1/*
Password: */

Penso di sì perché sarebbe tradotto in:

$query = "SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1/*' AND PASSWORD='*/'";

In altre parole:

$query = "SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1'";

Ma SQL Injection non funziona, perché?

Il mio DBMS è MySQL.

    
posta v8rs 07.07.2016 - 19:12
fonte

2 risposte

6

Non funziona per questo:

if($counter == 1)

Il% co_de iniettato è valido per ogni singola riga, e se ci sono più righe nella tabella, quel controllo OR '1'='1' fallirà.

Per ovviare a questo, potresti fare qualcosa di simile (se ricordo correttamente il mio SQL), con qualsiasi cosa in $counter e questo in $email :

' UNION SELECT * FROM User LIMIT 1 --

Nulla verrà restituito dalla prima parte, ma la seconda metà iniettata di $password otterrà una singola riga arbitraria.

    
risposta data 07.07.2016 - 19:25
fonte
2

Un modo più semplice e facile per commentare l'iniezione SQL è usare -- perché non devi chiudere il commento. Richiede anche solo 1 input anziché 2.

In questo caso, una semplice iniezione sarà simile a:

Username : xxx' OR 1=1;--
Password : not that important

La query SQL sarà: %codice%. Senza il commento: SELECT * FROM User WHERE EMAIL='' OR 1=1;-- ' AND PASSWORD='not that important'

    
risposta data 07.07.2016 - 19:24
fonte

Leggi altre domande sui tag