绕过 SQL 字符黑名单过滤
Bypassing SQL Character Blacklist Filtering
我正在学习网络安全课程,其中包含 SQL Server 2000 主机上的挑战。
我泄露了一个 asp
文件,其中包含登录页面的源代码,其中包含一个硬编码查询,该查询从用户那里获取用户名和密码并继续查询数据库...
sSql = "SELECT * FROM Users where user_name='" & username & "' and user_password='"&password&"'"
在执行此操作之前,用户输入会通过以下方法循环过滤...
' " - & % / \ | >
replace(myString, "&", "")
我想做的是转义包含用户或密码的字符串,中断正在开发的查询并用我自己的查询中断它,然后注释掉其余部分以保留它 'valid'。为了逃避黑名单,我试图传递一个 SUBSTRING
,它将一系列十六进制字符解码为有效的嵌套查询。
我已经在沙箱 VB 脚本中测试了这两个部分,以检查处理编码字符串和 运行 在线 MSSQL 模拟器 here 中的字符串及其很好地解码查询。
注意:模拟器 Sql Server 2014 Express Edition
不是 2K。找不到 2K
我希望这是有道理的!
这是我想要传递的内容以及每个角色想要达到的目标...
编码查询:
SELECT CONVERT(VARCHAR(60), SUBSTRING(0x22273B2053454C454354202A2066726F6D207573657273205748455245206E616D65203D2061646D696E3B202D2D20, 1, 96))
转换为(尾随 space):
"'; 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 的角度来看,这种方法是否有效?还是我对服务器如何接收和处理查询的假设不正确?
否 - 它的处理方式不允许您以这种方式进行攻击。使用您的有效载荷,字符串最终将成为:
SELECT * FROM Users where user_name='SELECT CONVERT(VARCHAR(60), SUBSTRING(0x2...0, 1, 96))' and user_password='"&password&"'
所以您要执行的 SELECT 将用单引号引起来,并且永远不会被解释为代码。
关键可能在于您有两次注入 - 尝试将“\”传递到第一次注入中以转义最后一个引号,然后使用两次注入来利用它。
我正在学习网络安全课程,其中包含 SQL Server 2000 主机上的挑战。
我泄露了一个 asp
文件,其中包含登录页面的源代码,其中包含一个硬编码查询,该查询从用户那里获取用户名和密码并继续查询数据库...
sSql = "SELECT * FROM Users where user_name='" & username & "' and user_password='"&password&"'"
在执行此操作之前,用户输入会通过以下方法循环过滤...
' " - & % / \ | >
replace(myString, "&", "")
我想做的是转义包含用户或密码的字符串,中断正在开发的查询并用我自己的查询中断它,然后注释掉其余部分以保留它 'valid'。为了逃避黑名单,我试图传递一个 SUBSTRING
,它将一系列十六进制字符解码为有效的嵌套查询。
我已经在沙箱 VB 脚本中测试了这两个部分,以检查处理编码字符串和 运行 在线 MSSQL 模拟器 here 中的字符串及其很好地解码查询。
注意:模拟器 Sql Server 2014 Express Edition
不是 2K。找不到 2K
我希望这是有道理的!
这是我想要传递的内容以及每个角色想要达到的目标...
编码查询:
SELECT CONVERT(VARCHAR(60), SUBSTRING(0x22273B2053454C454354202A2066726F6D207573657273205748455245206E616D65203D2061646D696E3B202D2D20, 1, 96))
转换为(尾随 space):
"'; 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 的角度来看,这种方法是否有效?还是我对服务器如何接收和处理查询的假设不正确?
否 - 它的处理方式不允许您以这种方式进行攻击。使用您的有效载荷,字符串最终将成为:
SELECT * FROM Users where user_name='SELECT CONVERT(VARCHAR(60), SUBSTRING(0x2...0, 1, 96))' and user_password='"&password&"'
所以您要执行的 SELECT 将用单引号引起来,并且永远不会被解释为代码。
关键可能在于您有两次注入 - 尝试将“\”传递到第一次注入中以转义最后一个引号,然后使用两次注入来利用它。