MySQL 带有意外加号的查询

MySQL query with unexpected plus sign

我正在使用一种工具来扫描我的应用程序中潜在的 SQL 注入漏洞。我 运行 通过测试,它在表单字段中发送以下内容:

+ (SELECT 0 FROM (SELECT SLEEP(10))qsqli_1111)

这会产生如下查询(针对 MySQL 数据库):

SELECT * FROM SomeTable
WHERE SomeField IN (+ (SELECT 0 FROM (SELECT SLEEP(10))qsqli_1111))

该工具(正确地)推断可能存在 SQL 注入漏洞,因为查询比发送简单值时多花费 10 秒。 (即 SLEEP(10) 正在执行。)

我的问题是:这个语法实际上做了什么?加号在做什么? qsqli_1111 是什么?为什么会有SELECT 0 FROM?

我尝试使用谷歌搜索 "mysql syntax plus sign" 和 "qsqli_1111",但没有找到任何内容。我不知道要在 MySQL 手册或其他地方寻找什么...

加号是串联。这样他们就可以在您的声明中 运行 额外 sql 。他们也会使用或。 select 0 就是 return 0。我认为最后一部分是别名。在执行它之前,您应该准备好 sql。永远不要直接 sql 运行 攻击你的服务器

+ 是一个几乎什么都不做的一元运算符。好吧,我认为它会将任何值转换为数字。它类似于 -,但不改变符号。

在这种情况下,它正在对子查询的结果做一些事情。当然结果已经是一个数字了。它可能会愚弄优化器,因此子查询不会被优化掉。那是猜测。

qsqli_1111比较容易解释。这是一个 table 别名,需要它来防止语法错误。