【发布时间】:2013-05-03 19:18:35
【问题描述】:
我在代码中的某个地方发现一个字符串没有被正确转义。我一直在尝试看看它是否可以被利用(别担心,我最终会逃避它或使用准备好的语句,这只是为了学习经验)。
这是使用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?
【问题讨论】:
标签: php mysql sql mysqli sql-injection