XXE漏洞支持的伪协议不包括哪些?全面解析攻击边界与防御策略

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

XXE漏洞支持的伪协议不包括哪些?全面解析攻击边界与防御策略

然而,许多初学者在学习XXE漏洞时,常常误以为所有“伪协议”都能在XXE中使用,导致测试失败或产生误解。本文将深入剖析XXE漏洞中支持的协议类型,并重点指出哪些伪协议是不被支持或无法利用的,帮助你精准掌握攻击边界,提升实战效率。


XXE漏洞原理简述

XXE漏洞的核心在于:当应用程序使用存在缺陷的XML解析器(如旧版libxml2)处理用户提交的XML数据时,未禁用外部实体的加载功能。攻击者便可利用<!ENTITY>声明,通过SYSTEM关键字引入外部资源。

例如,读取本地文件:

<!DOCTYPE test [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>

这里的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://filterexpect:// 依赖PHP环境,file:// 需要绝对路径。


XXE漏洞支持的伪协议不包括哪些?

尽管XXE支持多种协议,但并非所有“伪协议”都能在该场景下使用。以下是在XXE中通常不支持或无法利用的伪协议

❌ 1. data:// 协议(受限严重)

虽然data://可用于PHP文件包含漏洞(如LFI),但在大多数XML解析器中,data://无法直接用于外部实体加载

<!-- 通常无效 -->
<!ENTITY xxe SYSTEM "data:text/plain;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">

原因:XML解析器在解析SYSTEM实体时,通常不支持data:这种内联数据协议,尤其是在libxml2等主流库中。

例外情况:可通过间接方式绕过,例如结合文件上传,将data://内容写入临时文件,再通过file://引用。


❌ 2. phar:// 协议

phar://主要用于反序列化漏洞或文件包含,但在XXE中无法直接用于外部实体注入

<!-- 无效 -->
<!ENTITY xxe SYSTEM "phar://exploit.phar">

原因phar://需要特定的PHP函数(如includefile_get_contents)才能触发解析,而XML解析器不会将其视为可加载的实体源。


❌ 3. zlib:// / compress.bzip2:// 等压缩协议

这些协议用于读取压缩文件,但在外部实体上下文中通常不被支持

<!-- 一般无效 -->
<!ENTITY xxe SYSTEM "compress.zlib:///path/to/file.txt.gz">

原因:虽然PHP的file_get_contents支持这些协议,但XML解析器在处理SYSTEM实体时,往往不解析压缩流。


❌ 4. glob:// 协议

glob://用于文件系统模式匹配(如列出目录),但不能用于外部实体加载

<!-- 无效 -->
<!ENTITY xxe SYSTEM "glob:///*.txt">

原因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支持哪些协议?

  1. 有回显测试:使用file://读取已知文件(如/etc/passwdc:\windows\win.ini)。

  2. 无回显测试:通过http://外带数据,验证是否可发起网络请求。

  3. PHP环境探测:尝试php://filter读取文件并Base64编码,确认是否支持。

  4. 命令执行测试:仅当确认PHP安装expect扩展时,才尝试expect://id


防御XXE漏洞的正确姿势

  1. 禁用外部实体:在代码中关闭外部实体解析。

    // Java 示例
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
  2. 使用安全的解析器:避免使用过时的libxml2版本(<2.9)。

  3. 输入过滤:过滤或转义XML中的<!DOCTYPE><!ENTITY>等关键字。

  4. 最小权限原则: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等有效协议,避免在无效路径上浪费时间。

掌握这些边界,不仅能提升渗透测试效率,更能帮助开发者精准防御,筑牢安全防线。

发表评论

评论列表

还没有评论,快来说点什么吧~