CISCN2025 半决赛 AWDP rng-assistant
Fir3proof CTF 173浏览 · 2025-03-19 06:27

题目结构

start.sh

通过redis-cli config set save ""来禁用redis的RDB 持久化。

default.pymath-v1.py分别监听两个端口,处理来自flask的请求(实际上就是随机返回字符串)

Flask监听8000端口,nginx监听80端口作为反向代理。

默认会给非本地连接的HTTP请求添加X-User-Roleguest的请求头,可以自己传递X-User-Role头来绕过

用户注册

用户登录

用户提问

redis未授权访问

通过socket连接跟“大模型”通信,这里还设置了回答的缓存机制

提示词和对应的模型作为key,将“大模型”的回答缓存到redis中

注意到管理员可以修改模型通信端口

不难想到将这个端口修改为redis的端口6379,就可以直接未授权访问redis了。

image.png


image.png


格式化字符串漏洞

PromptTemplate#get_template首先从redis寻找模板,找到则直接返回,否则在static/prompts下找

PromptTemplate.get_template(template_id).format(t=self)这里把类对象self传入格式化字符串的上下文

/ask路由调用了generate_prompt,但没有传prompt_id

因此往redis增加键prompt:math-v1,获取模板时即可拿到我们设置的格式化字符串

flag是from flag import FLAG引入的

image.png


修复的话可以考虑两点:

禁止将端口修改为redis端口6379

PromptTemplate.get_template(template_id).format(t=self)格式化字符串时不传入self

0 条评论
某人
表情
可输入 255