XXE漏洞(1)基础知识

目录

基本概念

XXE

XML

DTD

XML基础知识

XML语法规则

XML元素介绍

XML文档实例

DTD基础知识

DTD的声明

内部DTD文档声明

外部DTD文档声明

DTD数据类型

PCDATA

CDATA

元素

声明元素

实体

通用实体

参数实体

内部实体声明

外部实体声明



基本概念

XXE

XXE全称XML External Entity Injection,也就是XML外部实体注入攻击,是对非安全的外部实体数据进行处理时引发的安全问题。要想搞懂XXE,肯定要先了解XML语法规则和外部实体的定义及调用形式。

XML

XML 指可扩展标记语言eXtensible Markup Language)。XML 被设计用来传输和存储数据。

XML 和 HTML 之间的差异
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
• XML 被设计用来传输和存储数据,其焦点是数据的内容。
• HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。

DTD

DTD指文档类型定义document type definition)的作用是定义 XML 文档的合法构建模块。
DTD约束了xml文档的结构。拥有正确语法的XML被称为“形式良好”的XML,通过DTD验证约束XML是“合法”的XML。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

我的理解就是DTD说了怎么做xml文档就要怎么做。

 

XML基础知识

XML语法规则

1. 所有的XML元素都必须有一个关闭标签
2. XML标签对大小写敏感
3. XML必须正确嵌套
4. XML属性值必须加引号””
5. 实体引用(在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如<符号对应的实体就是lt,>符号对应的实体就是gt)
6. 在XML中,空格会被保留(案例如:<p>a空格B</p>,这时候a和B之间的空格就会被保留)

XML元素介绍

XML元素是指从(且包括)开始标签直到(且包括)结束标签的部分。
每个元素又有可以有对应的属性。XML属性必须加引号。
(1) XML文档必须有一个根元素
(2) XML元素都必须有一个关闭标签
(3) XML标签对大小写敏感
(4) XML元素必须被正确的嵌套
(5) XML属性值必须加引号

XML文档实例

<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

 

DTD基础知识

DTD的声明

指XML文档中声明该文档的DTD或DTD来源的部分,可以包含在使用它的XML文档内部,也可以以独立的DTD文档(*.dtd)文档存在。

内部DTD文档声明

DTD被包含在XML源文件中,它应当通过下面的语法包装在一个 DOCTYPE声明中:
内部声明DTD类型声明:<!DOCTYPE 根元素[ 子元素声明 ]>

<?xml version="1.0"?>
<!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>

以上 DTD 解释如下:
• !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
• !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
• !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
• !ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
• !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
• !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

外部DTD文档声明

DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件路径">
我们主要关注XML外部实体的定义和调用方式:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend!</body>
</note>

包含 DTD 的 "note.dtd" 文件:

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

DTD数据类型

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。

CDATA

CDATA的意思是字符数据,CDATA是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

 

元素

元素是 XML 以及 HTML 文档的主要构建模块。元素可包含文本、其他元素或者是空的。
实例:
<body>some text</body>
<message>some text</message>

声明元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
包含文本的元素声明
只出现一次的元素
  <!ELEMENT 元素名 (数据类型)>
最少出现1次的元素数
  <!ELEMENT 元素名 (数据类型)+>
声明出现零次或多次的元素
  <!ELEMENT 元素名 (数据类型)*>
声明出现零次或1次的元素
  <!ELEMENT 元素名 (数据类型)?>
实例:
  <!ELEMENT from (#PCDATA)>
包含元素的声明
  <!ELEMENT 元素内容 (包含的其它元素)>
其中元素出现次数同上
实例:
  <!ELEMENT note (to,from,heading,body)>


实体

实体有两种类型:参数实体 和 一般实体
两者都像占位符或者变量那样使用,提供了一种方法设置可以在多个地方使用的一个值。 参数实体仅在 DTD 范围之内使用。它通常用于创建反复使用的定义。

通用实体

&实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY test "this is xml" > // 在DTD中定义
]>
<cred>&test;</cred>//在xml文档中引用

参数实体

% 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xxe [
<!ENTITY % param1 "<!ENTITY internal 'http://darkerbox.com'>">//定义参数实体
%param1;//引用参数实体,引用后,值又被xml解析,则internal的值为http://darkerbox.com
]>
<root>
<test>[This is my site] &internal;</test>
</root>

 

内部实体声明

<!ENTITY 实体名 "实体值">

DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">
XML 实例:
<author>&writer;&copyright;</author>

外部实体声明

<!ENTITY 实体名 SYSTEM "外部实体路径">

DTD 实例:

<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
http://www.runoob.com/entities.dtd内容
<!ENTITY writer "Donald Duck.">
XML example:
<author>&writer;&copyright;</author>

 

参考:

https://blog.csdn.net/qq_41918771/article/details/103628721

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值