sql 注入sqli-lab 15:where 子句中无法理解的行为

问题描述

我正在学习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";
  1. 当我将帖子数据 uname=1' or sleep(3)%23&password=2 提交到 url http://127.0.0.1/sqli-labs/Less-15/ 时,响应延迟了大约 13.18 秒,预计为 3 秒。为什么会发生这种情况?
  2. 在我之前的知识中,当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