嘿!欢迎来到AppSec简化版的第一部分。今天,我们将探讨一个名为XML外部实体漏洞的迷人漏洞,即xxx!
什么是X?
要理解xxx,我们需要首先讨论XML文档中的“DTD”。
XML文档可以包含文档类型定义,或DTD。DTD用于定义XML文档的结构及其包含的数据。它们在文档中使用DOCTYPE标签,像这样:
XML
1
<?xml version=”1.0″ encoding=”UTF-8″?>
2
<!DOCTYPE …INSERT DTD HERE…>
在DTD中,您可以声明XML实体。XML实体在编程语言中非常类似于变量。
例如,这个DTD声明了一个名为greeting有价值的”Hello World!”。在xml文档中,可以使用&greeting,则xml文档将加载“Hello World!”代替它。
XML
1
<?xml version=”1.0″ encoding=”UTF-8″?>
2
<!DOCTYPE example [
3
<!ENTITY greeting “Hello World!” >
4
]>
5
<example>&greeting;</example>
XML外部实体
有一种特殊类型的xml实体称为外部实体。它们用于使用URL访问本地或远程内容。可以使用SYSTEMfile指的是file:///secrets.txt在本地文件系统上。Xml解析器将替换任何&file的内容在文档中引用。file:///secrets.txt.
XML
1
<?xml version=”1.0″ encoding=”UTF-8″?>
2
<!DOCTYPE example [
3
<!ENTITY file SYSTEM “file:///secrets.txt” >]>
4
<example>&file;</example>
有什么问题吗?
那么,这个功能有什么问题呢?想象一下,如果应用程序解析用户提供的XML文档并在站点上显示结果。
如果用户可以在上传中声明任意XML实体,则可以将外部实体声明到计算机上的任何位置。例如,这个xml文件包含一个指向file:////etc/shadow在您的服务器上:
XML
1
<?xml version=”1.0″ encoding=”UTF-8″?>
2
<!DOCTYPE example [
3
<!ENTITY file SYSTEM “file:////etc/shadow” >]>
4
<example>&file;</example>
二./etc/shadow文件在Unix系统上存储用户名及其加密密码。当解析的xml文档返回给用户时,file:////etc/shadow也将包括在内。
通过利用XML解析器,恶意用户现在可以读取服务器上的任意文件。它们可能能够检索用户信息、配置文件或其他敏感信息(如AWS凭据)。攻击者还可以通过递归地使XML解析器取消引用实体来发起拒绝服务攻击。这就是所谓的十亿笑攻击。说到灾难性的弱点!
防震
那么,如何防止xxx发生呢?防止xxx的最佳方法是限制XML解析器的功能。
由于DTD处理是XXE攻击的必要条件,开发人员应该在他们的XML解析器上禁用DTD处理。如果不可能完全禁用DTD,则应该禁用外部实体、参数实体和内联DTD。还可以完全禁用XML实体的扩展。
如何配置XML解析器的行为将取决于您使用的XML解析器。例如,如果使用默认的PHPXML解析器,libxml_disable_entity_loader需要设置为TRUE若要禁用外部实体的使用,请执行以下操作。有关如何为解析器执行此操作的详细信息,请参阅OWASP备忘单.
最后,您应该定期对应用程序进行审计,以捕获可能已经写入代码中的xxx。
如何检测xxx?
如何在应用程序中检测xxx?可以采取的一种方法是检查应用程序处理XML文档并使用恶意XML输入测试它们的功能。例如,您可以提交此xml文档,并查看该文件是否file:///etc/hostname被送回给你。
XML
1
<?xml version=”1.0″ encoding=”UTF-8″?>
2
<!DOCTYPE example [
3
<!ENTITY test SYSTEM “file:///etc/hostname” >]>
4
<example>&test;</example>
但是很明显,使用黑匣子方法是有风险的,因为它不能保证您会在系统中找到XXE的所有实例。因为XXE是一个具有清晰和可定义签名的漏洞,所以分析源代码是一种更好的方法。
当xxx处理用户提供的XML文件或其DTD被用户输入污染的XML文件时,XML解析器容易受到xxx的攻击。同时,需要配置解析器以评估DTD和外部实体。我们本质上是在寻找两件事:
- 首先,我们正在寻找接收用户提供的xml文件或DTD的XML解析器.
- 然后,我们将检查XML解析器是评估DTD还是外部实体。
您可以手动审核源代码以查找这些签名,也可以使用静态分析安全性测试工具为您查看代码。大多数静态分析工具可以检测XML解析器是否正在评估DTD和外部实体。但是,只有能够处理数据流的静态分析工具才能像ShiftLeft‘s NG-SAST可以检测用户输入是否可以到达解析器,从而自动检测这两种情况。
最后,应用程序依赖会导致许多xxx,因此您还应该监视和升级应用程序或底层操作系统使用的所有XML处理器和库。
稍后在AppSec简化版中,我们将针对一个开源应用程序,并查看如何使用代码分析找到XXE漏洞。继续关注!
福州APP开发哪家强?