带有意外加号的MySQL查询

时间:2015-11-09 15:44:02

标签: mysql sql sql-injection

我正在使用工具扫描我的应用程序中潜在的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语法加号”和“qsqli_1111”,但我找不到任何东西。我不知道在MySQL手册或其他地方寻找什么......

2 个答案:

答案 0 :(得分:1)

加号是连接。它所以他们可以在你的声明中运行额外的SQL。他们也会使用或。 select 0就是它返回0.而最后一部分是我认为的别名。您应该在执行之前准备好sql。永远不要允许对服务器运行直接的SQL

答案 1 :(得分:1)

+是一个几乎没有任何作用的一元运算符。好吧,我认为它会将任何值转换为数字。它类似于-,但不更改符号。

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

qsqli_1111更容易解释。它是一个表别名,需要它来防止语法错误。