[ 首页 ] [ 渗透测试 ] [ 黑客接单 ] [ 黑客技术 ] [ 黑客论坛 ] [ 黑客松 ]



标题 : XXE 完整指南:影响、示例和预防
日期 : 2023-07-17

什么是 XXE(XML 外部实体)漏洞?

12 分钟阅读

XML 外部实体 (XXE) 是一种应用程序层网络安全攻击,它利用 XXE 漏洞来解析 XML 输入。当配置不当的解析器通过通向外部实体的路径处理 XML 输入时,就可能发生 XXE 攻击。这可能会以多种方式损害组织,包括拒绝服务 (DoS)、敏感数据暴露、服务器端请求伪造 (SSRF) 以及从解析器位置进行端口扫描。 

XML 文档是使用 XML 1.0 标准定义的,其中包括存储数据的“实体”的概念。多种实体可以通过系统标识符本地或远程访问数据。外部实体或外部通用参数解析实体可以请求和接收数据,包括机密数据。 

XRL 处理系统假定声明的系统标识符是可访问的 URL。当处理命名实体时,处理器用标识符中取消引用的内容替换每个实体实例。如果这些内容包含有缺陷或被操纵的数据,XML 处理器将取消引用(访问)该数据,从而可能向外部实体泄露敏感信息。该技术允许应用程序访问其他受保护的数据。 

其他相关的攻击类型使用类似的向量将外部资源包含在应用程序的内部处理中。这些攻击可能使用外部文档类型定义 (DTD)、样式表或架构。 

在本文中:

  • XXE注射有什么影响?
  • XXE 攻击负载的 5 个示例
    • 资源耗尽攻击
    • 数据提取攻击
    • SSRF 攻击
    • 文件检索
    • 盲XXE
  • 如何防止 XML 外部实体注入
    • 具有自定义规则的托管 WAF
    • 应用服务器仪表

XXE注射有什么影响?

XXE 攻击可能会对易受攻击的应用程序及其连接的其他系统产生影响。

在目标应用程序上,攻击者可能能够检索密码等敏感数据,或执行目录遍历以访问本地服务器上的敏感路径。XXE 还可用于通过访问大量资源或在本地服务器上打开过多线程来执行某种类型的拒绝服务 (DoS) 攻击。 

在其他连接的系统上,攻击者可能会利用对目标应用程序的访问权限来访问网络上的其他目录、执行端口扫描或执行服务器端请求伪造 (SSRF) 攻击。

在极端情况下,XML 处理器库可能容易受到客户端内存损坏问题的影响,这可能允许在应用程序的权限下远程执行代码。 

XXE 攻击负载的 5 个示例

资源耗尽攻击

最基本的基于 XML 的攻击虽然不是严格意义上的外部 XML 实体攻击,但却是所谓的“十亿笑”攻击。这种攻击在大多数现代 XML 解析器中都得到了缓解,但可以帮助说明 XML 攻击是如何工作的。

采用以下定义新 XML 实体的 DOCTYPE 定义:

<?xml version=”1.0″encoding=”utf-8″?>
<!DOCTYPE 笑 [
    <!ELMENT 笑 ANY>
    <!ENTITY LOL “LOL”>
    <!ENTITY LOL1 “&LOL1;&LOL1;&LOL1;&LOL1;&LOL1 ;&LOL1;&LOL1;”>
    <!实体 LOL2 “&LOL2;&LOL2;&LOL2;&LOL2;&LOL2;&LOL2;&LOL2;”> <!实体 LOL3 “&LOL3;&LOL3;&LOL3;&LOL3;&LOL3;&LOL3;&LOL3;”
    >
] >
<笑>&LOL3;</笑>

XML 解析器解析此代码并扩展每个实体,生成大量“LOL”。 

上面的示例生成了数百个 LOL 字符串,但在完整的示例中,代码可能会生成数十亿行输出,耗尽服务器上的内存。实现相同效果的另一种方法是引用非常长或无限的字符串,例如 Linux 操作系统上的 /dev/urandom 字符串。

数据提取攻击

当涉及外部实体时,XML 攻击会变得更加有趣。外部实体(在攻击者控制的服务器上定义)可以引用本地服务器上的 URI 以从文件系统检索敏感内容。大多数服务器使用相同的目录来存放敏感系统文件,这使得攻击者很容易实现这一目标。

例如,以下代码将返回在易受攻击的 Linux 系统上定义登录设置的 login.defs 文件的内容:

<?xml version=”1.0″encoding=”utf-8″?>
<!DOCTYPE 恶意 [
    <!ELEMENT 恶意 ANY>
    <!ENTITY 外部系统 “file:////etc/login.defs”>
]>
<恶意>&外部;</恶意>

XXE 攻击的另一个重要元素是它们可用于扫描端口或从连接到目标系统的其他主机检索数据。例如,如果目标系统可以连接到 IP 地址 10.0.0.5 上的文件服务器,则攻击者可以从服务器检索敏感数据,如下所示:

<?xml version=”1.0″encoding=”utf-8″?>
<!DOCTYPE 恶意 [
    <!ELEMENT 恶意 ANY>
    <!ENTITY 外部系统 “http://10.0.0.5/sensitive.txt”>
]>
<恶意>&外部;</恶意>

相关内容:阅读我们的数据泄露指南

SSRF 攻击

攻击者不仅可以使用 XXE 攻击来检索敏感数据。另一个可能的影响是,XXE 可用于执行服务器端请求伪造(SSRF)。SSRF 攻击涉及攻击者利用服务器端应用程序向服务器可以访问的任何 URL 发出 HTTP 请求。

为了通过 XXE 漏洞执行 SSRF 攻击,攻击者需要使用他们想要从服务器访问的目标 URL 定义外部 XML 实体,并在数据值中使用该实体。如果攻击者设法将此数据值放入应用程序响应中,他们将能够在应用程序响应中看到 URL 的内容,从而允许与后端系统进行双向交互。如果应用程序响应不可用,攻击者仍然可以执行盲目 SSRF 攻击。

以下是导致服务器向组织网络内的内部系统发出后端 HTTP 请求的外部实体的示例:

<!DOCTYPE 恶意 [ <!ENTITY 外部系统 “http://sensitive-system.company.com/”> ]>

相关内容:阅读我们的SSRF指南

文件检索 

攻击者利用 XXE 检索包含文件内容的外部实体定义的文件。应用程序在其响应中发送文件。要执行此类 XXE 注入攻击并从服务器的文件系统检索任意文件,攻击者必须通过以下方式修改 XML:

  • 引入或编辑 DOCTYPE 元素,定义具有目标文件路径的实体。
  • 编辑应用程序返回的提交的 XML 中的数据值,并使用它定义的外部实体。

盲XXE

攻击者利用盲目 XXE 漏洞来检索或窃取数据。例如,攻击者可以窃取带外数据,诱导应用程序服务器将敏感数据发送到他们控制下的外部系统。

攻击者还可能利用盲目 XXE 来接收包含敏感数据的错误消息。攻击者触发解析暴露数据的错误消息。

如何防止 XML 外部实体注入

以下是组织中防止 XXE 攻击的两种常见方法。

具有自定义规则的托管 WAF

Web 应用程序防火墙 (WAF) 保护组织网络边界的应用程序层(网络第 7 层)。它拦截网站和 Web 应用程序的传入和传出流量。WAF 监视和过滤传入和传出的数据包和 HTTP 请求,阻止与已知攻击模式或 WAF 管理员定义的特定规则匹配的数据包或请求。 

大多数 WAF 解决方案都有内置规则,可以阻止明显的 XXE 输入。高级 WAF 产品还可以检测不明显的 XXE 攻击,使用行为分析来了解哪些 XML 实体看起来可疑或表现出异常行为。结合WAF管理员定义的允许列表和拒绝列表,即使不修复底层易受攻击的组件,也可以为XXE漏洞提供良好的解决方案。

应用服务器仪表

应用程序服务器检测 (ASI) 是一种通过将检查点注入应用程序代码的特定部分来监视运行时执行流程的技术。向服务器添加安全传感器可以让您实时了解每个请求的应用程序架构和数据流。仪器是动态测试解决方案的核心组件,例如运行时应用程序自我保护(RASP)和交互式应用程序安全测试(IAST)。

检测对于防止 XXE 攻击非常有用。ASI 可以监视 XML 处理中涉及的关键类并验证与远程 DTD 相关的任何活动。XML 解析器可能是应用程序第三方代码的一部分,并且由于现代应用程序中的组件数量庞大,因此您不能依赖手动配置。Instrumentation 无需手动验证,可自动检测 XXE 漏洞。

除了检测攻击之外,仪器还可以主动预防攻击。例如,它可以阻止通过 XML 实体执行外部代码,并对 XML 相关请求进行速率限制,从而显着降低 XXE 相关 DoS 攻击的风险。
 

结论

在本文中,我们解释了 XXE 攻击的工作原理,并涵盖了以下类型的 XXE 攻击负载:

  • 资源耗尽攻击– 使用 XML 实体递归重复内容的攻击,导致服务器拒绝服务。
  • 数据提取攻击– 使用外部实体访问服务器或连接系统上的 URI 的攻击。
  • SSRF 攻击– 使用外部实体从服务器端应用程序向服务器可以访问的另一个 URL 发出 HTTP 请求的攻击。
  • 文件检索– 使用外部实体直接从服务器检索敏感文件的攻击。
  • 盲目 XXE – 诱导应用程序服务器将敏感数据发送到攻击者控制下的外部系统,或在错误消息中显示敏感数据的攻击。

最后,我们回顾了两种 XXE 预防方法 – 配置自定义 WAF 规则以阻止 XXE 通信,以及执行应用程序服务器检测。