2015-11-02 38 views
0

我想构建一个场景,允许我公开服务器的其他数据(用于演示目的)。服务器调用易受攻击的SQL代码:SQL注入,忽略第一个选择命令

EXEC my_storeProc '12345' 

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

EXEC my_storeProc '12345  ' select * from MySecondTable-- 

(中 - 在年底将阻止服务器添加到防止错误关闭单引号)。我的问题是,虽然有2个选择语句,服务器将只解析第一个。有没有办法在不抛出错误的情况下取消第一次EXEC调用,以便取而代之的是第二次调用?也许即使是一个UNION,但是我只能用一个变量开放来利用(在这种情况下变量是12345),我可以做的并不多。

回答

2

你必须考虑它将如何执行,特别是你想要它被调用,所以它不会引发异常,并将kabosh放在整个语句中。你不能将结果设置为总是正确的,所以没有真正的办法逃避proc。相反,你会想要再次输入一个命令,你想要的代码看起来像;

exec my_Storeproc '1234'; select * from mysecondtable 

因此,我们需要关闭引号,并做出新的声明。这将意味着需要插入的字符串;

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

这里有一个缺陷,无论你正在执行的命令是不是返回到用户界面。要获取数据,您必须将服务器连接添加到第二个命令。

为了使第二个命令不必要,你必须注入代码到proc中,这是一个非启动器,因为proc已经被编译,sql注入依赖于编译器关于什么是数据和什么是命令。对于一个更详细的解释看看这个答案:

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

+1

我给你在这一个答案,看如何......热心人回答它,它也是情理之中。所以基本上,我们将使用URL来修改存储过程,然后使用另一个URL来执行它。这不是一个坏主意。无论哪种方式,我显示漏洞。谢谢! – Lukas

+1

如果您想要使用SELECT语句进行反馈,那么您必须创建一个反馈回送的方式,但是如果要演示UPDATE,DELETE或MODIFY,则不需要返回结果集和您的演示仍然有效。制作一个表格,用于跟踪用户信息或所欠的费用,然后删除或修改您的帐户或您的姓名。 – EMUEVIL