存储过程中的SQL注入?

时间:2013-05-09 10:30:59

标签: php mysql sql mysqli sql-injection

我在代码中找到了一个字符串未正确转义的地方。我一直试图看看它是否可以被利用(不用担心,我最终会逃避它或使用准备好的语句,这只是为了学习经验)。

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

查询在PHP中生成如下:

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

输入$_UnescapedString作为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

1 个答案:

答案 0 :(得分:1)

免责声明,我使用的是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注入攻击可能造成的损害的一种方法。但是,它不会阻止它们。