【联合注入添加临时虚拟用户】GXYCTF2019 BabySQli WriteUp

本文最后更新于:2021年8月18日下午1点46分

联合注入添加临时虚拟用户:

在查询过程中如果数据库中没有对应的结果,会临时创建一个虚拟用户

举例

这是查询前的表
[GXYCTF2019]BabySQli(联合注入添加临时虚拟用户)

接着我们尝试查询一个不存在的数据.

[GXYCTF2019]BabySQli(联合注入添加临时虚拟用户)

可能这样还不够直观,通过联合查询将直观性体现出来.(联合查询时注意列数)

[GXYCTF2019]BabySQli(联合注入添加临时虚拟用户)

WriteUp:

首先,拿到题目,是一个登录框页面

image-20210529133533969

输入adminadmin,回显如下

image-20210529133558660

可以发现,在URL中没有直接显示,应该是利用POST传输表单

burpsuite截一下包

image-20210529133736448

看到回显里有一段注释,猜测是使用base加密的一段文字

1
2
3
4
5
MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
经过base32解码后
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==
看到有等号,再使用base64解码
select * from user where username = '$name'

可以看到,hint里应该是存在联合注入的漏洞

先用常规方法,利用order by查看当前字段

image-20210529134145031

回显如下:

image-20210529134156949

可以看到,是被过滤掉了

尝试使用大小写绕过,POST传参如下:

1
name=admin' Order by 4#&pw=admin

image-20210529134256209

可以看到数据表中没有4个字段

最终确定数据表中一共有3个字段

image-20210529134409323

image-20210529134419104

一般来说,登录框中的三个字段,第一个一般是id,第二个是用户名,第三个是密码

这时候可以使用联合注入,创建一个虚拟表,如下:

1
select 'd','ddd','dddd','dddd',5555l

[GXYCTF2019]BabySQli(联合注入添加临时虚拟用户)

而根据题目给的hintselect * from user where username = '$name'

这时候我们采用联合注入,先用'闭合掉,然后添加1adminpassword

注意,验证密码是否正确,服务器通常会先读取密码,然后进行md5加密,最终将加密后的值与数据表中的值进行比对(这里的话我们是使用了临时虚拟表,所以第三栏的password就修改成输入值后经过md5加密的值

payload如下:

image-20210529135450917

得到flag:

image-20210529135726991

flag{64693067-dc43-42e5-856c-5feafbb111ab}