-
全称:XML External Entity
- 外部实体注入攻击
-
原理
- 利用xml进行读取数据时过滤不严导致嵌入了恶意的xml代码;和xss一样
-
危害
- 外界攻击者可读取商户服务器上的任意文件;
- 执行系统命令;
- 探测内网端口;
- 攻击内网网站。
- 商户可能出现资金损失的情况
-
防御
- 禁用外部实体
- 过滤用户的提交文本中的关键词<!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">]> <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">%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(大小写)开头的名字
- 不能数字和标点符号开头
- 不能包含空格
- 名字中可以有字符、数字、特殊符号
-
属性规则
- 不能包含多个值
- 不能包含子节点
- 值必须用引号包裹;引号都会用双引号进行解析
-