PHP Injection Vulnerability SQL In UPDATE Statements

6

Prendi la seguente query SQL come esempio:

UPDATE 'sqlinjection2' SET '$vote'='$vote'+1

Il nostro obiettivo è incrementare il numero dei voti di più di uno, in una sola richiesta.

Non possiamo accedere al codice stesso.

Se possiamo inviare un valore a $ vote, potremmo inviare:

vote'=1, 'vote'=X+'vote

In modo che la query appaia così:

SET 'vote'=1, 'vote'=X+'vote'='vote'=1, 'vote'=X+'vote'+1;

Precisione: X è un numero.

La mia domanda è, come funziona questa parte?

'vote'=X+'vote'='vote'=1

Capisco che imposta la colonna vote come NULL, ma perché è così?

    
posta Roee H 13.06.2016 - 09:56
fonte

1 risposta

2

Nell'esempio si danno risultati nel valore 0 (non NULL) che viene restituito. Questo perché la query che hai costruito è risultata essere un confronto booleano. Il = nella / e parte / i di assegnazione di un'istruzione UPDATE è un operatore di confronto, non un operatore di assegnazione come ci si potrebbe aspettare.

Injection vote'=1, 'vote'=10+'vote ha come risultato la query UPDATE mytable SET /*part1*/'vote'=1, /*part2*/'vote'=10+'vote' = 'vote'=1, /*part3*/'vote'=10+'vote' + 1 che decostruisce a questo (usando == come operatore di confronto per chiarezza:

PART1:  
vote = 1

PART2: 
vote = ((10+vote) == vote) == 1
vote = ( 11 == vote ) == 1 
vote = ( 11 == 10 ) == 1 
vote = FALSE == 1
vote = FALSE (0) 

PART 3:
vote = 10 + vote + 1 
vote = 10 + FALSE (0) + 1 
vote = 11 

L'iniezione più interessante sarebbe semplicemente impostare la colonna dei voti e poi terminare la query usando un commento:

$vote = "vote' = 1337 -- and we don't care about the rest";
// results in: 
// UPDATE mytable set 'vote' = 1337 -- and we don't care about the rest' = 'vote' = 1337 -- and we don't care about the rest' + 1

MySQL ignorerà tutto dopo la prima occorrenza di - come commento e imposterà il valore (in realtà, tutti i valori di voto nella tabella) a 1337.

    
risposta data 27.06.2016 - 09:52
fonte

Leggi altre domande sui tag