.net – 证明SQL注入

前端之家收集整理的这篇文章主要介绍了.net – 证明SQL注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在这里简单地证明这个简单的函数不足以阻止世界上每个sql注入:
Function CleanForsql(ByVal input As String) As String
    Return input.Replace("'","''")
End Function

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

Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForsql(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)

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

所以根据我链接的帖子,只需输入

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

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

解决方法

Chr(8)是引用的文字字符串的一部分,更新语句也是如此,因此sql Server不会将其解释为函数调用.在此示例中,Text1将设置为文字值:
'Chr(8); update tblMaint SET Value1 = 2 WHERE ValueID = 2--

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

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

猜你在找的MsSQL相关文章