证明SQL注入

Jru*_*rud 6 .net sql vb.net sql-injection

我试图在这里简单地证明这个简单的函数不足以阻止世界上每个sql注入:

Function CleanForSQL(ByVal input As String) As String
    Return input.Replace("'", "''")
End Function
Run Code Online (Sandbox Code Playgroud)

以下是我们其中一个应用的典型插入声明:

Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)
Run Code Online (Sandbox Code Playgroud)

我知道它不安全,因为谷歌搜索和查找StackOverflow.com上的其他问题. 是我发现的一个问题,其中所有功能,例如我上面介绍的功能都是无关紧要和毫无意义的.

所以基于我链接的帖子,只需输入即可

"CHR(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2--

进入txtNote应该足以清除整个tblFilledForms表中text1中的每个值,然后将tblmaint表的第二行更新为2正确吗?

这里应该发生的是VB将其解释为

UPDATE tblFilledForms SET Text1 ='''Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2--'WHERE FilledFormID = 5120327

并将其发送到SQL,它将实习执行Chr(8)以擦除将产生的第三个'

UPDATE tblFilledForms SET Text1 =''; update tblMaint SET Value1 = 2 WHERE ValueID = 2--'WHERE FilledFormID = 5120327

要在数据库上实际执行正确吗?

然后,我从剪贴板中清除了一个Chr(8)并用剪贴板内容替换了文本框中的Chr(8),但仍然是禁止的.它将整个字符串直接放入没有问题的字段中.

那么我在这里做错了什么?或者我还能做些什么来打破它?

技术和背景:我正在使用MS SQL Server 2005和VB .NET 2005.数据库中的Text1字段是一个Varchar(600)字段(不要问我为什么它不是MAX,它没有意义,我知道)那里表上的某些触发器会阻止像这样的大量更新,并且如果注入实际正常工作则会抛出一些错误.

PS.我知道参数化查询是去这里的方式,我不是在寻找像"我不知道为什么它不起作用,但参数化查询是要走的路"的答案.我正在寻找能够证明我们的软件被破坏并且我们需要使用更好的原则重写它的能力.

对于阅读此问题的任何人来说明如何更好地过滤文本字段,答案是不要!使用参数!它们更好,更安全,更容易!

ric*_*ent 6

Chr(8)是引用的文字字符串的一部分,更新语句也是如此,因此SQL Server不会将其解释为函数调用.在此示例中,Text1将设置为文字值:

'Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2--
Run Code Online (Sandbox Code Playgroud)

(是的,包括那个单引号)

因此,通过此示例,您的代码安全的.对SQL注入的大多数困扰是意外地无法验证和引用值,在正确引用的SQL语句中没有任何本质上不安全的东西.