XXE,Xml External Entity Injection,XML外部实体注入攻击
攻击原理
因为实体可以通过预定义在文档中被调用,而实体的标识符又可以访问本地或者远程内容,当允许引用外部实体时,攻击者便可以构造恶意内容来达到攻击。
**
名词介绍
**
XML
xml 是一种可扩展的标记语言,主要就是用来传输数据的,你可以理解为就是一种写法类似于 html 语言的数据格式文档。
但是 html 旨在显示数据信息,而 xml 旨在传输数据信息。
DTD
跟 xml 格式相关的就是这个叫 dtd(document type definition )文档类型定义的东西了,
dtd 的作用就是去定义 xml 文档的合法构建模块,也就是说声明了 xml 的内容格式规范。
dtd 有两种声明方式:
1、内部 dtd:即对 XML 文档中的元素、属性和实体的 DTD 的声明都在 XML 文档中。
2、外部 dtd:即对 XML 文档中的元素、属性和实体的 DTD 的声明都在一个独立的 DTD 文件(.dtd)中。
**
**
XXE的危害
1读取任意文件
2执行系统命令
3探测内网端口
4攻击内网网站
**
XXE的利用
**
利用…我没用过,没咋看懂
如何防御
方案一 使用开发语言提供的禁用外部实体的方法
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 数据中的关键词也是可以的,
比如说:<!DOCTYPE和<!ENTITY,SYSTEM和PUBLIC
**
总结
**
只要处理用户可控的XML都可能存在危害极大的XXE漏洞,开发人员在处理XML时需谨慎,在用户可控的XML数据里禁止引用外部实体。
参考链接:
https://mp.weixin.qq.com/s/VWofHp5lJLYnbw01copnkw
https://blog.csdn.net/umbrellasoft/article/details/82705681