Ci sono alcuni casi in cui questa funzione di escape non riesce. Il più ovvio è quando non viene utilizzata una singola citazione:
string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index
In questo caso, puoi "scoppiare" usando una doppia virgoletta, un segno di spunta all'indietro. Nell'ultimo caso non c'è nulla da "sfondare", quindi puoi semplicemente scrivere 1 union select password from users--
o qualunque sia il payload sql che l'attaccante desidera.
La condizione successiva in cui questa funzione di escape fallirà è se viene presa una sottostringa dopo che la stringa è stata sottoposta a escape (e sì Ho trovato vulnerabilità come questa in natura):
string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";
In questo caso un nome utente di abcdefgji'
verrà trasformato in abcdefgji''
dalla funzione di escape e poi trasformato di nuovo in abcdefgji'
prendendo la sottostringa. Questo può essere sfruttato impostando il valore della password su qualsiasi istruzione sql, in questo caso or 1=1--
verrebbe interpretato come sql e il nome utente verrebbe interpretato come abcdefgji'' and password=
. La query risultante è la seguente:
select * from users where name='abcdefgji'' and password=' or 1=1--
T-SQL e altre tecniche avanzate di iniezione sql dove già menzionato. Advanced SQL injection nelle applicazioni SQL Server è un ottimo documento e dovresti leggerlo se non l'hai già fatto.
L'ultimo problema sono gli attacchi Unicode. Questa classe di vulnerabilità deriva dal fatto che la funzione di escape non è a conoscenza della codifica multi-byte e può essere utilizzata da un utente malintenzionato per "consumare" il carattere di escape. Non sarà di aiuto anteporre una "N" alla stringa, poiché ciò non influisce sul valore dei caratteri multibyte più avanti nella stringa. Tuttavia, questo tipo di attacco è molto raro perché il database deve essere configurato per accettare le stringhe Unicode GBK (e non sono sicuro che MS-SQL possa farlo).
L'iniezione di codice del secondo ordine è ancora possibile, questo modello di attacco viene creato fidandosi delle origini dati controllate dagli aggressori. L'escape viene utilizzato per rappresentare i caratteri di controllo come il loro carattere letterale. Se lo sviluppatore dimentica di sfuggire a un valore ottenuto da un select
e quindi utilizza questo valore in un'altra query, quindi bam l'attaccante avrà a sua disposizione una virgoletta letterale del carattere.
Verifica tutto, non fidarti di nulla.