在网络安全领域,XXE(XML External Entity Injection,XML外部实体注入)漏洞因其潜在的高危性而备受关注。它允许攻击者通过构造恶意的XML数据,诱导服务器解析并加载外部实体,从而实现任意文件读取、SSRF、命令执行甚至内网端口扫描等攻击行为。

然而,许多初学者在学习XXE漏洞时,常常误以为所有“伪协议”都能在XXE中使用,导致测试失败或产生误解。本文将深入剖析XXE漏洞中支持的协议类型,并重点指出哪些伪协议是不被支持或无法利用的,帮助你精准掌握攻击边界,提升实战效率。
XXE漏洞原理简述
XXE漏洞的核心在于:当应用程序使用存在缺陷的XML解析器(如旧版libxml2)处理用户提交的XML数据时,未禁用外部实体的加载功能。攻击者便可利用<!ENTITY>声明,通过SYSTEM关键字引入外部资源。
例如,读取本地文件:
这里的file://就是一种协议,用于读取本地文件系统内容。
XXE漏洞中常见的支持协议
根据实际测试与公开资料(如CSDN、Pikachu靶场等),XXE漏洞在不同语言和解析器环境下,支持的协议有所不同。以下是常见且可被利用的协议:
| 协议 | 用途 | 示例 |
|---|---|---|
file:// | 读取本地文件 | file:///c:/windows/win.ini |
http:// / https:// | 加载远程DTD或发送数据(OOB) | http://attacker.com/evil.dtd |
ftp:// | 读取FTP资源(较少见) | ftp://user:pass@host/file |
php://filter | 读取并编码文件(常用于无回显XXE) | php://filter/read=convert.base64-encode/resource=config.php |
expect:// | 仅限PHP安装expect扩展时,可执行系统命令 | expect://id |
⚠️ 注意:
php://filter和expect://依赖PHP环境,file://需要绝对路径。
XXE漏洞支持的伪协议不包括哪些?
尽管XXE支持多种协议,但并非所有“伪协议”都能在该场景下使用。以下是在XXE中通常不支持或无法利用的伪协议:
❌ 1. data:// 协议(受限严重)
虽然data://可用于PHP文件包含漏洞(如LFI),但在大多数XML解析器中,data://无法直接用于外部实体加载。
原因:XML解析器在解析
SYSTEM实体时,通常不支持data:这种内联数据协议,尤其是在libxml2等主流库中。
✅ 例外情况:可通过间接方式绕过,例如结合文件上传,将
data://内容写入临时文件,再通过file://引用。
❌ 2. phar:// 协议
phar://主要用于反序列化漏洞或文件包含,但在XXE中无法直接用于外部实体注入。
原因:
phar://需要特定的PHP函数(如include、file_get_contents)才能触发解析,而XML解析器不会将其视为可加载的实体源。
❌ 3. zlib:// / compress.bzip2:// 等压缩协议
这些协议用于读取压缩文件,但在外部实体上下文中通常不被支持。
原因:虽然PHP的
file_get_contents支持这些协议,但XML解析器在处理SYSTEM实体时,往往不解析压缩流。
❌ 4. glob:// 协议
glob://用于文件系统模式匹配(如列出目录),但不能用于外部实体加载。
原因:
glob://返回的是文件列表资源,而非可读取的文件内容流,不适用于实体注入。
❌ 5. mailto:// / jar:// / netdoc:// 等非常用协议
这些协议在特定场景下有用途,但在XXE攻击中基本不可用:
mailto://:用于发送邮件,无法读取内容。jar://:用于Java环境,Web应用中极少支持。netdoc://:网络文档协议,支持度极低。
为什么这些协议不被支持?
根本原因在于:XML解析器的外部实体加载机制依赖底层库(如libxml2)对URL协议的支持。这些库通常只实现常见的文件和网络协议(file, http, ftp),而对PHP特有的流包装器(如php://, data://, phar://)支持有限或需要额外配置。
此外,安全机制(如allow_url_fopen=Off)也会限制协议使用。
如何判断XXE支持哪些协议?
有回显测试:使用
file://读取已知文件(如/etc/passwd或c:\windows\win.ini)。无回显测试:通过
http://外带数据,验证是否可发起网络请求。PHP环境探测:尝试
php://filter读取文件并Base64编码,确认是否支持。命令执行测试:仅当确认PHP安装
expect扩展时,才尝试expect://id。
防御XXE漏洞的正确姿势
禁用外部实体:在代码中关闭外部实体解析。
使用安全的解析器:避免使用过时的libxml2版本(<2.9)。
输入过滤:过滤或转义XML中的
<!DOCTYPE>、<!ENTITY>等关键字。最小权限原则:Web服务运行在低权限账户下,限制文件读取范围。
| 协议 | 是否支持XXE | 说明 |
|---|---|---|
file:// | ✅ | 最常用,读取本地文件 |
http(s):// | ✅ | 加载远程DTD或外带数据 |
php://filter | ✅(PHP) | 无回显时编码读取文件 |
expect:// | ⚠️(极少见) | PHP需安装expect扩展 |
data:// | ❌ | 通常不支持 |
phar:// | ❌ | 不适用于实体加载 |
zlib:// | ❌ | 压缩协议不被解析 |
glob:// | ❌ | 无法读取内容流 |
XXE漏洞支持的伪协议不包括 data://、phar://、zlib://、glob://、mailto:// 等。攻击者应聚焦于file://、http://和php://filter等有效协议,避免在无效路径上浪费时间。
掌握这些边界,不仅能提升渗透测试效率,更能帮助开发者精准防御,筑牢安全防线。





















