XXE外部实体注入
参考链接:https://www.cnblogs.com/backlion/p/9302528.html
xxe外部实体注入漏洞:是XML(可拓展标记语言)在引用外部DTD(文档类型定义)实体
0.XML基础知识
XML:可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它被设计用来传输和存储数据(而不是储存数据),可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。它的标签没有被预定义。您需要自行定义标签。它被设计为具有自我描述性。它是W3C的推荐标准。
可扩展标记语言(XML)和超文本标记语言(HTML)为不同的目的而设计
XML被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言(HTML)被设计用来显示数据,其焦点是数据的外观
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
<?xml version="1.0" encoding="UTF-8"?>]>
<元素名称 category=“属性”>
文本或其他元素
</元素名称>
外部实体:是一个或者多个XML文档的公共引用的外部资源,有些类似于java里面的接口,谁需要接口里面的内容,谁来调用它.同时,XML处理器一定会对外部实体的数据进行解析.
外部实体表示外部文件的内容,用 SYSTEM 关键词表示。
外部实体的格式为:
<!ENTITY 实体名 SYSTEM "实体内容">DTD(文档类型定义)可以在XML文档内部声明,也可以作为外部引用声明—使用SYSTEM标识符指向可解析位置中的另一组声明。ENTITY可以使用SYSTEM关键字,调用外部资源,在调用外部资源时是可以支持很多的协议,如:http;file等,然后,在其他DoM结点中可以使用如:&test;引用该实体内容.
如果要引用一个外部资源,可以借助各种协议 几个例子:
file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的playload,让处理程序解析它。当引用外部实体时,通过自己构造的playload,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
1.漏洞产生原因
XXE 漏洞的产生是因为应用程序解析XML时,没有过滤外部实体的加载,导致加载了恶意的外部文件,造成命令执行、文件读取、内网扫描、内网应用攻击的等危害。
深度解析:
既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,不就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。
那如果我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。
2.漏洞的利用
-
文件读取:通过加载外部实体,利用file,phpt等协议读取本地文件.
-
探测内网信息:利用 XXE 漏洞进行内网探测,根据报错信息或者请求返回时间来判断内网信息情况,如果端口开启,请求返回的时间会很快;如果端口关闭,请求返回的时间会很慢。
如:<!ENTITY XXE SYSTEM "http://192.1698.30.1:8080">
-
攻击内网应用:通过 XXE 漏洞对内网应用程序进行攻击。
例如可以攻击对内网存在 jmx 控制台未授权访问的 Jboss 漏洞进行攻击。 -
命令执行:利用 XXE 漏洞可以调用 except 伪协议调用系统命令,执行系统命令。
3.XXE漏洞修复
1、禁用外部实体的方法
libxml_disable_entity_loader(true);
2、过滤用户提交的 XML 数据
过滤关键词:<!DOCTYPE 、<!ENTITY、SYSTEM 和 PUBLIC