Quando questa stringa viene decodificata dal suo modulo con codifica url diventa la seguente:
25' having 1=1--
Questa stringa, se inserita come è, ad esempio, nella seguente funzione di query del database (PHP):
mysql_query("SELECT * FROM users WHERE username = '$username'");
Diventa questo:
mysql_query("SELECT * FROM users WHERE username = '25' having 1=1--'");
Da notare che il% 27 (') esce dall'argomento nella clausola WHERE e continua la parte eseguibile dell'istruzione. Il - dopo 1 = 1 rende il resto dell'istruzione un commento che non viene eseguito.
Si suppone che l'istruzione HAVING in SQL venga utilizzata all'interno di query che utilizzano l'operatore GROUP BY e non dovrebbe riuscire nelle query che non lo fanno. La mia ipotesi è che questa stringa viene utilizzata per verificare semplicemente la presenza di una variabile non salvata che viene inserita in una query eseguita.
Per prevenire questo tipo di attacco, suggerirei di utilizzare una buona funzione di risanamento dell'input o query parametrizzate. L'implementazione di questo dipende dall'ambiente di programmazione in questione.
Addizione : l'uso normale di 1 = 1 nelle query di SQL injection consiste nel restituire tutte le righe, annullando qualsiasi altra condizione WHERE. Un esempio di input potrebbe essere:
a' OR 1=1 --
Quando inserito come parametro $ password in una query come:
SELECT * FROM users WHERE username = '$username' AND password = '$password'
L'affermazione diventa:
SELECT * FROM users WHERE username = 'mark' AND password = 'a' OR 1=1 --
Il set di dati risultante includerà tutte le voci nella tabella "utenti", poiché 1 = 1 è sempre true.