即使在转义引号时也进行 SQL 注入

BRo*_*ers 1 security sql-injection asp-classic

我正在想办法解决以下问题,因为看起来有人这样做了,我想解决它。但是,在使用OWASP Recommendation 之类的东西修复它之前,我真的很想了解攻击的工作原理

    Set conn = Server.CreateObject("ADODB.Connection")
    conn.open xDb_Conn_Str
    sSql = "SELECT * FROM [User]"
    sSql = sSql & " WHERE [Username] = '" & CleanSql(sUserId) & "'"
    Set rs = conn.Execute(sSql)
Run Code Online (Sandbox Code Playgroud)

CleanSql -

Function CleanSql(str)

    Dim sWrk

    sWrk = Trim(str&"")
    sWrk = Replace(sWrk, "'", "''") ' Adjust for Single Quote

    sWrk = Replace(sWrk, "[", "[[]") ' Adjust for Open Square Bracket

    CleanSql = sWrk

End Function
Run Code Online (Sandbox Code Playgroud)

单引号显然在此转义。

在此之后,它将检查是否发现用户使用以下内容验证密码:

If UCase(rs("Password")) = UCase(sPassWd) Then
    DoStuff()
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

Bon*_*ond 5

由于听起来您已经意识到准备/参数化语句的好处,因此我不会说教。您似乎只是很好奇您现有的应用程序是如何被破坏的。

一个简单的\' ; drop table users --可以打败你的报价加倍。你的CleanSql()函数会把它变成:

\'' ; drop table users --
Run Code Online (Sandbox Code Playgroud)

你的 SQL 语句会变成:

... WHERE [Username] = '\'' ; drop table users --'
Run Code Online (Sandbox Code Playgroud)

由于'\''是有效值(转义单引号),您的where子句已有效结束。;启动一个新命令并--有效地注释掉结束语。drop table可以是任何东西……update users set password=...或者insert into users values ()攻击者想要运行的任何东西。