XXE-XML

最近遇到一些事,使我不得不抓紧时间学习一下XXE相关的漏洞知识~~~



XXE-XML


一. XML

1.1 基本概念

  1. 什么是XML?
  2. 为什么要使用XML?
  3. 怎么使用XML?
  4. 为什么着重强调DTD?

1. XML 是什么?

  • 指可扩展标记语言(EXtensible Markup Language)。
  • 是一种很像HTML的标记语言。
  • 的设计宗旨是传输数据,而不是显示数据。
  • 标签没有被预定义。您需要自行定义标签。
  • 被设计为具有自我描述性。
  • 是 W3C 的推荐标准。

可以参考:[XML是什么,它可以做什么?——XML详解]

2. 为什么要使用XML?
参考:[XML 用途]

(1) XML 把数据从 HTML 分离

  1. 如果您需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。
  2. 通过 XML,数据能够存储在独立的 XML 文件中。这样您就可以专注于使用 HTML/CSS 进行显示和布局,并确保修改底层数据不再需要对 HTML 进行任何的改变。
  3. 通过使用几行 JavaScript 代码,您就可以读取一个外部 XML 文件,并更新您的网页的数据内容。

(2 )XML 简化数据共享

  1. 在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。
  2. XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
  3. 这让创建不同应用程序可以共享的数据变得更加容易。

(3) XML 简化数据传输

  1. 对开发人员来说,其中一项最费时的挑战一直是在互联网上的不兼容系统之间交换数据。
  2. 由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。

(4) XML 简化平台变更

  1. 升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。
  2. XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新的应用程序或新的浏览器。

**3. 怎么使用?**

可以是这样

1
<person age="too young" experience="too simple" result="sometimes naive" />

也可以是这样

1
2
3
4
5
<person>
<age value="too young" />
<experience value="too simple" />
<result value="sometimes naive" />
</person>

还可以这样

1
2
3
4
5
<person>
<age>too young</age>
<experience>too simple</experience>
<result>sometimes naive</result>
</person>

但是更推荐使用第三种!主流使用的也是第三种。

4. 为什么着重强调DTD?

DTD实体:DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。

实体又分为一般实体和参数实体

  1. 一般实体的声明语法:<!ENTITY 实体名 "实体内容">
    引用实体的方式:&实体名;
  2. 参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 "实体内容">
    引用实体的方式:%实体名;

1,何为XXE?
答: xxe也就是xml外部实体注入。也就是上述的那一部分。

2,怎样构建外部实体注入?
方式一:直接通过DTD外部实体声明

可参考:[xxe漏洞的学习与利用总结]


1.2 使用XML

实际写文档一般这样用:(新版本)可参考[XML 文档构建模块]

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
    • &lt;表示<
    • &gt;表示>
    • &amp;表示&
    • &apos;表示'
    • &quot;表示"
  • PCDATA :被解析的字符数据(parsed character data)
  • CDATA :不会被解析的字符数据(character data)
  • 两种文档约束:DTD、Schema

包含上面那几部分以后,文档还要有一个规范来约束,即需要对自己写的文档进行验证, 验证器会对在自己写的验证规则中对XML文件进行语法检查。

为什么要有约束?
因为XML文件的标签和属性可以随意扩展,有时我们必须要限制每个文档有哪些元素,每个元素有哪些子元素,每个元素有哪些属性,属性的值是什么类型等。从而保证XML文档格式和数据的正确性。


实例

1
2
3
4
5
6
7
8
9
10
11
12
<!--文档的声明-->
<!--还有个属性standalone:很少使用,是否是一个单独的XML文件,取值是true或false。默认是true-->
<!--元素 note、to、from、body等叫做元素,Tove叫做To这个元素的值value,而sex叫做属性,
female叫做属性的值-->
<!--注释和HTML一样-->
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to sex='female'>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

XML由七种组成元素构成(老版本)

  • 文档的声明
  • 元素
  • 属性
  • 注释
  • 实体字符,如
    • &lt;表示<
    • &gt;表示>
    • &amp;表示&
    • &apos;表示'
    • &quot;表示"
  • 字符数据区 [!CDATA[内容]]
  • 处理指令

关于学习的资料可参考:[XML 教程][XML 文档结构简介(一)][XML][XML]

下面是我的一些关于学习XML的笔记😁(●ˇ∀ˇ●)

201.jpg

202.jpg

203.jpg

204.jpg

205.jpg




二. DTD

2.1 基本概念

DTD为英文(Document Type Definition),中文意思为“文档类型定义”。

DTD肩负着两重任务:一方面它帮助你编写合法的代码,另一方面它让浏览器正确地显示器代码。

DTD扮演着很重要的角色,会使代码变得规范性,打个比方:

良好的xml文档:符合xml的语法规则。 
有效的xml文档:符合xml语法规则的同时还需要符合DTD文档类型定义。
利用DTD可以对xml文档的各个节点进行约束定义,使开发遵循一套“标准”。 
DTD可以约束xml文档出现的元素,元素名称,元素的先后顺序,属性等。

推荐参考:[XML中的DTD是什么?][XML之自定义DTD约束][XML中DTD介绍及使用]


2.2 使用DTD



三. XXE漏洞