(sql injection)sqli-lab 15: where 子句中的不可理解的行为

Posted

技术标签:

【中文标题】(sql injection)sqli-lab 15: where 子句中的不可理解的行为【英文标题】:(sql injection)sqli-lab 15:ununderstandable behavior in where clause 【发布时间】:2021-04-05 18:34:24 【问题描述】:

我正在学习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。)

【问题讨论】:

需要更多数据。 sleep(13) 是延迟 23 秒还是其他什么? sqli-labs 网站:github.com/Audi-1/sqli-labs 我在mysql前面执行了sql语句select * from users where username=1 or sleep(13) and password=1 limit 0,1; ,但是查询很久后无法返回,状态栏一直显示“Execute Query...”。 等了2点49分,结果返回了,一头雾水。 :-( @tadman 也许我部分找到了第一个问题的答案。在用户表中,有14条记录。我在mysql前面重新运行了sqlselect * from users where username=1 or sleep(3) and password=1 limit 0,1; ,花了39秒。(14 * 3 =预计 42 秒。)所以也许答案是 sql 语句 select 被执行了 13 次。但为什么不是 14 次呢?如果我删除 12 条记录并在表中保留 2 条,则执行时间将是预期的 6 秒。 【参考方案1】:

我找到了问题2的答案:

SQL 先执行最里面的子查询,然后执行下一级。子查询的结果就是主查询的查询条件。所以在这种情况下,查询顺序是子查询->主查询

答案来自: In which sequence are queries and sub-queries executed by the SQL Engine

【讨论】:

以上是关于(sql injection)sqli-lab 15: where 子句中的不可理解的行为的主要内容,如果未能解决你的问题,请参考以下文章

(sql injection)sqli-lab 15: where 子句中的不可理解的行为

Mysql sql inject入门篇sqli-labs使用 part 315-17

SQL注入:sqli-labs:5~6 double injection(Query)

Mysql sql inject入门篇sqli-labs使用 part 418-20

sqli-labs less24 POST- Second Order Injections *Real treat* -Stored Injections (二次注入)

2017.8.22 sqli-labs 题目 刷起来!!