1

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

这是使用mysqli->query()功能;

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

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

通过输入我得到的查询$_UnescapedStringtest'); 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

4

1 回答 1

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

可能是DROP TABLE由于您运行的用户帐户没有足够的权限执行 DDL 语句而导致命令没有执行?

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

于 2013-05-09T10:43:05.270 回答