出品|MS08067实验室(www.ms08067.com)

本文作者:可乐(Ms08067实验室Web小组成员)

前言

写这篇的主要目的是因为很多CTFer还有一些安全人员不是很清楚xxe漏洞,还有在面试当中,xxe漏洞也经常被问到,所以就写这么一篇文章来学习xxe漏洞. 本篇会结合一些靶场还有CTF来进行讲解

基础

首先来介绍一下XML和DTD
XML被设计用来传输和存储数据,这里提一下xml与html的区别:HTML 旨在显示信息,而 XML 旨在传输信息
而DTD定义 XML 文档的合法构建模块,它使用一系列的合法元素来定义文档结构,DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

XML和DTD基础

一个 XML 文档实例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)。
接下来加上DTD进行声明

内部的 DOCTYPE 声明

<?xml version="1.0"?>
<!DOCTYPE note [          //定义此文档是 note 类型的文档。
  <!ELEMENT note (to,from,heading,body)> //定义 note 元素有四个元素:"to、from、heading,、body"
  <!ELEMENT to      (#PCDATA)>  //定义 to 元素为 "#PCDATA" 类型
  <!ELEMENT from    (#PCDATA)>   //定义 from 元素为 "#PCDATA" 类型
  <!ELEMENT heading (#PCDATA)>  // heading 元素为 "#PCDATA" 类型
  <!ELEMENT body    (#PCDATA)>  //定义 body 元素为 "#PCDATA" 类型
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

DTD元素
在一个 DTD 中,元素通过元素声明来进行声明。
声明一个元素
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
只有 PCDATA 的元素
只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT 元素名称 (#PCDATA)>
例子:
<!ELEMENT from (#PCDATA)>

带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>
例子:
<!ELEMENT note ANY>

带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

<!ELEMENT 元素名称 (子元素名称 1)>
或者

例子:
<!ELEMENT note (to,from,heading,body)>

声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
例子:
<!ELEMENT note (message)>
上面的例子声明了:message子元素必须出现一次,并且必须只在 "note"元素中出现一次。

外部文档声明

<!DOCTYPE 根元素 SYSTEM "文件名">
<?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>

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD
这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

DTD实体声明

重点介绍实体声明
内部实体声明
<!ENTITY 实体名称 "实体的值">
DTD 例子:
<!ENTITY writer "Bill Gates">
将writer 声明为”Bill Gates”,copyright 声明为 “Copyright W3School.com.cn”
XML 例子:
<author>&writer;&copyright;</author>
注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/ms08067/p/14581538.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!