目标:爱卡汽车官网APP爱买车
检测发现以下地方存在注入:(POST中的did_all,布尔盲注)
放进SQLMap中,
但发现没能跑出数据,用fiddler代理看了下SQLMap的包,又手工测试了下,发现过滤了些关键字,以下是绕过尝试全过程。
一、过滤 PK 绕过
1、刚开始发现过滤了<>,于是用=代替,成功跑出user()长度,语句如下:
2、接着爆当前用户名:ord(mid(user(),1,1))>33,发现报错(非正常返回),说明语法错误,估计哪个关键字被过滤了,于是先确定哪个关键字被过滤了,尝试如下:
1)检查mid:mid(user(),1,1)>'a',报错 => mid或单引号被过滤了
2)检查单双引号:'a'='a',"a"="a",报错 => 单双引号被过滤。
绕过方法:hex编码(a->0x61)
3)再次检查mid/substr/substring:mid(user(),1,1)>0x61,报错 => mid/substr/substring被过滤。
绕过方法:like正则。
综上,使用以下语句即可绕过过滤返回user()的值(假设是root),语句中X枚举全字符,一位一位地确定,直到枚举结束。
user() like 'X%'
user() like 'rX%'
...
user() like 'root%'
另外,因为过滤了单双引号,所以把'X%'编码下~~,因此最终语句如下:(XX自己枚举~)
3、同理,可得出database()
4、接着,爆所有数据库个数,无过滤:(所幸select、from没过滤~)
5、然后爆所有数据库名,理论上应该是
(select SCHEMA_NAME from SCHEMATA limit 0,1) like 0xXX25
结果报错,无悬念了,肯定是limit被过滤了。于是改为以下语句绕过:(多行合一)
6、接下来爆数据表,先看数据表个数(以本数据库GOCAR为例),按以上绕过原则写出以下语句,可得表个数为278:
7、爆数据表名,以GOCAR库为例,按以上绕过原则写出以下语句:
8、其他数据按照此思路爆出即可,所幸select from where都没过滤~~,此处不一一演示。
二、验证脚本(Python)
根据以上思路,写出Python批量工作,此处以爆database()为例,其他的按以上思路替换查询语句即可(程序中使用了本地代理,测试时请自行去除,否则无响应)
三、数据截图
1、当前数据库用户:GCARDBMANAGE@10.15.201.14
2、当前数据库:GOCAR
3、所有数据库,共5个
4、不妨看下GOCAR库的表,共278个,数据安全考虑,只列出前几个
其他全数据同理即可绕过全跑出来,这里就不深入了~