这个输入过滤器功能如何被打败?

信息安全 sql注入 经典的asp
2021-09-09 05:01:45

在我的工作中有一个经典的 ASP 应用程序(我相信)极易受到 SQL 注入的攻击。我想向管理层证明这段代码不安全,但我所能做的就是在数据库中插入“SQLINJ”日志记录:

Public function preventSQLInjection(lstr)

    BlackList = Array("--", ";", "'", "/*", "*/", "@@", "@",_
                      "alter ", "begin ", "create ", "cursor ",_
                      "declare ", "delete ", "drop ", " end", "exec ",_
                      "execute ", "fetch ", "insert ", "kill ", "open ",_
                      "select ", "sysobjects", "syscolumns",_
                      "table ", "update ", "=")

    preventSQLInjection = lstr

        For Each s in BlackList      
        If ( InStr (lstr, s) <> 0 ) Then
            execSqlQuery "INSERT INTO AccesLogs (datetime,ip,action,comments) VALUES ('" & formatDate(date) & " " & formatTime(time) & "','" & request.ServerVariables("REMOTE_ADDR") & "','SQLINJ','" & replace(lstr,"'","''") & "')",connectionstring
            preventSQLInjection = "DONOTUSEIT"
            exit for
        End If  
    Next

end function

据我了解,最简单的攻击将是对AccessLogs表本身的攻击,因为replace(lstr,"'","''")它会“清理”SQL 注入尝试并记录它。


我知道应该放弃这段代码,所有可执行的 SQL 都应该使用实际的命令和参数执行——我非常讨厌串联的字符串。

我想向管理层展示该页面非常易受攻击,例如sysobjects被列入黑名单,但不是sys.objects这样,如果我可以注入可执行 SQL,则必须能够毫不费力地获取整个数据库的架构。

username比如说,页面上的andpassword字段怎么能打败这个功能login.asp呢?或者我是在编造这一切,而这段代码是完全安全的?

3个回答

我想向管理层证明这段代码不安全

当他们添加到黑名单中时,您可以一遍又一遍地花费您(也许是短暂的)职业生涯的其余部分。我建议尝试教育他们。

阅读OWASP SQL Injection Cheat Sheet和其中引用的相关表格,然后能够将其呈现给决策者并合理地回答问题 - OWASP 是一个非常有信誉的来源。

另请阅读为什么我们不应该滚动我们自己- 特别是,菲尔齐默尔曼的例子是一个例子,来自一位非常知名的密码学家,为什么“好吧,我无法打败它”并不意味着“它”是安全的。

如果您必须尝试提供示例,请尝试使用各种编码;显然允许使用十六进制,因此请调出您的ASCII 表以与 0x 和 CHAR() 一起使用,也许还可以使用HTML 转义字符或 Unicode(UCS-2,用于 SQL Server)。

看看你是否也可以使用'setquoted_identifier off'。

正如 kiBytes 所说,尝试混合大小写 - 最常见的 SQL Server 排序规则都是不区分大小写的。

如果有什么办法,你需要回去教育他们,仅仅因为你发现了 N 个漏洞并不意味着没有剩下 X 个漏洞,其中一些漏洞在攻击者之前是找不到的。

我无法测试它,但文档告诉“ InStr”函数区分大小写,所以我相信您可以使用任何标记,但大写字母的符号除外:

使用此代码

<script>eval('al' + 'ert(1)')</script>

<script>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))</script>
<meta http-equiv="refresh" content="0;url=javascript:alert(1);">