【问题标题】:Bypassing SQL Character Blacklist Filtering绕过 SQL 字符黑名单过滤
【发布时间】:2020-01-21 15:56:27
【问题描述】:

我正在学习一门网络安全课程,其中包含 SQL Server 2000 主机上的挑战。

我泄露了一个 asp 文件,其中包含登录页面的源代码,其中包含一个硬编码查询,该查询从用户那里获取用户名和密码,然后继续查询数据库...

sSql = "SELECT * FROM Users where user_name='" & username & "' and user_password='"&password&"'"

在执行此操作之前,用户输入会通过以下方法循环过滤...

' " - & % / \ | > 

replace(myString, "&", "")

我想要做的是转义包含用户或密码的字符串,打破正在开发的查询并用我自己的方式中断它,然后注释掉其余部分以保持它“有效”。为了逃避黑名单,我试图传递一个SUBSTRING,它将一系列十六进制字符解码为一个有效的嵌套查询。

我已经在沙盒 VB 脚本中测试了这两个部分,以检查处理编码字符串并在在线 MSSQL 模拟器 here 中运行字符串,它可以很好地解码查询。

注意:模拟器是 Sql Server 2014 Express Edition 不是 2K。找不到2K的

我希望这是有道理的!

这是我想要传递的内容以及每个角色想要实现的目标......

编码查询:

SELECT CONVERT(VARCHAR(60), SUBSTRING(0x22273B2053454C454354202A2066726F6D207573657273205748455245206E616D65203D2061646D696E3B202D2D20, 1, 96))

转换为(带有尾随空格):

"'; SELECT * from users WHERE name = admin; -- 

我的设想是在处理SUBSTRING 之后形成以下整体查询: sSql = "SELECT * FROM Users where user_name='""'; SELECT * from users WHERE name = admin; -- & username & "' and user_password='"&password&"'"

我希望在我的恶意请求中前导双引号和单引号会破坏字符串,随后的分号将结束请求而不会导致异常,然后导致服务器处理我的查询并删除不必要的剩余部分。

那么我的问题是,从 SQL Server 2000 的角度来看,这种方法是否有效?还是我对服务器如何接收和处理查询的假设不正确?

【问题讨论】:

    标签: security sql-injection sql-server-2000


    【解决方案1】:

    不 - 它的处理方式不允许您以这种方式进行攻击。使用您的有效负载,字符串最终将是:

    SELECT * FROM Users where user_name='SELECT CONVERT(VARCHAR(60), SUBSTRING(0x2...0, 1, 96))' and user_password='"&password&"'
    

    因此,您尝试执行的 SELECT 将使用单引号,并且永远不会被解释为代码。

    关键可能是您有两次注入 - 尝试在第一次注入中传入“\”以转义最后一个引号,然后使用两次注入来利用它。

    【讨论】:

    • 它可能无法被利用,因为在构建和处理查询之前 `` 已从用户输入中过滤掉
    • @3therk1ll - 我在最后一段中的意思是,在这种情况下,您不需要传递引号来创建漏洞利用 - 您可以使用“\”来转义第一个字符串。然后第二个字符串的第一个引号关闭该引号,您可以使用第二个字符串注入代码。
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2019-02-21
    • 2021-08-07
    • 2019-09-21
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多