前言
本来想认真记录并复盘的,结果实在是打得太烂了,只能以复盘+日记为主了。
WP 整理
先整理了一下其他师傅的 WP
AWDP
- php-master(web-pwn)
- time-capsule(web)
- blog(web)
- ccforum(web)
- chatroom(web)
- rng-assistant(web)
- prompt(pwn)
- typo(pwn)
- post_quantum(pwn)
ISW
- 应急响应
- 数据库管理系统
- Web-Git
- CCB2025
writeup
应急响应
:2025 长城杯 & 国赛 半决赛 ISW | Target Machines WriteUpphp-master
time-capsule
应急响应
数据库管理系统
Web-Git
:2025 CISCN&长城杯半决赛部分题解 | 溴化锂的笔记本typo(pwn)
:[原创]长城杯2025 pwn-typo| 看雪 狗狗不赖啊post_quantum(pwn)
prompt(pwn)
typo(pwn)
:2025ciscn&ccb浙江赛区半决赛 | j1yatypo(pwn)
prompt(pwn)
php-master(web-pwn)
post_quantum(pwn)
[原创]CCBCISCN半决赛-AWDP-Pwn | 看雪 imLZH1ccforum(web)
rng-assistant(web)
php-master(web-pwn)
应急响应
数据库管理系统
Web-Git
https://jbnrz.com.cn/index.php/2025/03/16/2025-ciscn-x-ccb-semi/typo(pwn)
prompt(pwn)
post_quantum(pwn)
应急响应
第二届长城杯ciscn半决赛awdp pwn以及应急响应wp | rbpphp-master(web-pwn)
prompt(pwn)
typo(pwn)
post_quantum(pwn)
rng-assistant(web)
CISCN 2025 半决赛 writeup by 0psu3rng-assistant(web)
ccforum(web)
typo(pwn)
prompt(pwn)
post_quantum(pwn)
Web-Git
应急响应
数据库管理系统
CCB2025
2025 CISCN&CCB Half-Final WPtypo(pwn)
ciscn & 长城杯 2025半决赛 pwn typotypo(pwn)
CISCN && 长城杯 2025半决赛 Pwn-typo wp(含附件)time-capsule(web)
CISCN&长城杯2025半决赛awdp复现——TimeCapsule Err0r233rng-assistant(web)
php-master(web-pwn)
ccforum(web)
应急响应
Web-Git
CISCN&长城杯2025半决赛复盘 Err0r233CCB2025
复现
线下时主要再打 RNG,现在复现一下 RNG 试试。
rng-assistant(web)
break
目录结构
1 | . |
比赛时看了好久没打出来(不过天津赛区好像最后也双双爆零哈哈),事后看了师傅们的 wp 感觉还不算很离谱,如果对 redis&SSTI 更敏感的话应该能做出来
app.py
开局将 flag.py
import
了,目前看可以考虑从 app.py
下手,或直接读取文件
整理一下路由
1 | / |
/register
/login
常规的注册登录,/ask
带模板的问,/admin/raw_ask
直接控制提示词,/admin/model_ports
注意到可以自由设定端口。
很自然的想到 /admin/model_ports
写 6379
端口,然后 /admin/raw_ask
能直接发送请求(像 SSRF
一样),测试一下也确实能连到 redis
,但是权限极低,无法写入文件,(赛后尝试)无法主从复制。
仔细分析一下危险部分:
第一个是 model_query
函数,首先试图读取 redis
缓存,没有则请求模型,但有则直接返回,没有可利用的点,比赛时就卡这了。
第二个是 PromptTemplate
类的 get_template
函数,会尝试读取缓存或读取本地文件,之后在 get_prompt
函数中进行了 .format(t=self)
处理。template_id
不可控,无法让他从读取 math-v1.txt
转而读取 ../flag.py
,但是 redis
缓存是可以的,只要指定一个键 prompt:math-v1
即可。
第三是 /ask
路由会同时返回 answer
和 prompt
,前者是无用的,后者恰好是我们需要的,保证我们能够看到被模板注入后的提示词。
整个 exploit
流程如下
1 | 注册账号 -> 登录账号 -> 注册模型 -> SSRF redis 写入缓存 -> /ask SSTI 模板注入 |
exploit
脚本如下
P.S. 搓了一个 python 解析 HTTP 报文的代码,不知道实用与否。
1 | import requests |
最后从 prompt
中拿到一大串东西,找到 FLAG
即可
fix
修不出来,十次全爆了,当时排行榜上也无解,官方也不给 check
脚本(强烈建议所有 AWDP
比赛放出 check
脚本,不然打完根本学不到什么东西),加上题目描述说用 sed
,乱上加乱(听说不用 sed
,直接替换也行,但是没试出来),网上没找到哪位师傅线下做出来了的。
下面介绍一下我 check
错的主要方案:
- 定位错了路径:exp 利用成功
- 直接删除
app.py
:异常 - 直接ban掉整个api,exp利用成功(rnm)
第五次 check:
update.sh
1 |
|
结果: exp利用成功
第九次 check:
app.py
中 manage_model_ports
后直接 return jsonify({"error": "Access denied"}), 403
update.sh
1 |
|
结果: exp利用成功
总结:人崩溃了,似都不知道怎么似的
20250409
日记
看别的师傅经常在线下赛的博客上记录一下,我也想试试
20250315
早上六点出发。坐上飞机,从起飞睡到降落,下机的时候着急忙慌,耳机挂在了前座,走到廊道发现不对劲,又折返回飞机上找耳机(悲)。
下午步行去天津理工大学试验环境,同时试了以下前些天搭建的 TailChat 聊天室,很好用(除了大文件上传),同时听到旁边队伍的几位师傅似乎也有在讨论聊天室的搭建。
赛中的 fix 是真的抽象,队友pwn✌修的明明和赛后其他师傅的方案一样,但是当时就是 check 不过,我自己的RNG也不过,难受。
有想法打几个 AWDP 的比赛练练手,主要是完全不知道该如何去修这东西,也不知道 check 的机制。也许可以尝试出一次题来看看出题者的视角?
赛中去卫生间竟然只是简单登记,真的不会有人浑水摸鱼吗?
天津理工的花很好看,非常好看。
__END__