gpt4 book ai didi

php - 存储过程中的 SQL 注入(inject)?

转载 作者:行者123 更新时间:2023-11-29 00:31:07 26 4
gpt4 key购买 nike

我发现代码中某处没有正确转义字符串。我一直在尝试查看它是否可以被利用(别担心,我最终会转义它或使用准备好的语句,这只是为了学习经验)。

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

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

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

通过输入 $_UnescapedString as test');删除表 SomeTable; -- 我得到了查询:

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

此查询已成功运行,但似乎没有运行第二个查询。我通过在第二个查询中放置无效的 SQL 来测试它并且没有得到任何错误。我假设这意味着 mysqli 足够聪明,可以只执行一个查询?

现在我的问题是,我能否以某种方式将 SQL 注入(inject)存储过程本身?程序如下:

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; -- ')

也许 DROP TABLE 命令没有执行是因为您运行的用户帐户没有足够的权限来执行 DDL 语句?

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

关于php - 存储过程中的 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16459668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com