问题描述
我正在学习sql注入,我在我的电脑中设置了sqli-lab环境(windows+PHP+MysqL 5.5.53)。
我在解决sqli-lab 15的时候遇到了两个问题。 这个问题的源代码如下:
@$sql="SELECT username,password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
- 当我将帖子数据
uname=1' or sleep(3)%23&password=2
提交到 urlhttp://127.0.0.1/sqli-labs/Less-15/
时,响应延迟了大约 13.18 秒,预计为 3 秒。为什么会发生这种情况? - 在我之前的知识中,当
and
之前的条件为真时,and
之后的语句被执行。发布数据uname=1' and sleep(3)%23&password=2
后,结果按预期立即返回。但是当我用sqlmap测试这个url的时候,发现sqlmap的payload是这样的:uname=1' and (SELECT * FROM (SELECT(SLEEP(2)))IkiC)%23&passwd=2
,而且sleep函数被准确执行了。那为什么会这样呢?(这不是表users中的unname 1。)
解决方法
我找到了问题 2 的答案:
SQL 先执行最内层的子查询,然后再执行下一层。子查询的结果就是主查询的查询条件。所以在这种情况下,查询顺序是子查询->主查询
答案来自: In which sequence are queries and sub-queries executed by the SQL Engine