- 软件供应链安全:源代码缺陷实例剖析
- 奇安信代码安全实验室
- 1078字
- 2025-04-08 08:46:09
2.2 XML外部实体注入
2.2.1 XML外部实体注入的概念
XML外部实体注入漏洞也就是我们常说的XXE漏洞。XML是一种使用较为广泛的数据传输格式,很多应用程序都包含处理XML数据的代码。默认情况下,很多过时的或配置不当的XML处理器都会对外部实体进行引用。如果允许攻击者上传XML文档或者在XML文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,包含缺陷的XML处理器就很可能会被攻击。XXE漏洞的出现和开发语言无关,只要应用程序中对XML数据做了解析,而这些数据又受用户控制,那么应用程序都可能受到XXE攻击。本节分析XXE漏洞产生的原因、危害以及修复方法。
2.2.2 XML外部实体注入的危害
XXE漏洞可能会被用于提取数据、执行远程服务器请求、扫描内部系统、执行拒绝服务攻击等。业务影响主要取决于受影响的引用程序和数据保护需求。CVE中也有一些与之相关的漏洞信息,如表2-2所示。
表2-2 与XXE漏洞相关的漏洞信息

2.2.3 实例代码
本节使用实例的完整源代码可参考本书配套资源文件夹,源文件名:SimpleXXE.java和Comments.java。
1)缺陷代码
代码片段1(SimpleXXE.java):

代码片段2(Comments.java):


在代码片段1中,从请求中获取commentStr参数并将其作为XML进行解析,在第70行调用Comment类中的parseXml()方法,该方法用于解析XML。在代码片段2的第65行使用XMLInputFactory解析XML,在第66行设置解析属性,允许解析外部实体,在第67行关闭DTD验证,在第69行使用XMLInputFactory.SUPPORT_DTD属性支持DTD处理器,在第70行以读取XML文件的方式读取传入的字符串。以下文本引用了外部DTD,当传入的内容中包含以下文本时

解析器会尝试访问在SYSTEM属性中标识的URL,这意味着它将读取本地/dev/tty文件的内容。在POSIX系统中,读取这个文件会导致程序阻塞,直到可以通过计算机控制台得到输入数据为止。攻击者可以使用这段恶意的XML文本使系统挂起,从而造成拒绝服务攻击或程序崩溃。
2)修复代码


上述修复代码的目的是修改代码片段2中的XML解析方法。修改XMLInputFactory实例的属性,不允许解析外部实体,关闭对DTD的处理,开启对DTD的校验,这样就可以避免XML外部实体注入。
2.2.4 如何避免XML外部实体注入
(1)使用轻量级数据格式(如JSON),避免对敏感数据进行序列化。
(2)及时修复或更新应用程序及底层操作系统使用的所有XML处理器和库。同时,通过依赖项检测,将SOAP更新到1.2版本或更高版本。
(3)在应用程序的所有XML解析器中禁用XML外部实体和DTD进程。(4)
输入校验:在服务器端使用白名单进行输入验证和过滤,以防在XML文档、标题或节点中出现恶意数据。
(5)验证XML和XSL文件上传功能是否使用XSD验证或其他类似的验证方法来验证上传的XML文件。
(6)使用源代码静态分析工具进行自动化的检测。使用DAST工具需要额外的手动步骤来检查和利用XXE漏洞,而使用源代码静态分析工具可以通过检测依赖项和安全配置来发现XXE漏洞。