
外部实体注入漏洞XXE(XML External Entity Injection)也就是XML外部实体注入,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml库,而libxml 2.9以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XML文档结构包括XML声明、DTD(Document Type Definition,即文档类型定义、文档元素)。DTD用来为XML文档定义语义约束。DTD可以嵌在XML文档内声明(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。
DTD内部声明:
DTD内部实体声明:
]>
&xxe;
DTD外部引用:
DTD外部实体声明:
]>
&xxe;
]>
&xxe;
]>
login
直接通过DTD外部实体声明
]>
&test;
通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明
]>
&test;
//而http://test.com/evil.dtd内容为
通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明
]>
%test;
// http://test.com/evil.dtd文件内容
我们也可以使用http URI并强制服务器向我们指定的端点和端口发送GET请求,将XXE转换为SSRF(服务器端请求伪造)。
]>
有些情况下能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行命令
]>
&xxe;
]>
对于无回显的XXE,我们需要构建一条带外数据(Out-of Band,OOB)通道来读取数据。思路是:
%remote;
%all;
%send;
]>
&name;
// evil.xml
">
同样的也可以进行FTP协议的外带回显
利用定义实体参数变量,重复引用进行指数级增长,导致解析异常。
]>
&lol9;
使用开发语言提供的禁用外部实体的方法。
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))
过滤用户提交的XML数据,参考关键词:和或者SYSTEM和PUBLIC。
不允许XML中含有自己定义的DTD。
参考链接:
https://mp.weixin.qq.com/s/scFsOJsKL2Jxx3hsQVfEdw
https://mp.weixin.qq.com/s/3CAnOr38wCrWB1-UJYZ5aQ
https://mp.weixin.qq.com/s/-c0853Vbydmngzch7_aHkg