Z1d10tのBlog

A note for myself,have fun!

buuctf [GXYCTF2019]BabySQli

抓包发现一串密文:

img

MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 这是一串base32编码,base32编码特征是只有大写字母和数字

解密后:c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw== 这是一串base64编码,base64编码特点是有大小写字母和数字而且末尾常常是等于号

解码 得到:select * from user where username = '$name'

意思是让我们从登录名进行注入

这个题目过滤了蛮多常用查询字符,可以bp抓包 fuzz一下

img

显示419就是被河蟹的 415就是正常回显

过滤了 常用的or``() 然后可以大写绕过

构造1' Order by 4# 发现报错只有三列

这里再提供一种select查询爆字段的方法

select 1,2# 报错 select 1,2,3# 正常回显也可以用来判断字段数

然后就不会了 看了其他大佬的wp

这里利用了一个mysql联合查询的特性:

union做查询时,查询的数据不存在,那么联合查询就会创建一个虚拟的数据存放在数据库中

具体可以看这篇大佬的详细wp:https://www.tqwba.com/x_d/jishu/272679.html

由于只能通过admin账户,因此让虚拟用户的名字是admin 同时密码转换成了md5存储(猜测应该是为了保护用户的隐私,md5不可逆,这就让即使身为管理员也不能知道用户密码)于是在构造的时候要注意数据库密码应该是md5模式的.同时登入时输入对应的明文密码即可。

构造:name=123'union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#&pw=1

其中 md5值为1的md5值,这里就是构造了 当后台检测1 = md(1)时为真 成功登录

其实就是 后台去查找符合密码为1的md5值 但是本来没有 我们利用联合查询特性构造了一个无中生有 于是能成功登录

本文最后更新于 天前,文中所描述的信息可能已发生改变