Questa domanda ha avuto risposta nella sezione commenti, ma questa è una risposta esplicativa per chiunque voglia guardare. Quindi, guardando lo snippet di codice potremmo effettivamente vedere
$login = "SELECT fName,lName FROM great WHERE email= '$email' AND pwd = MD5('$pwd')";
Come puoi vedere alla fine di pwd = MD5('$pwd')
, il codice accetta effettivamente una password immessa dall'utente e la converte in MD5 e la confronta nel database. Ora, il piano prevede di interrompere il pwd
nella query MYSQL.
Per questo, è possibile fornire ')
in modo che assomigli a pwd = MD5('')')
in questo caso l'ultimo ')
non ha alcun utilizzo e fornirebbe Errore di sintassi SQL poiché la Query non identificherà due ')')
Quindi il nostro il prossimo Piano è di commentare l'ultimo ')
dalla Query, per questo ho usato il Tip Two Hyphens -- -
. Ora il Magic qui è se fornisci solo --
rispetto alla Query alla fine non verrà commentato perché risulterebbe in --')
Fornendoti un Errore di Sintassi! Quindi, per questo motivo, ho fornito lo spazio Intentional dopo --
e aggiunto un altro trattino per la dimostrazione. Poiché in molti casi di Blackbox SQL Injection non è possibile prevedere ed Exact Syntax error è l'unica speranza, quindi in questo commento di -- -
l'ultimo trattino non ha alcun significato ma lo SPAZIO tra di essi contiene il chiave per commentare ')
out dal retro.
Ora, la query funzionerebbe come al solito e, a causa della mancanza di sanitizzazione dell'ingresso, possiamo sempre VERO la query di or '1'='1'
. Ma, questo da solo non risolverà il problema poiché or '1'='1'
selezionerebbe Ogni RIGA dal database e il frammento di codice indicato qui sotto fa un controllo aggiuntivo qui
if($exe){
$num = mysqli_num_rows($exe);
if($num == 1){
//You are in
}
Aha, Now mysqli_num_rows > 1 Che non ti permetterebbe di andare alla parte if
e non verrebbe ignorata. Quindi nel Payload iniziale, questo è l'unico motivo per cui stiamo aggiungendo LIMIT 1
per evitare le nostre righe > 1. Il LIMIT 1
seleziona la prima riga del loro database back-end e VOILA che hai visitato.
Quindi, unendo tutti questi piccoli pezzi, potremmo costruire il nostro payload finale come ') or '1'='1' LIMIT 1-- -
quindi la query finale sarebbe
$login = "SELECT fName,lName FROM great WHERE email= '$email' AND pwd = MD5('') or '1'='1' LIMIT 1-- -')";
Questo è tutto! :)