Xxe总结
原理:
XML:
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
DTD:
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据
XML文档的构建模块:
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
实体类别介绍:
实体主要分为:
内置实体 (Built-in entities)
即对XML⽂档中的元素、属性和实体的DTD的声明都在XML⽂档中
<!ENTITY 实体名称 "实体内容">
外部实体:
即对XML⽂档中的元素、属性和实体的DTD的声明都在⼀个独⽴的DTD⽂
件(.dtd)中
<!ENTITY 实体名称 SYSTEM "URI">
XXE的攻击与危害:
危害:
读取任意文件
命令执行
内网探测/SSRF
拒绝服务攻击
后端WEB漏洞如果可以通过URL加以利用,可造成WEB漏洞攻击
构件外部实体注入:
方式一:直接通过DTD外部实体声明
方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
方式三:通过DTD外部实体声明引入外部实体声明
支持的协议:
防御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