SQL注入,忽略第一个select命令

SQL Injection, ignore first select command

我正在尝试构建一个允许我从服务器公开额外数据的场景(用于案例演示目的)。服务器调用易受攻击的 SQL 代码:

EXEC my_storeProc '12345'

其中“12345”(不是单引号)是参数。这将执行 SELECT 语句。我想消除此执行,而是调用我自己的 select 语句,但是服务器端代码将只接受第一个调用的 select 语句,包含在上述 EXEC 调用中。调用第二个语句很简单:

EXEC my_storeProc '12345       ' select * from MySecondTable--

(最后的--会把服务器添加的结束单引号挡住,防止出错)。我的问题是,虽然有 2 个 select 语句,但服务器只会解析第一个。有没有办法在不引发错误的情况下取消第一个 EXEC 调用,以便取而代之的是第二个?甚至可能是 UNION,但只有一个可供利用的变量(在本例中为 12345)我无能为力。

您必须考虑它将如何执行,特别是您希望调用它以便它不会引发异常并将 kabosh 放在整个语句中。您不能通过 proc 调用将结果设置为始终为真,因此没有真正的方法可以逃避 proc。相反,您需要插入第二个命令,您想要的代码如下所示;

exec my_Storeproc '1234'; select * from mysecondtable

所以我们需要关闭引号,并做出新的声明。这意味着带有插入的字符串需要是;

1234'; select * from mysecondtable where 1 = '1

这里有一个缺陷,无论您执行什么命令都不会返回到 UI。要获取数据,您必须将服务器连接添加到第二个命令。

为了使第二个命令变得不必要,您必须将代码注入到 proc 中,这是一个非启动器,因为 proc 已经编译并且 sql 注入依赖于混淆编译器什么是数据和什么是命令。如需更详细的解释,请查看此答案:

https://security.stackexchange.com/a/25710