从XXE到RCE:一次Vulnhub靶场渗透中,我是如何层层解码拿到Flag的?
从XXE到RCE一次Vulnhub靶场渗透的技术侦探之旅1. 靶场环境搭建与初始侦察Vulnhub靶机总是像未拆封的礼物盒你永远不知道里面藏着什么惊喜。这次我选择的是XXE主题靶场解压OVA文件后导入VirtualBox。启动时遇到个小插曲——靶机IP没有自动显示在VirtualBox界面。解决方法很简单# 在VirtualBox网络设置中勾选启用网络适配器和连接方式桥接网卡确认靶机上线后经典的ARP扫描登场arp-scan -l --interfaceeth0发现目标IP是192.168.1.105接着用Nmap进行端口扫描nmap -sV -p- 192.168.1.105结果只开放了80端口访问后是Apache默认页面。这时候Dirsearch成了我的探照灯python3 dirsearch.py -u http://192.168.1.105 -e php,html,txt提示在真实渗透测试中建议同时使用gobuster等工具进行交叉验证避免漏报扫描结果中/robots.txt像是一扇半开的门里面赫然躺着几个关键路径/admin.php/index.php/config.inc2. XXE漏洞的发现与利用艺术访问/admin.php出现XML格式的登录表单这立刻触发了我的XXE雷达。Burp Suite抓包后发现请求体确实是XML格式creds nameadmin/name password123456/password /creds经典的XXE Payload构造如下!DOCTYPE foo [ !ENTITY xxe SYSTEM php://filter/convert.base64-encode/resourceadmin.php ] creds namexxe;/name password123/password /creds服务器返回的base64解码后得到了admin.php的源码片段if ($_POST[username] administhebest md5($_POST[password]) e6e061838856bf47e1de730719fb2609) {这里有几个关键发现硬编码用户名administhebestMD5密码哈希e6e061838856bf47e1de730719fb2609使用彩虹表破解得到明文密码是hackthebest。成功登录后页面出现一个flag链接但点击返回404。这时我意识到需要继续利用XXE读取其他文件。3. 编码迷宫的破解之道通过XXE读取/flagmeout.php得到一段base64编码的内容!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) --这串字符的特征明显全部大写字母和数字长度32字符包含数字2-7典型的Base32编码特征使用Python解码import base64 encoded JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5 decoded base64.b32decode(encoded).decode(utf-8) print(decoded) # 输出/s3cret_fl4g_xxxx.php继续用XXE读取这个路径得到了一段令人困惑的PHP混淆代码。这类代码通常有几种特征大量使用短变量名$_, $__等频繁的自增操作字符串拼接操作4. PHP混淆代码的分析与执行环境面对这段天书般的代码我采取了分步策略变量追踪发现代码主要利用PHP的变量变量特性字符拼接通过自增操作构建最终执行的命令版本测试注意到注释提示需要PHP5环境搭建PHP5测试环境docker run -it -p 8080:80 --name php5 -d php:5.6-apache将混淆代码保存为test.php后访问最终输出了flag。这里的关键发现是代码利用了PHP5的特性差异通过动态变量名构建了system()调用最终执行的命令是打印flag文件内容5. 渗透测试者的思维工具箱这次挑战教会我几个重要经验链式思维XXE→源码泄露→密码破解→路径发现→编码转换→代码审计编码识别技巧编码类型特征识别方法Base64结尾常带字母大小写数字/Base32全大写数字不含1,8,9等数字Hex0-9,a-f偶数长度PHP混淆代码分析步骤提取所有变量名跟踪变量变化流程重建字符串拼接在安全环境测试6. 防御视角的反思站在防守方角度这个靶场暴露了几类常见问题XXE防护缺失应禁用外部实体加载libxml_disable_entity_loader(true);敏感信息硬编码密码不应以MD5形式存储在源码中建议使用password_hash()过度信任客户端所有输入都应视为不可信需要严格的输入过滤这次靶场就像一场精心设计的密室逃脱每个线索都环环相扣。最让我印象深刻的是最后那个PHP混淆代码——它提醒我们在渗透测试中耐心和系统性的分析方法往往比工具本身更重要。