XXE(XML External Entity Injection)即xml外部实体注入
  当程序在解析XML输入时,允许引用外部实体,导致能够引用一个外部恶意文件,可导致执行系统命令、内网端口探测、文件读取,攻击内网服务、dos攻击等。以下用vwapp漏洞靶场进行读取文件的演示。
  要对XXE漏洞进行验证,可以用BWAPP这款漏洞演示平台,buggy web Application是一个集成了web常见漏洞的开源web应用程序,目的是帮助安全爱好者及程序员研究安全漏洞,其中已经包含了100多种web漏洞
下载及安装教程:
[BWAPP:一款非常好用的漏洞演示平台](http://www.freebuf.com/sectool/76885.html)
安装好之后,Choose your bug 选择 XML External Entity Attacks (XXE)
![](/upload/attach/201801/201801131634_xxmoc512cdudrwl.jpg)
Set your security level: 选择low
![](/upload/attach/201801/201801131634_jngceerw5kpqc5w.jpg)
点击any bugs? 使用burpsuite抓包,在request中看到传输的xml数据:
![](/upload/attach/201801/201801131634_d2tcmduix0yaslj.jpg)
![](/upload/attach/201801/201801131634_klp5giwuxfq3si9.jpg)
xxe-1.php页面在向xxe-2.php页面传输数据过程中,其中的xml数据是可控的,也就是说可以构造恶意数据进行传输,添加一个外部实体在XML数据中进行实体调用,从而进行XXE攻击。
payload:
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [
<!ENTITY attack SYSTEM "file:///etc/passwd">
]>
<reset>
<login>&attack;</login>
<secret>xxx</secret>
</reset>
```
![](/upload/attach/201801/201801131635_4q3q9eln5zo8q7x.jpg)
xxe的修复与防御:
1、使用开发语言提供的禁用外部实体的方法
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))
```
2、过滤用户提交的XML数据
过滤关键词:<!DOCTYPE,<!ENTITY,SYSTEM,PUBLIC。