(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 (二次注入)