XXE

XXE学习

XML基础

XML结构

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

第一行XML的声明,第二行 为根元素, 下面的to, from,heading和body 都是子元素

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>  //XML声明

<note> //文档类型定义

//文档元素
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

XML DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 有两种声明的方法,一种是内部声明,一种是外部声明,我们下面开具体看一下:

DTD的内部声明:根元素 [元素声明]>:

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

外部声明 根元素 SYSTEM “文件名”> 或 根元素 PUBLIC “public_ID” “文件名”>

例如

1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

DTD实体

实体又分为一般实体和参数实体
1,一般实体的声明语法:
引用实体的方式:&实体名
2,参数实体只能在DTD中使用,参数实体的声明格式:
引用实体的方式:%实体名

内部实体声明: ex:<!ENTITY eviltest "eviltest">

1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>

<test>&writer;&copyright;</test>

引用外部实体:

实体名称 SYSTEM "URI">或者实体名称 PUBLIC "public_ID" "URI"

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
]>
<author>&writer;&copyright;</author>

什么是XXE

简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

基本利用

XML外部实体注入

通过DTD外部实体声明:

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b "file:///etc/passwd">
]>

<test>&b;</test>

通过DTDy引入外部DTD再引入外部实体声明

1
2
3
4
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

<test>&b;</test>

DTD文件内容:

1
<!ENTITY b "file:///etc/passwd">

不同程序支持的协议不同

在这里插入图片描述


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!