xxe
xml external entity 外部实体注入,用户输入恶意 xml 被后台解析了恶意语句
owasptop10-- 不安全的配置
xml 是什么??
XML 指可扩展标记语言( EXtensible Markup Language )。
XML 是一种很像 HTML 的标记语言。
XML 的设计宗旨是传输数据,而不是显示数据。
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
语法
<?xml version="1.0" encoding="UTF-8"?>
<a>
<b> 1 </b>
<c> 2 </c>
</a>
①需要根节点
②标签用一 一对应的形式呈现,即每个标签需闭合
③ xml 声明(可选)
④ xml 对大小写敏感
⑤便签尽量不已 xml 开头
⑥名称中不包含空格
⑦不能以特殊符号开头
作用
①数据传输
②存储数据
xml 的合法性
xml 语法正确仅是格式、型正确
通过 dtd 验证 xml 是否合法
DTD(DOCUMENT TYPE DEFINITION) 文档类型定义
内部 DTD :
DTD 文件包含于 xml
例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user[<!ELEMENT user (username,password,age,class,school)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT class (#PCDATA)>
<!ELEMENT school (#PCDATA)>]>
<user>
<username> zhang san </username>
<password> abc@123 </password>
<age> 1.9 </age>
<class> 家里蹲 </class>
<school> 1+1 </school>
</user>
!DOCTYPE 定义此文档为 user 类型文档
!ELEMENT 声明 user 中有那些元素,
!ELEMENT 声明元素类型,
PCDATA: 可被解析器解释的文本;
CDATA: 不会被解析器解释
外部 DTD
<!DOCTYPE root-element SYSTEM "filename">
例:
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "test.dtd">
<user>
<username> zhang san </username>
<password> abc@123 </password>
<age> 1.9 </age>
<class> 家里蹲 </class>
<school> 1+1 </school>
</user>
test.dtd
<!ELEMENT user (username,password,age,class,school)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT class (#PCDATA)>
<!ELEMENT school (#PCDATA)>
DTD 实体
定义文本内容的变量
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student[
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ENTITY a "zhangsan">
<!ENTITY b "8">
]>
<student>
<name> &a; </name>
<age> &b; </age>
</student>
注: & 实体名 ;
a , b 相当于变量但以实体的方式表示 , 实体如: < 等,但在 xml 中实体名是可以自由定义的
还可以不定义元素直接写实体
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student[
<!ENTITY a "zhangsan">
]>
<student>
<name> &a; </name>
</student>
外部实体
<!DOCTYPE root-element[<!ENTITY entity-name SYSTEM " 资源位置 ">]>
例 :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE student[
<!ENTITY a SYSTEM "file://D:\phpstudy_pro\WWW\xxe\test4.dtd">
]>
<student>
<name> &a; </name>
</student>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[
<!ENTITY a SYSTEM "file://D:\phpstudy_pro\WWW\xxe\test4.dtd">
]>
<name> &a; </name>
在外部 dtd 的基础上新增一个实体的约束即可
参数实体
<!ENTITY % 实体名称 " 实体值 ">
<!ENTITY % 实体名称 SYSTEM "URI">
例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY[
<!ENTITY % a SYSTEM "http://127.0.0.1/test.dtd">
%a;
]>
<name> &s; </name>
test.dtd
<!ENTITY s SYSTEM "file://xxxx">
为例 pikachu
pikachu 设置了一个通过 php 解析 xml 文件内容的页面
传入 xml 如下,通过参数实体获取敏感信息