GHCTF-WEB-XXE进阶实战:从敏感信息泄露到CVE-2024-2961漏洞利用的曲折之路

张开发
2026/5/22 17:18:52 15 分钟阅读
GHCTF-WEB-XXE进阶实战:从敏感信息泄露到CVE-2024-2961漏洞利用的曲折之路
1. XXE漏洞基础与敏感信息泄露实战XXEXML External Entity漏洞是Web安全中常见的攻击面本质上是一种利用XML解析器处理外部实体时的缺陷。在实际渗透测试中XXE往往能成为打开内网大门的钥匙。我去年在一次企业红队评估中就遇到过这样的案例目标系统仅开放了一个XML数据接口但通过精心构造的实体注入最终拿到了整个内网的拓扑图。理解XXE漏洞的关键在于掌握XML解析器的工作机制。当服务器接收到XML数据时如果配置不当解析器会执行DOCTYPE中定义的外部实体引用。比如下面这个经典payload!DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd ] userxxe;/user这个简单的例子就能让服务器返回/etc/passwd文件内容。但在真实环境中情况往往更复杂。最近在GHCTF比赛中遇到的WEB-EZ ReadFile题目就是个典型场景。题目表面是个简单的文件读取挑战但需要先构造MD5碰撞才能触发漏洞点。这里有个实用技巧遇到这种需要特定条件的情况直接搜索现成payload比从头研究算法更高效。我当时用的就是这两个魔法值a%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 b%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2通过这两个值绕过MD5校验后就能进行常规的文件读取操作了。但问题来了当你能读取任意文件时应该优先查看哪些目标根据我的经验这个检查清单最实用系统配置文件/etc/passwd、/etc/shadow需要root权限Web服务器配置/etc/apache2/apache2.conf、/etc/nginx/nginx.conf环境信息/proc/self/environ、/proc/version日志文件/var/log/apache2/access.log源码文件通过../目录穿越查找网站源码在GHCTF这道题中通过读取/proc/self/mounts文件发现了关键线索——目标运行在Docker容器内。这就引出了下一个重点容器环境下的敏感文件定位技巧。2. 容器环境下的路径推断与信息收集现代Web应用越来越多地采用容器化部署这给渗透测试带来了新的挑战。去年给某金融公司做审计时我花了三天时间才摸清他们的容器编排结构。容器环境最麻烦的就是路径的不确定性但有几个固定套路可以帮你快速定位首先通过/proc目录下的文件可以获取大量容器信息。比如/proc/self/cgroup显示容器ID/proc/mounts查看挂载点信息/proc/net/arp内网设备信息在GHCTF这道题中关键突破点是发现了docker-entrypoint.sh文件。这个文件通常包含容器启动时的初始化逻辑比如创建flag文件。通过目录穿越爆破比如尝试../../../../docker-entrypoint.sh最终在根目录找到了这个文件其中赫然写着echo $FLAG /f1wlxekj1lwjek1lkejzs1lwje1lwesjk1wldejlk1wcejl1kwjelk1wjcle1jklwecj1lkwcjel1kwjel1cwjl1jwlkew1jclkej1wlkcj1lkwej1lkcwjellag这就是典型的CTF出题思路——把flag放在随机命名的文件里。实际渗透中可能不会这么直接但原理相通通过容器的初始化脚本寻找关键文件位置。对于Docker环境这几个路径值得重点关注/var/lib/docker/overlay2/[container_id]/diff容器层文件系统/run/containerd/[container_id]运行时文件/etc/docker/daemon.jsonDocker守护进程配置如果发现目标使用Kubernetes则要转向查找/var/run/secrets/kubernetes.io/serviceaccount/etc/kubernetes/manifests~/.kube/config3. 从XXE到RCECVE-2024-2961漏洞利用剖析当文件读取无法直接获取flag时就需要考虑升级到RCE远程代码执行。这就是GHCTF题目的进阶考点——利用CVE-2024-2961漏洞实现权限提升。这个今年新曝出的PHP漏洞影响范围很广我在三个客户的生产环境都发现过它的踪迹。漏洞原理简单来说是PHP的filter链在特定配置下可以被构造用来执行任意代码。核心利用点是php://filter/convert.iconv.UTF8.CSSCII/resourcedata://text/plain;base64,[base64编码的payload]但实际操作中会遇到各种坑。比如在GHCTF题目中官方提供的利用脚本需要修改才能适配题目环境。我尝试时遇到了三个典型问题堆溢出错误由于题目额外需要MD5碰撞参数直接使用原脚本会导致内存错误Magic number不匹配目标PHP版本与脚本预期不符依赖冲突ten库的安装经常出问题经过多次调试有效的利用流程应该是# 先安装必要依赖 python3 -m pip install pwntools git clone https://github.com/cfreal/ten cd ten pip install . # 然后执行改造后的攻击脚本 python exploit.py http://target/?amagic1bmagic2 echo ?php system($_GET[cmd]);? shell.php这个漏洞的利用有个巧妙之处它通过filter链的多次转换最终使PHP引擎错误处理字符编码从而执行任意指令。实际测试中成功率取决于PHP的编译选项这也是为什么有些环境无法复现。4. 渗透测试中的失败经验总结在GHCTF这道题的最后阶段我并没能成功利用CVE-2024-2961拿到shell。这种失败经历在真实渗透中其实更为常见。去年某次银行渗透时我在XXE到RCE的升级路上卡了两周最终是通过完全不同的路径拿下的系统。从这次失败中我总结了几个关键教训技术层面不要过度依赖单一漏洞利用路径我花了太多时间死磕CVE-2024-2961当标准exp不工作时要检查目标环境的特殊性如题目中的MD5校验保持多个备选方案比如同时尝试log poisoning、phar反序列化等工具层面自动化工具组合使用效果更好Nuclei用于快速指纹识别Xray做深度漏洞扫描Goby可视化整理资产心态层面遇到障碍时及时记录当前进展每两小时回顾已有信息避免钻牛角尖必要时暂停攻击重新审视信息收集阶段的数据这道题虽然最终通过读取docker-entrypoint.sh解决了但XXE到RCE的升级思路在实际工作中更为重要。真正的渗透测试很少会给你预设好的flag文件必须学会在有限条件下创造突破口。

更多文章