SQLi basato su errori si basa su un bug trovato in MySQL riguardante l'istruzione GROUP BY (vedi qui e qui ).
Per attivare il bug devi seguire le seguenti regole:
- Utilizza una funzione di aggregazione.
- GROUP BY una colonna che ha due valori identici su righe diverse.
- L'output della funzione rand () deve apparire nella colonna del punto 2 sopra.
La stringa
or 1 group by concat_ws(0x3a,version(),floor(rand(0)*2)) having min(0) or 1--
è iniettato in una clausola WHERE, quindi or 1
(che equivale a or true
) viene usato per cancellare le condizioni precedenti e mostrare quante più righe possibile. In questo modo, dovrebbero esserci almeno due righe con lo stesso valore per floor(rand(0)*2))
. Questo si occupa dei punti 2 e 3. Usiamo floor () in modo che i valori restituiti siano solo 0 o 1. Se dovessimo usare direttamente rand, sarebbe quasi impossibile soddisfare il punto 2.
Abbiamo bisogno di having min(0)
per occuparci del punto 1.
Inoltre, l'istanza di or 1
alla fine della query è inutile e può essere rimossa.