XXE(XML External Entity)是指xml外部实体攻击漏洞。XML外部实体攻击是针对解析XML输入的应用程序的一种攻击。当包含对外部实体的引用的XML输入被弱配置XML解析器处理时,就会发生这种攻击。这种攻击通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
(简单来说,XXE就是XML外部实体注入。当应用程序允许引用外部实体时,通过构造恶意内容,就可以导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。)
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素;
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
XML,可拓展的标记语言,(eXtensible Markup Language),用于传输和存储数据。
XML文档实例:
可以在DOCTYPE头部标签中通过SYSTEM关键字定义“实体”,这些“实体”可以访问本地或远程的内容。SYSTEM告诉XML解释器,从URI中读取实体的内容。攻击者可以通过实体将自定义的值发送给应用程序,然后让应用程序去呈现,比如上面就是把实体定义为passwd文件,让XML解释器去读取文件。
**方式一:**直接通过DTD外部实体声明
XML内容
**方式二:**通过DTD文档引入外部DTD文档,再引入外部实体声明
XML内容:
DTD文件内容:
**方式三:**通过DTD外部实体声明引入外部实体声明
好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
具体看例子,XML内容
dtd文件内容:
比如Content-Type:text/xml, post的数据包含XML格式,如:
请求头中添加Content-Type:text/xml,或Content-type:application/xml
同时,POST中添加payload
关键字:DocumentBuilderFactory等
通过提交自动以URI,可以读取任意文件(本地或远程)。
还可以通过DTD文档引入外部DTD文档,再引入外部实体声明,如下:
以上输入有回显的情况,/etc/passwd可以直接被显示出来,无回显的情况,需要把文件外发至远程服务器,具体如下:
原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。
通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。
PHP要开启PECL上的Expect扩展。
危害:
可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害
PHP: libxml_disable_entity_loader(true);
JAVA:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
Python: from lxml import etree
xmlData=etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
过滤关键词: