2015-08-05 20 views
5

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

enter image description here

+2

Mi dispiace ... ottenuto ha riaperto i battenti. – Orangepill

+0

La precedenza dell'operatore è: '=', quindi 'AND', quindi' OR'. – Gumbo

+0

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

risposta

3

L'ordine delle operazioni non è solo da sinistra a destra. In realtà, da sinistra a destra (o precedenza di posizione) è l'ultima cosa considerata quando si valuta un'espressione come questa. Devi capire la priorità dell'operatore, poiché questo è l'aspetto più importante nel determinare il comportamento di tale affermazione. In questo caso AND ha precedenza superiore a OR.

Ciò significa che la sua dichiarazione si comporterebbe come segue:

Select * FROM users WHERE (username='adrian' AND password='') OR (1=1 AND username='adrian') 

Quindi, si otterrebbe un riga restituita a patto che ci fosse un utente denominato adrian.

Controllare la documentazione MySQL su operatore precendenza - https://dev.mysql.com/doc/refman/5.6/en/operator-precedence.html