Mysql 作为 GET 参数发送时查询中断

Mysql query breaking when sent as GET parameter

我正在测试课程中的盲目布尔值 SQL 注入端点,但在确定我的有效负载出错的位置时遇到了一些问题。

我已经在目标框 mysql shell 中测试了下面的内容并且它有效。

GRANT/**/ALL/**/ON/**/*.*/**/TO/**/root@localhost;

但是当我在 q GET 参数中提交它时,我在应用程序中遇到错误。

php?q=off')/**/or/**/GRANT/**/ALL/**/ON/**/*.*/**/TO/**/root@localhost%23

我用 '1'='1' 测试了一个基本的布尔语句,它工作正常所以我假设我的实际查询在 URL.

的上下文中有问题

q=off')/**/or/**/'1'='1'%23

我也尝试过对负载 url 进行编码,但仍然存在相同的问题。

知道是什么原因造成的吗?

使用SQL 注入来组合部分表达式,例如 OR '1'='1' 作为其他一些查询的一部分是有效的,因为有很多方法可以将额外的表达式语法附加到现有的 SQL 查询中,该查询已经有一个 WHERE 子句。

例如,在下面的示例中很容易看出如何将附加表达式附加到第一个查询,并且它仍然是一个合法的表达式。

SELECT * FROM mytable WHERE col1 = 'off'
SELECT * FROM mytable WHERE col1 = 'off' OR '1'='1' -- '

但是 GRANT 本身就是一个语句。它不能像那样附加到另一个查询。无法将 GRANT 与 SELECT 语句结合使用。

SELECT * FROM mytable WHERE col1 = 'off' OR GRANT ALL ON *.* TO ...

这不是合法的 SQL 查询。您可以研究online syntax reference for SELECT和其他类型的语句。

SQL 注入的工作原理是诱使应用程序执行一个 SQL 语句,该语句的语法与最初预期的 SQL 语句不同。但它不能使 invalid 语法起作用!