Sto cercando di capire il concetto di Boolean Based Blind SQL Injection. Ho seguito Guida OWASP a SQLi per capirlo. Tuttavia sono confuso da come funziona esattamente. Di seguito è quello che ho capito dall'articolo nel link sopra. Per favore fatemi sapere se la mia comprensione è corretta o se sto fraintendendo qualcosa.
Quindi, come per il link sopra, assumiamo un URL di esempio in cui il parametro vulnerabile è 'id' come:
http://www.example.com/index.php?id=1'
Quindi la query corrispondente centrale eseguita sul server potrebbe essere:
SELECT field1, field2, field3 FROM Users WHERE Id='$Id'
Ora assumendo che Users
contenga un campo chiamato Username
, vogliamo estrarre il valore del campo Username
dove id=1
usando la nostra tecnica booleana. Quindi proviamo a indovinare questo valore carattere per carattere in questo modo:
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
L'articolo dice che continuiamo ad aumentare il valore ASCII dal 97 in poi 1 per 1 ogni volta che riteniamo che la valutazione sia falsa.
Now the problem here is how to find whether the result that gets returned from the above query is
TRUE
orFALSE
.
Quindi per risolvere questo problema, l'articolo dice che proviamo a eseguire quanto segue prima di provare quanto sopra:
$Id=1' AND '1' = '2
so this would generate the querySELECT field1, field2, field3 FROM Users WHERE Id='1' AND '1' = '2'
.
Dopo l'esecuzione della query precedente, il server restituirebbe determinati stati (una pagina, un reindirizzamento ecc.). Dato che 1=2
sarà sempre valutato a FALSE
, verremmo a sapere cosa succede nell'evento di un FALSE
risultato restituito da una query.
Now we can match this result with the result that we get by the execution of
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
and thus conclude if the test against 97 (or any specific ASCII value) evaluates toTRUE
FALSE
.
- La mia comprensione di quanto sopra è corretta?
- Se sì, allora nella query,
$Id=1' AND ASCII(SUBSTRING(username,1,1))=97 AND '1'='1
, perché abbiamo bisogno della parte dopoAND
? Voglio dire, non possiamo confermare il risultato (come confermato nell'analisi sopra) senza il grassetto della query? Perché la parte in grassetto della query è davvero necessaria? - Poiché in questa tecnica stiamo anche cercando di vedere la pagina di errore e distinguerla dalla pagina di successo, non dovrebbe essere considerata come una SQLi basata sull'errore piuttosto che chiamarla basata su boolean?