Le query SQL che utilizzano le Iniezioni SQL non funzionano come penso dovrebbero

1

Sto cercando di conoscere le Iniezioni SQL. Ho creato un modulo di accesso usando PHP (sono abbastanza nuovo per PHP) come linguaggio di scripting backend e MySQL come DBMS. L'ultimo giorno ho fatto una domanda sulle iniezioni SQL: SQL Injection non funziona quando penso che dovrebbe , e mi ha risolto alcuni dubbi, ma ora ho dei dubbi nuovi:

Quello che sto cercando di ottenere è di bypassare il modulo di accesso che ho creato, utilizzando le Iniezioni SQL. Questo è lo script per verificare se il nome utente e la password immessi appartengono a un utente già registrato (memorizzato nel DB).

$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);

echo "Counter: " . $counter . '<br>';
echo "Query: " . $query;
if($counter == 1)//Correct Login

Devo dire che sono davvero confuso riguardo al risultato ottenuto durante l'esecuzione delle query. Ho creato i seguenti 3 esempi in cui in ognuno di essi inserisco diversi valori di nome utente e password nel login forma e il vero è che non capisco il risultato ottenuto da nessuno degli esempi, penso che i risultati dovrebbero essere diversi.

1 Esempio: ([email protected] è un'e-mail esistente nella tabella Utente)

Input
Username: [email protected]' OR '1'='1/*
Password: */

Output
Counter: 1
Query: SELECT * FROM User WHERE EMAIL='[email protected]' OR '1'='1/*' AND PASSWORD='*/'

Il valore della variabile contatore $ non dovrebbe essere 30 (30 è il numero di utenti registrati nella tabella User)?

Quando eseguo la seguente query nella CLI MySQL:

SELECT * FROM User WHERE EMAIL='[email protected]' OR '1'='1'

Ottengo 30 righe, quindi perché il valore del contatore $ è 1 e non 30?

2 Esempio: (xxx NON è un'e-mail esistente nella tabella Utente)

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

Output
Counter: 0
Query: SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1/*' AND PASSWORD='*/'

Il valore della variabile contatore $ non dovrebbe essere 30 (30 è il numero di utenti registrati nella tabella User)?

Quando eseguo la seguente query nella CLI MySQL:

SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1'

Ottengo 30 righe, quindi perché il valore del contatore $ è 0 e non 30?

3 Esempio: ([email protected] è un'e-mail esistente nella tabella Utente)

Input
Username: [email protected]/*
Password: */

Output
Counter: 0
Query: SELECT * FROM User WHERE EMAIL='[email protected]/*' AND PASSWORD='*/'

Il valore della variabile contatore $ non dovrebbe essere 1?

Quando eseguo la seguente query nella CLI MySQL:

SELECT * FROM User WHERE EMAIL='xxx' OR '1'='1'

Ottengo 1 riga, quindi perché il valore del contatore $ è 0 e non 1?

    
posta v8rs 08.07.2016 - 17:06
fonte

1 risposta

3

Esempio 1 & 2

Questo perché la tua query sta applicando questa clausola:

'1'='1/*'

Se hai un carattere di commento all'interno delle tue virgolette il commento non viene rispettato dal parser di query, dovresti prima uscire dal contesto citato.

1 viene restituito come conteggio perché è il numero di utenti che hanno quell'indirizzo email.

Prova invece ad esempio 1 (la stessa tecnica si applica alle altre):

Username: [email protected]' OR '1'='1'; --
Password: Whatever

Questo dovrebbe rendere la query

SELECT * FROM User WHERE EMAIL='[email protected]' OR '1'='1'; -- ' AND PASSWORD='Whatever'

Esempio 3

Suppongo che tu non abbia un utente con l'indirizzo email [email protected]/* impostato? Di nuovo, a causa delle virgolette, interrogherà [email protected]/* e non [email protected] .

    
risposta data 08.07.2016 - 17:54
fonte

Leggi altre domande sui tag