我在代码中的某个地方发现一个字符串没有被正确转义。我一直在尝试查看它是否可以利用(别担心,我最终会逃避它或使用准备好的语句,这只是为了学习经验)。
这是使用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
?