繁体   English   中英

在存储过程中进行SQL注入?

[英]SQL Injection within a stored procedure?

我在代码中的某个地方发现了无法正确转义字符串的地方。 我一直在尝试查看它是否可利用(不用担心,无论如何我最终都会转义它或使用准备好的语句,这只是为了学习)。

这是使用mysqli->query()函数;

查询是用PHP生成的,如下所示:

$Query = "CALL some_proc(".$_SomeID.",'".$_UnescapedString."')";

通过输入$_UnescapedString作为test'); DROP TABLE SomeTable; -- test'); DROP TABLE SomeTable; -- test'); DROP TABLE SomeTable; --我得到了查询:

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

该查询已成功运行,但似乎没有运行第二个查询。 我通过在第二个查询中放入无效的SQL进行了测试,没有出现错误。 我认为这意味着mysqli足够聪明,只能执行一个查询?

现在我的问题是,我可以以某种方式将SQL注入存储过程本身吗? 步骤如下:

BEGIN
   SELECT COUNT(*) AS SomeCount
   FROM DataTable
   WHERE DataTable.SomeID = _SomeID
   AND DataTable.SomeValue LIKE CONCAT('%',_UnescapedString,'%');
END

我已经尝试了各种SQL,例如test','%')--来查看查询是否会正常进行,但是它只会更改存储过程调用,即:

CALL some_proc(1, 'test', '%')--');

无论如何,将DROP TABLE命令放入_UnescapedString

免责声明,我使用的是SQL Server,而不是mySQL,但是假设关于存储过程中参数的行为是相同的,并且还假定_UnescapedString是输入参数,因此将DROP TABLE放在参数中看起来像这样:

SELECT COUNT(*) AS SomeValue
FROM DataTable
WHERE DataTable.SomeID = _SomeID
AND DataTable.SomeValue LIKE '%DROP TABLE%');

关于查询:

CALL some_proc(1, 'test'); DROP TABLE SomeTable; -- ')

也许由于正在运行的用户帐户没有足够的权限执行DDL语句,所以DROP TABLE命令没有执行?

限制用于从Web服务器访问数据库的用户帐户的权限是一种限制SQL注入攻击可能造成的损害的方法。 但是,这不会阻止他们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM