新闻中心

什么是XML Bomb (十亿笑弹攻击),它如何导致拒绝服务?

2025-12-16
浏览次数:
返回列表
XML Bomb是一种利用XML内部实体递归定义引发内存指数级膨胀的DoS攻击。它通过几百字节的恶意DTD嵌套声明,使解析器展开为GB级数据,导致OOM、线程阻塞且难被流量防护识别,防御需禁用DTD与外部实体并设解析限制。

什么是xml bomb (十亿笑弹攻击),它如何导致拒绝服务?

XML Bomb,俗称“十亿笑弹攻击”(Billion Laughs Attack),是一种典型的XML拒绝服务(DoS)攻击。它不依赖网络带宽或大量请求,而是靠极小的恶意XML文档,触发解析器指数级展开实体,瞬间耗尽服务器内存,导致服务挂起或崩溃。

心原理是利用XML的内部实体递归定义机制。攻击者在DTD中嵌套定义多个实体,让每个实体引用前一个并重复多次,形成几何级增长的数据量。

例如:

Ghostwriter Ghostwriter

Replit推出的AI编程助手,一个强大的IDE,编译器和解释器。

Ghostwriter 238 查看详情 Ghostwriter
<!DOCTYPE foo [
  <!ENTITY a "lol">
  <!ENTITY b "&a;&a;&a;&a;&a;">     <!-- 5个"lol" → 5×3 = 15字符 -->
  <!ENTITY c "&b;&b;&b;&b;&b;">     <!-- 5×15 = 75字符 -->
  <!ENTITY d "&c;&c;&c;&c;&c;">     <!-- 5×75 = 375字符 -->
  <!ENTITY e "&d;&d;&d;&d;&d;">     <!-- 5×375 = 1875字符 -->
]>
<foo>&e;</foo>

仅几百字节的输入,在解析时可能膨胀为数GB内存占用——嵌套越深、重复因子越大,爆炸效果越强。实际攻击中,4~5层嵌套就足以让多数默认配置的解析器OOM。

为什么会导致拒绝服务

- 内存耗尽:解析器必须将全部展开后的文本载入内存,无法流式处理 - 无明显流量特征:单次请求体积小,绕过传统流量型防护(如WAF、CDN限速) - 阻塞线程:同步解析会卡死整个处理线程,影响并发能力 - 普遍存在于旧系统:许多框架(如J*a SAX/DOM、.NET XmlReader、PHP libxml)默认启用DTD解析

典型触发场景

- 接收用户上传的XML配置文件或报表 - SOAP Web Service接口接收未过滤的XML请求体 - 内部微服务间基于XML的数据交换(尤其遗留系统) - 第三方SDK自动解析XML响应(如某些RSS/Atom解析库)

关键防御手段

- 禁用DTD解析:设置`setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)`(J*a)、`LIBXML_NO_DTDLOAD`(PHP)等 - 关闭外部实体:显式禁用`http://xml.org/sax/features/external-parameter-entities`和`external-general-entities` - 设置解析限制:如最大实体展开深度、总字符展开上限、嵌套层级阈值 - 替换为更安全的格式:优先使用JSON;若必须用XML,选用不支持DTD的轻量解析器(如Woodstox的`SecureXMLInputFactory`)

基本上就这些。不是所有XML解析都危险,但只要开了DTD+外部实体,默认就是敞开门等炸弹进来。

以上就是什么是XML Bomb (十亿笑弹攻击),它如何导致拒绝服务?的详细内容,更多请关注php中文网其它相关文章!


# 是一种  # 小报素材网站建设工作  # 文旅小镇营销推广段子  # 重庆营销推广在线咨询招聘  # 湖北seo电子厂  # 网络营销的网络推广方式  # 网站建设论文致谢英文  # 企业网站哪里做推广  # 优化技术推广网站排名  # 元氏个人网站推广的价格  # 广东酒店网站建设  # 创建一个  # 解决方法  # 文档  # 手把手  # 教你  # php  # 拒绝服务  # 多个  # 递归  # 为什么  # .net  # lol  # 内存占用  # xml解析  # 配置文件  # cdn  # 字节  # apache  # json  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 如何在Python中使用Optional类型处理可变对象并避免Pylint警告  理解Python模块与全局变量的作用域管理  LINUX怎么设置定时任务_LINUX crontab配置教程  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  iCloud登录入口网页版 苹果iCloud官网登录  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  解决Python单元测试中Mock异常方法调用计数为零的问题  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  c++ 命名空间怎么用 c++ namespace使用指南  谷歌google账号注册详细步骤 谷歌账号注册官方教程  夸克AO3官网入口_AO3镜像网站2025推荐  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  Animex动漫社网入口地址 Animex动漫社网正版在线入口  马斯克:Optimus 人形机器人复数形式为 Optimi  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  AO3官方可用镜像 Archive of Our Own网页版最新入口  AngularJS $http POST请求数据传递与Go后端接收实践  Go语言JSON解析深度指南:动态访问与结构体映射实践  不同用户不同价格! 索尼开启账户个性化定价测试  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  Golang如何使用net/url解析URL_Golang URL解析与处理方法  学习通网页版官方登录 超星学习通电脑端入口指南  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  C++ explicit关键字防止隐式转换_C++构造函数安全规范  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  利用5118提升短视频内容效果_5118短视频关键词优化方法  汽车之家官方网站官网入口_汽车之家网页版直接进入  c++如何使用Meson构建系统_c++比CMake更快的构建工具  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  《主播少女的秘密账号迷宫》首支宣传片  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  利用Bokeh CustomJS动态控制DataTable列可见性  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  J*aScript异步迭代器_j*ascript异步遍历  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  内存疯狂猛猛涨价:主板销量直接腰斩!  快手官方唯一登录入口 谨防山寨钓鱼网站  PHP URL参数传递与500错误调试指南 

搜索