Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Questo codice impedisce l'iniezione SQL?

In risposta alla tua domanda diretta:questo codice impedisce l'iniezione di SQL:No

Ecco la prova:spingi questa stringa attraverso il metodo PrepareString:

Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)

Console.WriteLine(input)
Console.WriteLine(output)

Ho modificato il metodo GetRecord che hai pubblicato per restituire la stringa SQL completamente preparata anziché ottenere il record dal database:

Console.WriteLine(GetRecord(output))

E questo è l'output

Input  = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'

Aggiungi 1 riga di codice extra:

My.Computer.Clipboard.SetText(input)

E hai la stringa di cui hai bisogno copiata direttamente negli appunti da incollare nel campo di input sul sito Web per completare la tua SQL injection:

'; Drop Table TableName; - -

[Nota che i caratteri di controllo sono stati omessi dall'output del post da StackOverflow, quindi dovrai seguire l'esempio di codice per creare il tuo output]

Dopo che il metodo PrepareString è stato eseguito, avrà lo stesso identico output:il codice ASCII Chr(8) è il backspace che rimuoverà il "'" extra che stai aggiungendo al mio che chiuderà la tua stringa e quindi sono libero di aggiungere quello che voglio alla fine. Il tuo PrepareString non vede il mio -- perché sto effettivamente usando -- con un carattere backspace per rimuovere lo spazio.

Il codice SQL risultante che stai creando eseguirà quindi la mia istruzione Drop Table senza ostacoli e ignorerà prontamente il resto della tua query.

La cosa divertente di questo è che puoi usare caratteri non stampabili per aggirare praticamente qualsiasi controllo di carattere che puoi inventare. Quindi è più sicuro utilizzare query parametrizzate (che non è quello che hai chiesto, ma è il percorso migliore per evitarlo).