我正在使用工具扫描我的应用程序中潜在的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手册或其他地方寻找什么......
答案 0 :(得分:1)
加号是连接。它所以他们可以在你的声明中运行额外的SQL。他们也会使用或。 select 0就是它返回0.而最后一部分是我认为的别名。您应该在执行之前准备好sql。永远不要允许对服务器运行直接的SQL
答案 1 :(得分:1)
+
是一个几乎没有任何作用的一元运算符。好吧,我认为它会将任何值转换为数字。它类似于-
,但不更改符号。
在这种情况下,它正在对子查询的结果做一些事情。当然结果已经是一个数字。它可能会欺骗优化器,因此子查询不会被优化掉。这是猜测。
qsqli_1111
更容易解释。它是一个表别名,需要它来防止语法错误。