Iniezione SQL con nomi di colonne filtrati

0

Ho la seguente query MySQL suscettibile di un'iniezione e ho bisogno di estrarre la password di un determinato utente:

SELECT * FROM users WHERE login='$login' and password='$password'

Tuttavia dall'iniezione, posso vedere che prima che la richiesta venga pubblicata, i campi $login e $password vengono filtrati. In particolare, gli script PHP rilevano "OR" utilizzato nella seguente iniezione:

login => ' || ''='
password => ' || login='bobby' && passwORd LIKE 'A%'
SELECT * FROM users WHERE login='' || ''='' && password='' || login='bobby' && passwORd LIKE 'A%''

Viene rilevato "OR" visualizzato in $password e l'iniezione fallisce.

C'è un modo noto per aggirare questo?

    
posta Hans F. 24.06.2018 - 12:38
fonte

3 risposte

2

Non è necessario iniettare nella variabile $password . Solo commenta il resto della query con la variabile $login . Impostando $login su bobby' -- otterrai questa query:

SELECT * FROM users WHERE login='bobby' -- ' and password='foobar'
    
risposta data 24.06.2018 - 18:12
fonte
0

Certo. Si può usare un altro SELECT come password. È molto incline all'errore usare il filtro.

Utilizza invece istruzione preparata . Quindi non ti interessa affatto ciò che l'utente ha inserito.

    
risposta data 24.06.2018 - 18:18
fonte
0

Exploit

Puoi commentare la variabile $password come ha detto anders.

Se vuoi scoprire le password usa sqlmap per scaricare il database. Fare questo manuale richiede molto tempo.

Fix

Per correggere SQL-Injection usa semplicemente una dichiarazione preparata.

Il secondo punto debole è che le password sono archiviate in testo normale. Dovresti memorizzarli come hash della password.

    
risposta data 24.06.2018 - 23:08
fonte

Leggi altre domande sui tag