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
TRUEorFALSE.
Quindi per risolvere questo problema, l'articolo dice che proviamo a eseguire quanto segue prima di provare quanto sopra:
$Id=1' AND '1' = '2so 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'='1and thus conclude if the test against 97 (or any specific ASCII value) evaluates toTRUEFALSE.
- 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?