Non riesco a capire i problemi di sintassi sql che si verificano durante l'avvio di un attacco di iniezione, quindi qualsiasi aiuto che li spiega è molto apprezzato. Ho uno script di accesso php di destinazione che accetta una combinazione di nome utente/password e quindi esegue molto semplicemente.sql injection sintassi booleana
Select * FROM users WHERE username='$username' AND password='$password'
Quando fornisco la base
$username = ' OR '1=1
$password = ' OR '1=1
il sistema mi accede come amministratore, perché restituisce
Select * FROM users WHERE username='' OR '1=1' AND password='' OR '1=1'
e ottiene un match per la prima voce utente nel database (admin). Ora sto cercando di ottenere lo script per collegarmi come utente arbitrario chiamato adrian. Il mio pensiero è stato quello di fornire
$username = adrian
$password = ' OR (1=1 AND username='adrian') --
che ho pensato sarebbe valutato come
Select * FROM users WHERE username='adrian' AND password='' OR (1=1 AND username='adrian') -- '
ho pensato che l'ordine booleano delle operazioni è stato lasciato a destra quando non parentesi sono inclusi:
Select * FROM users WHERE [[[username='adrian'] AND password=''] OR (1=1 AND username='adrian')] -- '
ma questo non mi sta registrando come nessuno (e non mi dà errori). Anche se gli AND vengono valutati per ultimi, questa affermazione sarà valutata a
Select * FROM users WHERE [username='adrian'] AND [password='' OR (1=1 AND username='adrian')]
Quale sarebbe ancora valido per l'utente adrian. Nel frattempo
$username = adrian
$password = 'or(1=1 and username='adrian') --
mi sta accedendo come adrian correttamente, che restituisce
Select * FROM users WHERE username='adrian' AND password=''or(1=1 AND username='adrian') -- '
Allora perché il mio approccio con la "O" non funziona mentre il mio approccio con la 'o' funziona?
RISOLTO: Grazie per la guida. Capisco sql meglio ora, ma il mio vero problema era che il riempimento automatico stava rimuovendo spazi dopo il "-" Devo aver incasinato la prima volta e poi stupidamente invocato riempimento automatico da quel momento in poi
Mi dispiace ... ottenuto ha riaperto i battenti. – Orangepill
La precedenza dell'operatore è: '=', quindi 'AND', quindi' OR'. – Gumbo
Ecco un consiglio: se la tua piattaforma (in questo caso [PHP] (https://secure.php.net/manual/en/pdo.prepared-statements.php)) supporta le istruzioni preparate e il binding di parametri, dovrebbero usarli Questo generalmente gestisce tutti i problemi che ti sfuggono. – Powerlord