XML外部实体注入漏洞的示例分析
发布时间 - 2023-05-11 00:00:00 点击率:次一、XML外部实体注入
xml
外部实体注入漏洞也就是我们常说的 xxe 漏洞。xml 作为一种使用较为广泛的数据传输格式,很多应用程序都包含有处理 xml 数据的代码,默认情况下,许多过时的或配置不当的 xml 处理器都会对外部实体进行引用。
如果攻击者可以上传 XML 文档或者在 XML 文档中添加恶意内容,通过易受攻击的代码、依赖项或集成,就能够攻击包含缺陷的XML处理器。XXE 漏洞的出现和开发语言无关,只要是应用程序中对 xml 数据做了解析,而这些数据又受用户控制,那么应用程序都可能受到 XXE 攻击。本篇文章以 java 程序为例给大家介绍 XXE 漏洞的成因及修复。XXE 漏洞详细请见 CWE-611: Improper Restriction of XML External Entity Reference ('XXE')(http://cwe.mitre.org/data/definitions/611.html)。
二、XML外部实体注入
XXE 漏洞可能会用于提取数据、执行远程服务器请求、扫描内部系统、执行拒绝服务攻击和其他攻击。业务影响主要取决于受影响的引用程序和数据保护需求。
2018年至今,CVE 中共有发布了 92 条漏洞信息与其相关。部分CVE如下:
| CVE-2018-8027 | Apache Camel 2.20.0 到 2.20.3 和2.21.0 Core 在 XSD 验证处理器中存在 XXE 漏洞。 |
|---|---|
| CVE-2018-13439 | 微信支付 Java SDK 中的 WXPayUtil 类中存在XXE漏洞。 |
| CVE-2018-1000548 | 在版本号小于 14.3 的 Umlet 中,在文件解析中存在XML外部实体注入漏洞,可能导致机密数据泄露、拒绝服务、服务器端请求伪造。此攻击可以通过特制的 UXF 文件进行攻击。 |
| CVE-2018-1364 |
IBM Content Bavigator 2.0 和 3.0 版本中在处理XML数据时,易受XML外部实体(XXE)攻击。远程攻击者可以利用此漏洞暴露敏感信息或占用内存资源。 |
三、示例代码
3.1 缺陷代码
本节使用示例代码来源为某开源支付 Java SDK (https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1),源文件名:WXPayUtil.java,文件路径为:java-sdk-v3\src\main\java\com\github\wxpay\sdk。
在上述代码可以看到在25行处数据通过 xmlToMap 形参传入,数据未做任何过滤,且 XML 处理器也未做安全设置就在32行处对数据做了解析,而实际场景中,参数 strXML 也是受攻击者控制的,这样攻击者可能通过构造恶意的 strXML 来进行 XXE 攻击。
使用360代码卫士对上述示例代码进行检测,可以在文件第32行检出“有风险的XML外部实体注入”缺陷。如图1所示:
图1 检测出有风险的XML外部实体注入
3.2 修复代码
在上述修复代码中的第28行使用的是一个xml工具类WXPayXmlUtil,用于生成一个安全的xml处理器。而 WXPayXmlUtil 类中最为关键的是第16行,通过 setFeature 让生成的 xml 处理器完全禁用 DTDS。通过图2可以看出,360代码卫士对修复后的代码并未检出缺陷。
图2 XXE漏洞修复示例
四、如何避免XXE漏洞
常见的避免方法:
1. 尽可能使用简单的数据格式(如:JSON),避免对敏感数据进行序列化;2. 及时修复或更新应用程序或底层操作系统使用的所有XML处理器和库。同时,通过依赖项检测,将SOAP更新到1.2版本或更高版本;3. 在应用程序的所有XML解析器中禁用XML外部实体和DTD进程,具体实现可以参考《OWASP Cheat Sheet ‘XXE Prevention’》(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet)如下代码是java应用程序中使用DocumentBuilderFactory解析xml时防范XXE漏洞的示例:4. 输入校验:在服务器端使用白名单进行输入验证和过滤,以防在XML文档、标题或节点中出现恶意数据。5. 验证XML和XSL文件上传功能是否使用XSD验证或其他类似验证的方法来验证上传的XML文件6. DAST工具需要额外的手动步骤来检查和利用XXE漏洞,而使用ASAT工具可以通过检测依赖项和安全配置来发现XXE漏洞。
# Java
# php
# json
# html
# xml
# 形参
# github
# http
# https
# 应用程序
# 的是
# 可以通过
# 文档
# 类中
# 未做
# 拒绝服务
# 器中
# 上传
# 就在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
php json中文编码为null的解决办法
如何在Ubuntu系统下快速搭建WordPress个人网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
奇安信“盘古石”团队突破 iOS 26.1 提权
javascript如何操作浏览器历史记录_怎样实现无刷新导航
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
高防服务器:AI智能防御DDoS攻击与数据安全保障
Swift中switch语句区间和元组模式匹配
如何在IIS中配置站点IP、端口及主机头?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Bootstrap整体框架之CSS12栅格系统
如何利用DOS批处理实现定时关机操作详解
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
LinuxShell函数封装方法_脚本复用设计思路【教程】
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel如何为API生成Swagger或OpenAPI文档
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel如何实现用户注册和登录?(Auth脚手架指南)
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
大同网页,大同瑞慈医院官网?
5种Android数据存储方式汇总
如何在香港服务器上快速搭建免备案网站?
如何用已有域名快速搭建网站?
Python文本处理实践_日志清洗解析【指导】
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
使用Dockerfile构建java web环境
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何破解联通资金短缺导致的基站建设难题?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
三星网站视频制作教程下载,三星w23网页如何全屏?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
图册素材网站设计制作软件,图册的导出方式有几种?
MySQL查询结果复制到新表的方法(更新、插入)
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
浅谈javascript alert和confirm的美化
实例解析angularjs的filter过滤器
Laravel如何使用Vite进行前端资源打包?(配置示例)

