buuctf [GXYCTF2019]BabySQli
抓包发现一串密文:
MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5
这是一串base32编码,base32编码特征是只有大写字母和数字
解密后:c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==
这是一串base64编码,base64编码特点是有大小写字母和数字而且末尾常常是等于号
解码 得到:select * from user where username = '$name'
意思是让我们从登录名进行注入
这个题目过滤了蛮多常用查询字符,可以bp抓包 fuzz一下
显示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值 但是本来没有 我们利用联合查询特性构造了一个无中生有 于是能成功登录