Web渗透:XXE-XML外部实体漏洞

news2024/11/24 6:27:14

XML External Entity (XXE) 漏洞是一种注入攻击,利用不安全的XML解析器来执行各种恶意操作,如读取本地文件、执行远程代码、发起拒绝服务攻击等;此漏洞的根本原因在于XML标准允许在文档中定义外部实体,并在解析时进行解析和替换。在正式开始阐述XXE漏洞之前首先来说明一下XML语言。

什么是XML?

XML(可扩展标记语言,Extensible Markup Language)是一种标记语言,用于描述数据。XML非常适合数据存储和传输,因为它是纯文本,并且是可读的和可扩展的。XML广泛用于各种应用程序中,包括配置文件、文档格式和数据交换等。

XML示例

下面是一个简单的XML示例,描述了一本书的信息:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <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>

在上述示例中:

  • 根元素是<bookstore>

  • bookstore元素包含两个子元素<book>

  • 每个<book>元素包含四个子元素:<title><author><year><price>

  • book元素还有一个属性category,用来标识书的类别。

  • title元素也有一个属性lang,用来标识语言。

XML的结构

XML文档由以下几部分组成:

  1. 声明(Prolog):可选部分,通常包含XML版本和编码声明。

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

  2. 根元素(Root Element):每个XML文档必须且只能有一个根元素,所有其他元素都是该根元素的子元素。

    <root>
        ...
    </root>

    在上述示例中的根元素是<bookstore>;根元素是整个XML文档的顶级元素。

  3. 元素(Element):由开始标签和结束标签包围的内容,可以包含属性、文本、子元素等。

    <element attribute="value">Content</element>
  4. 属性(Attribute):位于元素的开始标签内,提供额外的信息。

    <element attribute="value">Content</element>
  5. 文本(Text):元素内的内容,可以是纯文本或混合内容(文本和子元素的组合)。

    <element>Text content</element>
  6. CDATA(Character Data):不需要解析的文本数据,用于包含不需要被解析的字符,如HTML代码。

    <![CDATA[<div>Some HTML content</div>]]>
XML解析

不同编程语言提供了丰富的库来解析和生成XML文档;此处我们以PHP语言为例子进行演示:

<?php
$xml = <<<XML
<bookstore>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>
XML;
​
$xmlObject = simplexml_load_string($xml);
echo $xmlObject->book->title . "\n";     // 输出:Harry Potter
?>
XML-DTD文档类型定义

DTD(Document Type Definition,文档类型定义)是XML的一种语法,用于定义XML文档的结构和规则;DTD可以在XML文档内部(内部DTD)或外部(外部DTD)定义,通过DTD,您可以指定XML文档中允许的元素、属性、嵌套关系、数据类型等,从而确保XML文档的有效性和一致性。

以下是一个简单的XML文档及其对应的DTD示例:

xml文档
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore SYSTEM "bookstore.dtd">
<bookstore>
  <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>

重点解析:

<!DOCTYPE bookstore SYSTEM "bookstore.dtd">

这行代码是XML文档中的一个声明,指定了该文档所使用的外部DTD(文档类型定义)。

<!DOCTYPE bookstore ... >:这部分声明了XML文档的文档类型定义(DTD);bookstore 是根元素的名称,表示此DTD描述了名为 bookstore 的根元素及其内容结构。

SYSTEM "bookstore.dtd":SYSTEM关键字表示DTD的位置是一个系统标识符;"bookstore.dtd" 是一个外部DTD文件的路径或URL,这个文件定义了XML文档的结构和规则。

外部DTD(bookstore.dtd)
<!ELEMENT bookstore (book+)> 
<!ELEMENT book (title, author, year, price)>
<!ATTLIST book category CDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ATTLIST title lang CDATA #REQUIRED>
<!ELEMENT author (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT price (#PCDATA)>
DTD的组成部分:

①元素声明:用于定义元素的名称和内容模型;语法:<!ELEMENT 元素名 内容模型>

<!ELEMENT bookstore (book+)>
<!ELEMENT book (title, author, year, price)>

②属性声明:用于定义元素可以拥有的属性。语法:<!ATTLIST 元素名 属性名 属性类型 默认值>,示例:

<!ATTLIST book category CDATA #REQUIRED>
<!ATTLIST title lang CDATA #REQUIRED>

使用 <!DOCTYPE> 声明和外部DTD文件,可以确保XML文档符合预定义的结构和规则,帮助验证数据的有效性和一致性。这对于交换和处理结构化数据非常有用。

③实体声明(Entity Declarations):实体用于定义常用的文本片段,可以在XML文档中重复使用。语法:<!ENTITY 实体名 "实体值">;示例:

<!ENTITY example "This is an example entity">

在说完前置内容XML之后,这会儿我们就接着来说XXE漏洞;在此处我们也是拿pikachu靶场中的XXE相关靶场进行阐述说明:

1.打开页面后发现页面中出现一个输入框,该输入框是用来接收xml数据的一个接口,输入的内容只能是xml数据,若输入的内容为其他数据则此时我们会被质疑hh。

2.尝试输入一个简单定义义并使用了一个内部实体的XML文档;查看当前页面是否对输入的xml有回显:

<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe "This is an example entity">] >
<foo>&xxe;</foo>

<!DOCTYPE foo [...]>:声明文档类型定义(DTD)部分,指定该XML文档的根元素是foo

<!ENTITY xxe "This is an example entity">:定义了一个名为xxe的内部实体,其值为字符串 "This is an example entity"。

<foo>foo是根元素。

&xxe;:引用了之前定义的内部实体xxe

将xml数据输入后查看到页面效果:

此时可以判断当前页面对内部输入实体xml是有回显的,接着可以尝试输入xml内带外部实体的payload来确定当前页面是否支持外部实体。

<?xml version="1.0"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">] >
<foo>&xxe;</foo>

这个XML示例定义了一个外部实体 xxe,其内容是指向系统文件 C:/Windows/System32/drivers/etc/hosts。该外部实体在XML文档中被引用。如果一个不安全的XML解析器处理这个XML文档,它会尝试读取并插入 hosts 文件的内容。

<!DOCTYPE foo [...]>:声明文档类型定义(DTD)部分,指定该XML文档的根元素是foo

<!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">:定义了一个名为xxe的外部实体,指向系统文件路径 C:/Windows/System32/drivers/etc/hosts

<foo>foo是根元素。

&xxe;:引用了之前定义的外部实体xxe

输入payload后的效果:页面显示服务器中的hosts文件

攻击成功;接着我们结合源代码进行XXE漏洞原理的剖析:

$html='';
//考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析
if(isset($_POST['submit']) and $_POST['xml'] != null){
​
    $xml =$_POST['xml'];
//    $xml = $test;
    $data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
    if($data){
        $html.="<pre>{$data}</pre>";
    }else{
        $html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
    }
}

这个PHP代码片段的主要功能是处理用户提交的XML数据,并在某些条件下将其显示为HTML。

①使用 simplexml_load_string 函数加载用户提交的XML字符串,创建一个 SimpleXMLElement 对象。

第三个参数 LIBXML_NOENT 启用了外部实体解析。这意味着如果XML包含外部实体引用,解析器将尝试解析和替换它们。

@符号抑制了任何可能出现的警告或错误。

②如果成功加载XML(即 $data 不为空),将XML数据转换为字符串并包裹在<pre>标签中追加到 $html 中。

如果加载失败,显示一条提示信息,告知用户可能需要理解XML声明、DTD文档类型定义和文档元素。

        此处,这个代码片段存在一个严重的安全漏洞——XXE(XML External Entity Injection),因为指定了 LIBXML_NOENT 参数,启用了外部实体解析,这个时候攻击者就可以提交包含外部实体的XML数据,从而读取服务器上的敏感文件或执行其他恶意操作。

LIBXML 是 PHP 中用于处理 XML 数据的库,基于 libxml2 库。LIBXML 解析器提供了多种常量和选项,用于配置和控制 XML 文档的解析行为。但是在 libxml2 版本 2.9.0 之前,外部实体解析是默认启用的,这意味着,如果没有特别禁用外部实体解析,XML 解析器将会解析和处理外部实体,从而产生XXE漏洞。

XXE漏洞防护
1. 禁用外部实体解析

在 PHP 中,可以通过 libxml_disable_entity_loader 函数来禁用外部实体解析,这是防止 XXE 攻击的主要方法之一:

libxml_disable_entity_loader(true);
$xmlObject = simplexml_load_string($xmlString);
libxml_disable_entity_loader(false);
2. 验证和清理输入

在处理 XML 输入之前,进行严格的验证和清理,确保输入数据是可信的。例如:

  • 使用白名单验证文件类型和内容。

  • 对文件内容进行正则表达式验证。

3. 配置 Web 应用防火墙 (WAF)

配置 WAF 以检测和阻止恶意的 XML 数据。WAF 可以识别和拦截常见的 XXE 攻击模式。

4. 关闭不必要的功能

在 XML 解析器中,关闭不必要的功能,如外部实体解析、DTD 验证等,以减少攻击面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快储存,分布式文件系统,对象储存

Ceph块存储 镜像快照 快照可以保存某一时间点时的状态数据快照是映像在特定时间点的只读逻辑副本希望回到以前的一个状态&#xff0c;可以恢复快照使用镜像、快照综合示例 rbd create img1 --size 10G 创建镜像rbd ls 查看镜像 rbd info img1 #查看…

使用原子子表创建可重用的子组件

原子子表是一个图形对象&#xff0c;可帮助您在Stateflow图表中创建独立的子部件。原子子表允许&#xff1a; 对具有多个状态或层次结构的图表进行微小更改后&#xff0c;模拟速度更快。 在多个图表和模型中重复使用相同的状态或子表。 易于团队开发&#xff0c;适用于在同一图…

大语言模型在医疗领域的进展、应用和挑战_医疗大语言模型算法csdn

### 概述 本文综述了医学领域大型语言模型&#xff08;LLM&#xff09;的进展、应用和面临的挑战。大型语言模型如ChatGPT在理解和生成人类语言方面显示出了显著的能力&#xff0c;引起了广泛关注。在医学领域&#xff0c;研究人员正致力于利用LLM支持各种医疗任务&#xff0c…

文华财经盘立方博易大师主图指标公式大全源码均线

文华财经盘立方博易大师主图指标公式大全源码均线&#xff1a; N:3; EMA25:EMA(C,25),COLORRED,LINETHICK2; EMA70:EMA(C,70),COLORGREEN,LINETHICK2; EMA450:EMA(C,450),COLORYELLOW,LINETHICK2; CONDA1:EMA25>EMA70&&C>HV(H,6)&&C>EMA450&…

C语言 | Leetcode C语言题解之第179题最大数

题目&#xff1a; 题解&#xff1a; long cmp(int *x, int *y) {unsigned long sx 10, sy 10;while (sx < *x) {sx * 10;}while (sy < *y) {sy * 10;}return sx * (*y) (*x) - sy * (*x) - (*y); }char *largestNumber(int *nums, int numsSize) {qsort(nums, numsSi…

Linux C 程序 【01】最小程序

1.开发背景 基于 RK3568 平台的基础上&#xff0c;编译一个在系统上运行的最小程序。 2.开发需求 由于 RK3568 作为宿主机&#xff0c;在上面编译程序比较慢&#xff0c;所以还是采用在 Ubuntu 下交叉编译后再拷贝到宿主机上运行。 设计实验&#xff1a; 1&#xff09;搭建 M…

数据分析必备:一步步教你如何用matplotlib做数据可视化(14)

1、Matplotlib 图像 Matplotlib包中的图像模块提供加载&#xff0c;重新缩放和显示图像所需的功能。Pillow库支持加载图像数据。Matplotlib仅支持PNG图像。如果本机读取失败&#xff0c;下面显示的命令将回退到Pillow。 此示例中使用的图像是PNG文件&#xff0c;但请记住数据的…

AFLNet入门教学——测试RTSP协议实现Live555(Ubuntu)

1、简介 本文旨在使用AFLNet对RTSP协议实现Live555进行模糊测试。实验环境为&#xff1a;Ubuntu22.04.4AFLNet安装参考&#xff1a;AFLNet入门教学——安装&#xff08;Ubuntu22.04.4&#xff09;-CSDN博客 2、安装Live555 本次实验采取的是live555在2018年8月28日上传的版本…

数据库怎么同步

数据库要怎么同步呢&#xff0c;有很多方法&#xff0c;看你用什么数据库&#xff0c;如果是Sqlserver,你要数据库同步&#xff0c;那么可以使用自带的订阅发布&#xff0c;订阅发布应该是不错的方法&#xff0c;但是我上次要配置双向同步&#xff0c;它的对等发布好像没部署成…

【LeetCode】四、栈相关:有效的括号 + 下一个更大的元素

文章目录 1、栈结构2、Java中的栈3、leetcode20&#xff1a;有效的括号4、leetcode496&#xff1a;下一个更大元素 1、栈结构 和队列相反&#xff0c;栈先进后出 时间复杂度&#xff1a;访问、插入、删除都在栈顶进行操作&#xff0c;时间复杂度为O(1)&#xff0c;搜索需要遍…

【自监督-MIM】系列方法学习二

Masked image modeling 是一种训练深度学习模型的技术,尤其是在视觉领域,类似于自然语言处理中的掩码语言建模(Masked Language Modeling)。它通过在输入图像中随机遮挡(或称为掩码)部分区域,然后训练模型来预测这些被遮挡部分的内容,从而提高模型的视觉理解能力。 Ma…

常见的字符串函数(包含头文件string.h)和字符函数(2)

八. strstr函数 1.strstr的定义 char *strstr( const char *str1, const char *str2 ); ->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置&#xff0c;记录并返回该位置的指针&#xff0c;如果找不到&#xff0c;则返回NULL ->2. str1&#xff1a;查找字符…

Java毕业设计 基于SSM vue药店管理系统小程序 微信小程序

Java毕业设计 基于SSM vue药店管理系统小程序 微信小程序 SSM 药店管理系统小程序 功能介绍 用户 登录 注册 首页 药品信息 药品详情 加入购物车 立即购买 收藏 购物车 立即下单 新增收货地址 我的收藏管理 用户充值 我的订单 留言板 管理员 登录 个人中心 修改密码 个人信息…

【深度学习】python之人工智能应用篇--跨模态生成技术

跨模态生成技术概述 跨模态生成技术是一种将不同模态的数据&#xff08;如文本、图像、音频、视频等&#xff09;进行融合和转换的技术。其目标是通过将一个模态的数据作为输入&#xff0c;生成与之对应的另一个模态的输出。这种技术对于突破单一模态的局限性&#xff0c;提高…

【九】【QT开发应用】WebRTC的sigslot源码和使用WebRTC的sigslot使用编写信号槽

WebRTC&#xff08;Web Real-Time Communication&#xff09; 是一个开源项目&#xff0c;提供实时通信能力&#xff0c;广泛应用于视频、音频和数据传输。在WebRTC的实现中&#xff0c;sigslot库用于信号和槽机制&#xff0c;以实现事件驱动的编程模型。 WebRTC的sigslot部分…

如何精准分析人形机器人运动数据?

全球“机器换人”进程加速,人形机器人有望成为AI下一个重要落地应用场景;EtherCAT-Analyzer具备分析人形机器人所有关节和电池与主站的通讯信息,快速掌握节点网络状态! 前言 随着人形机器人行业的发展及《中国制造2025》的全面实施,传统的脉冲模式控制很大程度上制约了机…

一个例子理解傅里叶变换的计算过程

假设我们有一个简单的信号&#xff0c;由两个不同频率的正弦波组成&#xff0c;我们希望通过傅里叶变换来分析其频谱。 示例信号 假设我们有一个信号 &#xff1a; 这个信号由两个频率成分组成&#xff1a;一个50 Hz的正弦波和一个120 Hz的正弦波&#xff0c;后者的振幅是前者…

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二&#xff1a;说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多&#xff0c;重要的Exif信息&#xff1a;拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义&#xff0c;如果放到网上还是建议抹去这些信息。…

微服务框架中的Eureka和Ribbon的个人理解

微服务框架需要学习的东西很多&#xff0c;基本上我把它分为了五个模块&#xff1a; 第一&#xff1a;微服务技术模块 分为三个常用小模块&#xff1a; 1.微服务治理&#xff1a; 注册发现 远程调用 配置管理 网关路由 2.微服务保护&#xff1a; 流量控制 系统保护 熔断降级 服…

数据转换 | Matlab基于R对称点模式(symmetric dot pattern, SDP)一维序列信号转二维时频图象

目录 效果分析基本介绍程序设计参考资料获取方式 效果分析 基本介绍 数据转换 | Matlab基于R对称点模式(symmetric dot pattern, SDP)一维序列信号转二维时频图象 SDP常被用于信号分析和深度学习模式识别。 SDP是一种基于极坐标系的图像表示方法&#xff0c;可以直接将原始信…