首页 > 编程知识 正文

XXE漏洞的两种修复方法,漏洞的原理

时间:2023-05-04 11:36:56 阅读:230401 作者:4787

一.什么是XXE漏洞?

除了json外,xml也是一种常用的数据传输格式。对xml的解析有以下几种常用的方式:DOM,SAX,JDOM,DOM4J,StAX等。然而这几种解析方式都可能会出现外部实体注入漏洞,这类漏洞统称 XML 外部实体漏洞。

提到这里我们就要明白xml的格式,尤其是xml的实体含义,显然那不是本文的重点,不明白的朋友可以去弄明白XML的格式定义含义(参考链接: )

以下提供一个请求如果接受的值是xml格式数据,则会存在xxe漏洞,我们使用下面简单的xml内容来分析:

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>

在上面的代码中,xml外部实体 xxe 被赋值为 file://etc/passwd 内容的值(也就是paswd文件的内容),关键字SYSTEM 会告诉XML解析器, xxe 实体的值是从其后的URI中获取.

简单说就是攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件/远程系统上的文件).

二.XXE漏洞的应用场景

许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。

大量XXE缺陷已经被发现并被公开,这些缺陷包括嵌入式设备的XXE缺陷。最简单的方法是上传可被接受的恶意XML文件:

场景 #1:攻击者尝试从服务端提取数据:

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>

场景 #2:攻击者通过将上面的实体行更改为以下内容来探测服务
器的专用网络:

<!ENTITY xxe SYSTEM "https://192.168.1.1/private" >]>

场景 #3:攻击者通过恶意文件执行拒绝服务攻击:

<!ENTITY xxe SYSTEM "file:///dev/random" >]>

总结:
通过xml解析器存在的漏洞, 基于URI的方式访问一些协议(比如 file, ftp,dict, gopher,expect…)下的资源非法获取一些服务器上的文件,或者将外部的文件通过实体的方式写入服务器.

三.XXE漏洞的解决办法

开发人员培训是识别和减少XXE缺陷的关键,此外,防止XXE陷还需要:
• 尽可能使用简单的数据格式(如: JSON),避免对敏感数据行序列化。
• 及时修复或更新应用程序或底层操作系统使用的所有XML处和库。同时,通过依赖项检测,将SOAP更新到1.2版本或更版本。
• 在应用的所有XML解析器中禁用XML外部实体和DTD进程。
• 在服务器端实施积极的(“白名单”)输入验证、过滤和清以防止在XML文档、标题或节点中出现恶意数据。
• 验证XML或XSL文件上传功能是否使用XSD验证或其他类似方法来验证上传的XML文件。
• 尽管在许多集成环境中,手动代码审查是大型、复杂应用程最佳选择,但是SAST 工具可以检测源代码中的XXE漏洞。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。