XXE

什么是XXE漏洞

XXE的概念

entity-实体

XXE定义了两种实体类型,分别是

  • 普通entity
  • 参数entity

XML

类似于HTML,是比较简单的标记语言

一般看来,XML与HTML的不同点可能就在与XML会有一个这个头

<?xml version="1.0" encoding="UTF-8"?>

然后就是xml有个DTD。DTD是一个非常重要的点,DTD可以引用一些外部文件,也可以用SYSTEM的方式读取一些其他的DTD文件,就与文件包含一样。

内部声明DTD:

<!DOCTYPE 根元素 [元素声明]>

引用外部DTD

<!DOCTYPE 根元素 [SYSTEM "文件名/url"]>

xml被设计用来传输和存储数据

html被设计用来显示数据

什么是xml

  • 指可扩展标记语言

  • 是一种标记语言,很类似于 html

  • 设计宗旨是传输数据,而非显示数据

  • 标签没有被预定义。需要自行定义标签

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

  • w3c 的推荐标准–没搜出来

xml 与 html 的主要差异

xml 不是 html 的替代

xml 被设计为传输和存储数据,其焦点是数据的内容

html 被设计来显示数据,其焦点是数据的外观

html 旨在显示信息,xml 旨在传输信息**

xml 是不作为的

xml被设计用来结构化存储以及传输信息

<note>
    <to>George</to>
    <from>john</from>
    <heading>Reminder</heading>
    <body>Don.t forget me!</body>
</note>

上面的语句仔细读一下就会发现像是 john 写给 george 的便签,存储为 xml.

它仅仅是包装在 xml 标签中的纯粹的信息,我们需要在编写软件或者程序,才能传送接受和显示这个文档.

xml 仅仅是纯文本

比如txt?

xml 没有什么特别的,它仅仅是纯文本。有能力处理纯文本的软件都可以处理 xml,不过,能够读懂xml的应用程序可以有针对性处理xml的标签。标签的功能性意义依赖于应用程序的特性

通过xml可以发明自己的标签

上面的 xml 文档在 xml 标准中没有定义过,这些标签是由文档的创作者发明的,这是因为 xml 没有预定义的标签

xml 把数据从 html 中分离

如果需要在html文档中显示动态的数据,那么每当数据改变时将花费大量时间来编辑html,通过xml数据能够存储在独立的xml文件汇总,这样就可以专注于使用html进行布局和显示,并确保修改底层数据补在需要对html进行任何的变动。通过几行的javascript,你就可以读取一个外部xml文件,然后更新html中的数据内容

XML树结构

xml使用简单的具有自我描述性的语法

<?xml version="1.0" encoding="UTF-8"?>
<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 / 西欧字符集)

<note>
//表示的是文档的根元素
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>

根元素note里的4个子元素

</note>

定义根元素

xml 文档形成一种树结构

xml必须包含根元素。该元素是其它所有元素的父元素

xml文档中的元素形成了一棵档案树。这棵树从根部开始,并扩展到树的顶部

所有元素都可以拥有子元素

img

上图表示下面的 XML 中的一本书:

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>

例子中的根元素是 。文档中的所有 元素都被包含在 中。

元素有 4 个子元素: 、< author>、、。

https://www.cnblogs.com/miaofawei/articles/2824706.html

XML 语法规则

xml 中所有的元素都必须有关闭标签
<p>This is a paragraph
<p>This is another paragraph
应为
<p>This is a paragraph</p>
<p>This is another paragraph</p>  
xml 标签对大小写敏感
<Message>这是错误的。</message>

<message>这是正确的。</message> 
xml 必须正确的嵌套

即元素顺序对应

<b><i>this is test</i></b>   //正确
<b><i>This is test</i></b>		//错误
xml中必须有根元素

于html类似,xml可以拥有属性(名称/值的对)。在xml中,xml的属性值必须加引号

在元素后面的参数为属性G

<note date=08/08/2008>
<to>George</to>
<from>John</from>
</note> 

<note date="08/08/2008">
<to>George</to>
<from>John</from>
</note> 

第一个就是错的,没有加引号

实体引用

在xml中一些字符拥有特殊的意义,如果你把字符<放在xml元素中,会发生错误,这是因为解析器会把他当成新元素的开始

<message>if salary < 1000 then</message>
<message>if salary &lt; 1000 then</message> 

需要使用实体引用来代替”<” 字符

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 省略号
&quot; " 引号
XML中的注释
<!-- this is a comment -->
在XML中空格会被保留
HTML:	Hello           my name is David.
输出:	Hello my name is David.

XML:	Hello           my name is David.
输出:	  Hello           my name is David.

XML 以 LF 存储换行

在 windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符 (LF). 这对字符与打字机设置新行的动作有相似之处。在 unix 应用程序汇总,新行以 (LF) 字符存储。而 mac 应用程序使用 CR 来存储新行

XML DTD

DTD的作用是定义XML文档的结构,他使用一系列合法的元素来定义文档结构

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

DTD

DTD 简介

文档类型定义 (DTD) 可定义合法的 xml 文档构建模块。它使用一系列合法的元素来定义文档的结构 DTD 可被成行的声明在 xml 文档中,也可以做为一个外部引用

内部的 DOCTYPE 声明

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

PLAINTEXT
<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例

<?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>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

以上 DTD 的解释

  • !DOCYPYE 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” 类型

此外还有CDATA类型就是指字符串

PCDATA可以是字符串、子元素、字符串和子元素。

外部文档声明

加入DTD位于XML源文件的外部,那么他应通过下面的语法被封装在一个DOCTYPE定义中(DOCTYPE标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用语言解析器,它应该使用什么样的文档类型定义·DTD·来解析文档)

<!DOCTYPE 根元素 SYSTEM "文件名">

这个XML文档和上面的xml文档相同,但是拥有一个外部的DTD

<?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的"note.dtd"文件

image-20221120113046012

报错了

此XML文件似乎没有与之关联的任何样式信息。文档树如下所示。

正常,本来就只有这一个文件

为什么使用DTD

每一个xml文件均可携带有一个邮馆器自身格式的描述。独立的团体可以一直的使用某个标准的DTD来交换数据。应用程序

也可以使用某个标准的DTD来验证从外部接受到的数据。还可以使用DTD来验证自身的数据

DTD-XML构建模块

先把上面的话搬过来,便于理解

此外还有CDATA类型就是指字符串

PCDATA可以是字符串、子元素、字符串和子元素。

PCDATA

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

CDATA

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

DTD - 实体

一个内部实体声明

语法:

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

DTD例子:

<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML例子

<author>&writer;&copyright;</author>

一个实体由三部分组成:一个和号&,一个实体名称,以及一个分号;.

一个外部实体声明(不知道有什么区别)

语法:

PLAINTEXT
<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子:

PLAINTEXT
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

PLAINTEXT
<author>&writer;&copyright;</author>

XXE的是什么

https://zhuanlan.zhihu.com/p/381878896

介绍 xxe 之前,先说一下普通的 xml 注入,这个的利用面比较狭窄。如果有的话应该也是逻辑漏洞

image-20220328211733960

大概就是知道元素的结构之后将其闭合,然后构造恶意语句。是自己获得管理员权限

既然能插入 xml 代码,那么我们肯定不能善罢甘休,我们需要更多,于是就出现了 xxe

xxe (xml external ectity injection) 全称为 xml 外部实体注入,从名字就能看出来,这是一个注入漏洞,注入的是什么?xml 外部实体。如果能够注入外部实体并且成功解析的话,这就会大大扩展我们 xml 注入的攻击面

entity-实体

XXE定义了两种实体类型,分别是

  • 普通entity
  • 参数entity

背景知识

xml 是一种非常流行的标记语言,在 1990 年代后期首次标准化,并被无数的软件项目所利用。它用于配置文件,文档格式 (如 ooxml odf pdf rss…) , 图像格式 (svg exif 标题) 和网络协议 (webdav caldav xmlrpc soap xmpp saml xacml …), 它应用的如此的普遍以至于它出现任何的问题都会带来灾难性的结果

在解析外部实体的过程中,xml 解析器可以根据 url 中指定的方案 (协议) 来查询各种网络协议和服务 (dns,ftp http smb 等)) 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新,但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或者利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文

基础知识

xml 文档有自己的一个格式规范,这个格式规范是一个叫做 dtd 的东西控制的,它就是下面这个样子

PLAINTEXT
<?xml version="1.0"?>//这一行是 XML 文档定义
<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>

上面这个 dtd 就定义了 xml 的根元素是 message. 然后根元素下面有一些子元素,那么 xml 到时候必须像下面这样写

PLAINTEXT
<message>
<receiver>Myself</receiver>
<sender>Someone</sender>
<header>TheReminder</header>
<msg>This is an amazing book</msg>
</message>

其实除了在 dtd 中定义元素 (其实就是对应 xml 中的标签) 以外,我们还能在 dtd 中定义实体 (对应 xml 标签中的内容), 毕竟 xml 中除了能标签以外,还需要有些内容时固定的

<?xml version"1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd">]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>

这里既然能够读取 dtd 那我们是不是可以将路径换一换,换成敏感文件的路径,然后读敏感文件

有回显的读取本地敏感文件 (normal xxe)

这个实验的攻击场景模拟的是在服务能够接收并解析 xml 格式的输入并有回显的时候,我们就能输入我们自定义的 xml 代码,通过引用外部实体的方法,引用服务器上面的文件

在服务器上放解析xml的php代码。

<?php

    libxml_disable_entity_loader (false);
    $xmlfile = file_get_contents('php://input');
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
    $creds = simplexml_import_dom($dom);
    echo $creds;

?>

image-20220328224301972

这里我服务器还不知道怎么弄先上图了。

scp -r xmltest admin@120.55.103.132
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐