Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

admin 2024年12月19日14:46:13评论79 views字数 2770阅读9分14秒阅读模式

漏洞概述

CVE-2024-53677 是一个在 Apache Struts 框架中发现的严重漏洞,可能允许攻击者远程执行任意代码。漏洞的根本原因是文件上传逻辑存在缺陷,攻击者可以利用该缺陷进行路径穿越和恶意文件上传。

该漏洞影响了特定版本的 Apache Struts,开发者和系统管理员应立即采取措施,防止被利用。

受影响的版本

以下版本的 Apache Struts 受到影响:

  •  2.0.0 至 2.5.33
  •  6.0.0 至 6.3.0.2

已修复版本: 6.4.0 及更新的版本

漏洞详情

CVE-2024-53677 是一个严重的文件上传机制漏洞,攻击者可以利用该漏洞实现以下攻击行为:

  1. 路径穿越攻击 通过操作文件上传的参数,攻击者可将文件上传到服务器的任意位置,绕过安全机制。
  2. 远程代码执行(RCE) 攻击者可上传并触发可执行文件(例如 .jsp 脚本或二进制载荷),在服务器上远程执行恶意代码。

根据 Apache Struts 官方公告,此漏洞与旧的文件上传机制不兼容。使用旧文件上传方式的组织需要重写上传逻辑,以采用 6.4.0 版本中提供的安全机制。

环境搭建

Struts2环境搭建比较简单,下面用了idea配合本地tomcat环境进行了搭建。

复现时使用了两种不同的漏洞场景,下面是复现的整个过程。

使用到的工具:

IdeaIntelliJ IDEA CommunityEdition源码(https://github.com/xhycccc/Struts2-Vuln-Demo)TomcatApacheArchiveDistributionDirectory

可能遇到的坑

环境启动需要tomcat,IDEA版本为Ultimate才会有tomcat(收费版),一般情况都安装的是Community(社区版)

先看下项目结构

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议
  •  UploadsAction对应多文件上传的场景
  •  UploadAction对应单文件上传的场景

详细的源码会在后面有下载地址。

思考过程

这次的漏洞是S2-066的绕过,所以需要对上一个漏洞的原理有所了解。

具体的可以去网上找一下分析过程,这里不再描述。上一个漏洞官方修复方法是在FileUploadInterceptor中设置参数时,忽略大小写遍历删除同名参数再做添加。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

S2-067,不同于以往的漏洞分析,这一次不能通过官方的commits对比快速定位漏洞原因。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

原因是官方直接使用了一个新的类,在官方文档中,告诉我们在处理上传时推荐使用新的拦截器org.apache.struts2.interceptor.ActionFileUploadInterceptor

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

查看官方文档后,大概的上传绕过思路就是:在参数名与文件上传参数不一致的前提下,能通过Ognl参数绑定过程对文件名做修改。

利用过程

多文件上传场景

为方便调试,首先构造一个上传多文件的数据包,进行发包测试。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

由于在这里uploadFileName是列表的格式

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

很容易想到使用中括号写法uploadFileName[0]的形式对其中的文件名做修改。

那么使用poc测试一遍,很明显uploadFileName[0]这种方法绕过是成功的。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

单文件上传场景

同样是先构造一个数据包,进行发包测试。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

利用同样的方法再进行测试,失败。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

同样的Payload放在单文件上传的场景自然而然就失效了,uploadFileName在这里只是一个String类型的变量。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

为了完成文件名的修改,我们依旧需要在参数名与文件上传参数不一致的前提下,通过Ognl参数绑定过程对文件名做修改。

在Struts2中默认的实现为OgnlValueStack,Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中,我们可以使用[0]获取整个栈对象,为方便显示转换为String对象,调用其 toString()方法输出对象信息,可以看到栈顶元素即为我们的Action对象。

具体可以参考文章

https://blog.csdn.net/ambow_cq/article/details/7458810

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

因此我们可以使用top关键词直接获取到栈顶的Action对象,从而获取到FileName参数。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

我们可以尝试使用[0].top.UploadFilename来对文件名做修改,但从返回结果来看并没有成功。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

利用前面提到的文章中的思路

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

[0].top等价于top,利用该方法再测试一遍,上传成功。

Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

修复建议

官方建议:

升级Apache Struts2版本:官方推荐的最直接和有效的修复方法是升级到已修复该漏洞的版本。

升级到6.4.0或更新的版本。

这样可以确保您使用的是包含安全修复的版本,从而防止攻击者利用该漏洞进行路径穿越攻击和远程代码执行。

非官方建议(适用于不敢升级的情况):

重写文件上传逻辑:如果您的组织因为兼容性或其他原因无法立即升级到最新版本的Apache Struts2,您可以考虑重写文件上传逻辑,以确保上传的文件被正确处理和存储。

具体步骤如下:

  • 参数验证:在文件上传之前,严格验证上传的文件类型和大小,确保它们符合预期的格式和限制。
  • 路径穿越防御:确保上传的文件名不包含路径遍历字符(如../),这可以通过在服务器端对文件名进行清理和验证来实现。
  • 文件存储位置:将上传的文件存储在非Web根目录下,以防止直接通过URL访问这些文件。
  • 使用新的拦截器:根据官方文档,使用org.apache.struts2.interceptor.ActionFileUploadInterceptor作为文件上传的处理拦截器,这个新的拦截器可能包含了针对此类漏洞的防御机制。
  • 禁用不必要的功能:如果可能,禁用Struts2框架中不必要的功能,特别是那些与文件上传相关的功能,以减少攻击面。
  • 监控和日志记录:增强监控和日志记录机制,以便及时发现和响应可疑的文件上传活动。

这些建议可以帮助您在不升级Apache Struts2版本的情况下,尽可能地减少CVE-2024-53677漏洞带来的风险。然而,官方推荐的升级到最新版本始终是好的修复办法,因为它包含了最新的安全修复和改进。

参考连接

https://struts.apache.org/core-developers/action-file-uploadhttps://github.com/XiaomingX/CVE-2024-53677-S2-067https://blog.csdn.net/ambow_cq/article/details/7458810https://www.cnblogs.com/hetianlab/p/18084560https://y4tacker.github.io/

原文始发于微信公众号(君立渗透测试研究中心):Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月19日14:46:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Struts2漏洞深度解析 :CVE-2024-53677任意文件上传逻辑绕过及修复建议https://cn-sec.com/archives/3528537.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息