漏洞概述
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 是一个严重的文件上传机制漏洞,攻击者可以利用该漏洞实现以下攻击行为:
-
路径穿越攻击 通过操作文件上传的参数,攻击者可将文件上传到服务器的任意位置,绕过安全机制。 -
远程代码执行(RCE) 攻击者可上传并触发可执行文件(例如 .jsp 脚本或二进制载荷),在服务器上远程执行恶意代码。
根据 Apache Struts 官方公告,此漏洞与旧的文件上传机制不兼容。使用旧文件上传方式的组织需要重写上传逻辑,以采用 6.4.0 版本中提供的安全机制。
环境搭建
Struts2环境搭建比较简单,下面用了idea配合本地tomcat环境进行了搭建。
复现时使用了两种不同的漏洞场景,下面是复现的整个过程。
使用到的工具:
Idea(IntelliJ IDEA CommunityEdition)源码(https://github.com/xhycccc/Struts2-Vuln-Demo)Tomcat(ApacheArchiveDistributionDirectory)
可能遇到的坑
环境启动需要tomcat,IDEA版本为Ultimate才会有tomcat(收费版),一般情况都安装的是Community(社区版)
先看下项目结构
-
UploadsAction对应多文件上传的场景 -
UploadAction对应单文件上传的场景
详细的源码会在后面有下载地址。
思考过程
这次的漏洞是S2-066的绕过,所以需要对上一个漏洞的原理有所了解。
具体的可以去网上找一下分析过程,这里不再描述。上一个漏洞官方修复方法是在FileUploadInterceptor中设置参数时,忽略大小写遍历删除同名参数再做添加。
S2-067,不同于以往的漏洞分析,这一次不能通过官方的commits对比快速定位漏洞原因。
原因是官方直接使用了一个新的类,在官方文档中,告诉我们在处理上传时推荐使用新的拦截器org.apache.struts2.interceptor.ActionFileUploadInterceptor
查看官方文档后,大概的上传绕过思路就是:在参数名与文件上传参数不一致的前提下,能通过Ognl参数绑定过程对文件名做修改。
利用过程
多文件上传场景
为方便调试,首先构造一个上传多文件的数据包,进行发包测试。
由于在这里uploadFileName是列表的格式
很容易想到使用中括号写法uploadFileName[0]的形式对其中的文件名做修改。
那么使用poc测试一遍,很明显uploadFileName[0]这种方法绕过是成功的。
单文件上传场景
同样是先构造一个数据包,进行发包测试。
利用同样的方法再进行测试,失败。
同样的Payload放在单文件上传的场景自然而然就失效了,uploadFileName在这里只是一个String类型的变量。
为了完成文件名的修改,我们依旧需要在参数名与文件上传参数不一致的前提下,通过Ognl参数绑定过程对文件名做修改。
在Struts2中默认的实现为OgnlValueStack,Struts2在执行一次请求的过程中会把当前的Action对象自动存入值栈中,我们可以使用[0]获取整个栈对象,为方便显示转换为String对象,调用其 toString()方法输出对象信息,可以看到栈顶元素即为我们的Action对象。
具体可以参考文章
https://blog.csdn.net/ambow_cq/article/details/7458810
因此我们可以使用top关键词直接获取到栈顶的Action对象,从而获取到FileName参数。
我们可以尝试使用[0].top.UploadFilename来对文件名做修改,但从返回结果来看并没有成功。
利用前面提到的文章中的思路
[0].top等价于top,利用该方法再测试一遍,上传成功。
修复建议
官方建议:
升级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任意文件上传逻辑绕过及修复建议
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论