全称:XML External Entity
##### 原理
* 利用xml进行读取数据时过滤不严导致嵌入了恶意的xml代码;和xss一样 ![](https://file.jishuzhan.net/article/1753640443184156673/555c28b7470437bb2180f3a4b1105d4f.webp)
##### 危害
* 外界攻击者可读取商户服务器上的任意文件;
<!-- -->
* 执行系统命令;
<!-- -->
* 探测内网端口;
<!-- -->
* 攻击内网网站。
<!-- -->
* 商户可能出现资金损失的情况
##### 防御
* 禁用外部实体
<!-- -->
* 过滤用户的提交文本中的关键词\<!DOCTYPE等
<!-- -->
* 不允许xml中有自己声明的DTD
<!-- -->
* 设置xml解析使用静态的DTD文件;不允许引用外部的DTD
##### 查找方法
* 通过抓包随便输入闭合标签和内容看回显;有回显说明有漏洞
XML语言:可扩展的标记语言
##### 文档结构
*
###### xml声明
* \<?xml version="1.0" encoding="UTF-8"?\>
<!-- -->
*
###### DTD:文档类型定义(文档框架)
*
###### 内部文档声明
* \<!DOCTYPE 根元素名称 \[声明元素的位置\] \>
<!-- -->
* \<!DOCTYPE note\[\<!ELEMENT note(to,from,heading,body)\> \<!ELEMENT to(#PCDATA)\> \<!ELEMENT form(#PCDATA)\>\<!ELEMENT heading(#PCDATA)\>\<!ELEMENT body(#PCDATA)\>\]\>
<!-- -->
*
###### 外部文档声明
* \<!DOCTYPE 根元素名称 SYSTEM "文件名"
<!-- -->
* \<!DOCTYPE note SYSTEM "http:127.0.0.1/1.txt"\>
<!-- -->
*
###### 实体:\<!ENTITY \>
* 普通实体
* \<!DOCTYPE ANY\[\<!ENTITY xxe "123"\>\]\> \<value\>\&xxe\</value\> 内部引用
<!-- -->
* \<!DOCTYPE ANY\[\<!ENTITY xxe "[http://127.0.0.1/1.txt](http://127.0.0.1/1.txt "http://127.0.0.1/1.txt")"\>\]\> \<value\>\&xxe\</value\> 外部引用
<!-- -->
* 参数实体(只能用于DTD中)
* \<!DOCTYPE root\[\<!ENTITY %A "\<!ENTITY xxe "123"\>"\>%A;\]\> \<value\>\&xxe\</value\>
<!-- -->
* \<!DOCTYPE root\[\<!ENTITY %A SYSTEM "[http://127.0.0.1/1.txt](http://127.0.0.1/1.txt "http://127.0.0.1/1.txt")"\>%A;\]\> \<value\>\&xxe\</value\>
<!-- -->
*
###### 元素
* 实体:用于定义普通文本的变量
<!-- -->
* PCDATA:需要被解析的字符数据
<!-- -->
* CDATA:不被解析的字符数据
<!-- -->
*
###### 元素类型(声明时用)
* EMPTY :不能包含子元素和文本;但可以有属性
<!-- -->
* ANY :可以包含DTD中的任意元素
<!-- -->
* #PCDATA :可以使用任意字符数据;但不能有子元素
<!-- -->
*
###### 属性
* 属性声明语法
* \<!ATTLIST 元素名称 属性名称 属性类型 默认值\>
<!-- -->
* \<!ATTLIST student id CDATA #REQUIRED\>
<!-- -->
* 属性类型
* CDATA
<!-- -->
* (en1\|en2\|..)
<!-- -->
* ID
<!-- -->
* 默认值
* #REQUIRED :必须有
<!-- -->
* #IMPLIED :不是必须的
<!-- -->
* #FIXED value :固定值
##### 规则和限制
*
###### 基础规则
* xml文档中有且只能有一个根元素
<!-- -->
* 区分大小写
<!-- -->
* 标签格式必须闭合而且一一对应;只有双标签;否则出错
<!-- -->
* 特殊字符必须用文本实体编码代替;\& " ' \< \>等
<!-- -->
* 实体编码必须以\&开头;结束;格式要规范
<!-- -->
* 允许多余空格保留
<!-- -->
*
###### 元素命名规则
* 不能有xml(大小写)开头的名字
<!-- -->
* 不能数字和标点符号开头
<!-- -->
* 不能包含空格
<!-- -->
* 名字中可以有字符、数字、特殊符号
<!-- -->
*
###### 属性规则
* 不能包含多个值
<!-- -->
* 不能包含子节点
<!-- -->
* 值必须用引号包裹;引号都会用双引号进行解析