Java代码审计实战:XML外部实体注入(XXE)深度解析

Java代码审计实战:XML外部实体注入(XXE)深度解析

XML外部实体注入(XXE)是Web应用程序中一种常见但又常常被忽视的漏洞。它利用了XML解析器解析XML文档时,允许引用外部实体这个特性。如果解析器没有禁用外部实体引用,攻击者就可以通过构造恶意XML,从而导致敏感信息泄露、服务器端请求伪造(SSRF)、甚至命令执行。

1. 漏洞的本质:不可信的XML被信任

XML外部实体注入的根源在于XML解析器。XML文档支持使用实体(Entity)来定义可重用的数据。实体分为内部实体和外部实体。内部实体在文档内部定义,而外部实体则可以引用外部资源,例如本地文件或远程URL。当XML解析器没有正确配置,允许处理外部实体时,就产生了XXE漏洞。

一个典型的XXE攻击XML文档:

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

这段XML代码声明了一个名为xxe的外部实体,它的值是服务器上的/etc/passwd文件。当不安全的XML解析器解析这个文档时,它会去读取/etc/passwd文件的内容,并将其替换到&xxe;的位置,从而导致敏感文件内容泄露。

2. Java代码中的XXE常见表现形式

在Java中,许多处理XML的库在默认配置下都容易受到XXE攻击。常见的漏洞点通常出现在以下场景:

案例一:使用不安全的DOM或SAX解析器

在传统的Java开发中,使用 javax.xml.parsers 包来解析XML非常普遍。然而,如果开发者没有禁用对外部实体的支持,就会存在XXE漏洞。

// 不安全的DOM解析器代码
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("user.xml"));
//...

漏洞分析:

DocumentBuilderFactory.newInstance()创建的实例,在默认情况下通常会启用外部实体处理。攻击者可以向服务器上传或提交一个包含恶意实体的XML文件,当服务器使用这段代码解析时,就会触发XXE。

案例二:使用不安全的XML相关库

除了标准的 javax.xml.parsers 包,许多其他的XML相关库或框架也可能存在类似问题。例如,当Spring框架在处理XML请求时,如果配置不当,也可能导致XXE。

不安全的代码示例:

@PostMapping(path = "/api/user", consumes = "application/xml")
public String createUser(@RequestBody String xmlData) {// 假设内部使用不安全的XML解析库SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.newSAXParser();XMLReader xmlReader = saxParser.getXMLReader();// ...
}

漏洞分析:

这段代码接收XML格式的请求体,如果内部的XML解析器没有正确配置,攻击者可以提交一个包含外部实体的XML,从而发起XXE攻击。

案例三:利用XXE进行SSRF攻击

XXE漏洞不仅可以用于读取本地文件,还可以用于发起服务器端请求伪造(SSRF)。攻击者可以通过外部实体引用来请求内部网络资源,例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "http://192.168.1.100:8080/admin/user?id=1">
]>
<data>&xxe;</data>

漏洞分析:

当服务器解析这段XML时,它会向内网地址192.168.1.100:8080发起请求。如果内网服务没有访问控制,攻击者就可以利用这种方式探测内网服务、获取内部数据,甚至执行其他恶意操作。

3. 历史案例:Wordpress XML-RPC XXE 漏洞

在早期的Wordpress版本中,其XML-RPC接口存在XXE漏洞。攻击者可以发送一个恶意的XML-RPC请求,利用XXE来读取服务器上的任意文件,例如wp-config.php,从而获取数据库连接信息。这个漏洞的严重性在于,它允许攻击者在不进行身份验证的情况下,窃取到系统的敏感配置信息,为后续的攻击(如数据库渗透)提供了便利。

4. 审计与加固:构建XXE的防御体系

防御XXE漏洞的核心在于禁用外部实体引用

审计重点:

  • 寻找XML处理入口:在代码库中搜索所有与XML解析相关的API和库,如DocumentBuilderFactorySAXParserFactoryXMLReader,以及Spring MVC中@RequestBody注解接收application/xml的地方。

  • 追踪数据流:检查所有XML数据来源,看它们是否来自不可信的用户输入。

安全修复方案:

为了彻底杜绝XXE,必须在所有XML解析器中禁用对外部实体和DTD的支持。以下是针对不同解析器的防御方法:

  • DocumentBuilderFactory:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 禁用 DTD
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); // 禁用外部通用实体
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); // 禁用外部参数实体
    dbf.setXIncludeAware(false); // 禁用 XInclude
    
  • SAXParserFactory:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    
  • XMLInputFactory (StAX解析器):

    XMLInputFactory xif = XMLInputFactory.newFactory();
    xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
    xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
    
  • Spring Framework:

    在Spring MVC中,可以使用MappingJackson2XmlHttpMessageConverter或Jaxb2Marshaller来处理XML,并确保它们的底层解析器都进行了安全配置。

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

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

相关文章

当服务器出现网卡故障时如何检测网卡硬件故障并解决?

当服务器出现网卡故障时&#xff0c;可能导致网络通信中断&#xff0c;从而影响业务的正常运行。以下是检测网卡硬件故障、诊断问题并解决的详细方法和步骤。1. 网卡故障的常见表现1.1 硬件故障的常见症状网络无法连接&#xff1a;服务器无法访问外部网络或用户无法连接到服务器…

从车辆中心到用户中心:E/E架构的变革与挑战

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

RPC内核细节(转载)

RPC内核细节(转载) 背景 随着数据量、并发量、业务复杂度的增长&#xff0c;服务化是架构演进必由之路。服务化离不开RPC框架。 RPC服务化的好处 服务化的一个好处就是&#xff0c;不限定服务的提供方使用什么技术选型&#xff0c;能够实现大公司跨团队的技术解耦。 如下图…

SpringAMQP 的发布方确认

前言 这里的发布方确认是以 SpringAMQP 写的&#xff0c;之前我们在前面的篇章中就学过了 使用 Java 原生的SDK编写&#xff0c;当时是发布确认模式&#xff0c;在这里我们将用 Spring 集成的 rabbitmq 方法来编写 开启发布者确认机制需要进行下面的配置&#xff0c;以 yml 为例…

一套自用的git提交规范,可清晰的识别到关联的任务/bug

分享一套自用的git提交规范&#xff0c;可清晰的识别到关联的任务/bug 一、提交信息的基本结构 推荐使用约定式提交的一种变体&#xff0c;结构如下&#xff1a; <类型>(<范围>): <主题> [#<禅道-ID>]<正文>&#xff08;可选&#xff09;<脚注…

从音频到文本实现高精度离线语音识别

会议频繁&#xff0c;记录繁琐&#xff1f;语音转换成文字工具价格高昂&#xff0c;自己手动整理又耗时费力&#xff1f; 它支持本地离线运行&#xff0c;无需联网&#xff0c;所有数据留在本地&#xff0c;隐私安全毫无顾虑&#xff0c;同时它的功能是实时语音转文字&#xf…

SpringMVC 工作原理

SpringMVC 工作原理 SpringMVC 是 Spring 框架中用于构建 Web 应用的核心模块&#xff0c;其工作流程围绕 “前端控制器&#xff08;DispatcherServlet&#xff09;” 展开&#xff0c;通过组件间的协作完成请求处理与响应。理解其工作原理是掌握 SpringMVC 开发的关键&#xf…

HoRain云--Python机器学习神器:Sklearn全解析

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

疯狂星期四文案网第64天运营日记

网站运营第64天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况

设计一个 AB 测试平台

1. 需求明确化 功能需求实验管理 创建、编辑、删除、复制实验设置实验参数&#xff08;变体、权重、目标指标、时长等&#xff09;实验状态管理&#xff08;草稿、运行中、已结束&#xff09;用户分流与分配 支持多种分流策略&#xff08;随机分配、分层分配、定向分配&#xf…

HiCMAE 论文复现:基于 RAVDESS 数据集的音视频情感识别

HiCMAE 论文复现:基于 RAVDESS 数据集的音视频情感识别 1. 项目背景与论文概述 1.1 多模态情感识别背景 多模态情感识别是人工智能领域的重要研究方向,旨在通过结合多种感知模态(如音频、视频、文本等)来更准确地识别人类情感状态。与传统单模态方法相比,多模态方法能够…

HarmonyOS 数据处理性能优化:算法 + 异步 + 分布式实战

摘要 不管是写 App&#xff0c;还是做 IoT 设备开发&#xff0c;数据处理都是绕不开的主题。你可能要处理几百条传感器数据&#xff0c;也可能要应对几十万条用户行为日志。如果算法不够高效&#xff0c;应用就会卡顿甚至直接崩溃。尤其是在 HarmonyOS&#xff08;鸿蒙系统&…

华为麒麟操作系统运维常见知识点

1.开放root账号密码登录。(1)修改/etc/ssh/sshd_config文件中&#xff0c;PermitRootLogin 属性值为yes。PermitRootLogin yes(2)使用passwd命令设置root密码。sudo su 切换到root账户下&#xff0c;使用passwd 设置密码。(3)重启sshd服务。systemctl restart sshd2.避免使用ch…

嵌入式面试|MCU+RTOS技术栈——面试八股文整理3:STM32

目录 1.单片机启动流程 2.看门狗 3.最小系统 4.ROM、RAM、Flash 5.EPROM、EEPROM 6.Bootloader与OTA 7.NAND FLASH 和NOR FLASH 相同点 区别 适用场景 8.CPU、MPU、MCU、SOC、SOPC 9.交叉编译 10.寄存器 寄存器的作用 寄存器与内存的区别 11.Cortex-M3寄存器组…

用 Wisdom SSH 轻松实现服务器自动化任务调度

用Wisdom SSH轻松实现服务器自动化任务调度 在服务器管理工作中&#xff0c;自动化任务调度至关重要&#xff0c;它能让系统在特定时间自动执行预设任务&#xff0c;极大提升运维效率。Wisdom SSH作为一款具备AI助手的强大工具&#xff0c;为自动化任务调度带来便捷解决方案。 …

远场学习_FDTD_dipole(1)

项目4.4 Reflection calculation using a dipole source在此页面中&#xff0c;我们采用了一种不同于标准平面波源方法的替代模拟设置&#xff0c;使用偶极子源来计算多层堆叠结构的反射。在此情况下&#xff0c;我们使用空气 - 玻璃界面。这种技术很有吸引力&#xff0c;因为它…

机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!

国内用户必看】用Lima在macOS免费搭建Docker环境&#xff0c;彻底解决镜像与收费难题&#xff01; 为了在不同操作系统有一致操作体验&#xff0c;我选择使用docker技术安装ollama&#xff0c;这样子还有一个好处&#xff0c;即使玩坏了&#xff0c;删除重建即可&#xff0c;所…

Java 生成签名证书

在Java中生成签名证书通常涉及到使用Java密钥和证书管理工具&#xff08;Java Key and Certificate Management API&#xff0c;即Java Keytool&#xff09;。这个过程通常包括创建密钥库&#xff08;KeyStore&#xff09;&#xff0c;生成密钥对&#xff08;Key Pair&#xff…

语法分析:编译器中的“语法警察”

在编程的世界里&#xff0c;每一种编程语言都有自己的语法规则。就像中文有标点符号和语序规则一样&#xff0c;编程语言也有自己严格的语法规则。语法分析器就像一个严格的"语法警察"&#xff0c;它的职责是检查源代码是否符合语言规范&#xff0c;同时为后续的处理…

容器的定义及工作原理

定义 你可以把 容器 想象成一个 “打包好的软件快递箱”。 里面有什么&#xff1f; 这个箱子里不仅装着你的软件&#xff08;比如一个网站程序&#xff09;&#xff0c;还把软件运行所需要的所有东西都打包进去了&#xff0c;比如它需要哪个版本的Python、需要哪些系统文件、配…