欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 漏洞分析 | Apache Struts文件上传漏洞(CVE-2024-53677)

漏洞分析 | Apache Struts文件上传漏洞(CVE-2024-53677)

2025/5/3 14:14:12 来源:https://blog.csdn.net/WangsuSecurity/article/details/144855828  浏览:    关键词:漏洞分析 | Apache Struts文件上传漏洞(CVE-2024-53677)

漏洞概述

Apache Struts是美国阿帕奇(Apache)基金会的一个开源项目,是一套用于创建企业级Java Web应用的开源MVC框架。

近期,网宿安全演武实验室监测到Apache Struts在特定条件下,存在文件上传漏洞(网宿评分:高危;CVSS 3.0 评分:8.1):

攻击者可以操纵文件上传参数来实现路径遍历,在某些情况下,这可能导致恶意文件上传。目前该漏洞POC状态已在互联网公开,建议客户尽快做好自查及防护。

受影响版本

Struts 2.0.0 - 2.3.37(EOL)

Struts 2.5.0 - 2.5.33(EOL)

Struts 6.0.0 - 6.3.0.2

前置知识

在 Struts 2 中,有一个重要特性——值栈,它帮助我们能够轻松访问 Action 类中的属性。

而其工作原理可以简单理解为,当我们访问一个Action时,Struts 2就会创建该 Action 类的实例并将它推送到值栈的顶部。参照官方wiki(https://cwiki.apache.org/confluence/display/WW/OGNL+Basics)可知,使用top关键字即可访问栈顶对象。

示例代码如下:

MyAction.java

package com.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport {private String message;@Overridepublic String execute() throws Exception {message = "Hello";return SUCCESS;}public String getMessage() {return message;}
}

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h3>值栈访问示例:</h3>
<div><p>当前栈顶为(使用[0].top): <s:property value="[0].top" /></p><p>当前栈顶为(使用top): <s:property value="top" /></p><p>从栈顶查找MyAction属性(使用 [0].top): <s:property value="[0].top.message" /></p><p>从栈顶查找MyAction属性(使用 top): <s:property value="top.message" /></p>
</div>
</body>
</html>

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""http://struts.apache.org/dtds/struts-2.5.dtd">
<struts><package name="default" extends="struts-default"><action name="MyAction" class="com.struts2.MyAction"><result name="success">/test.jsp</result></action></package>
</struts>

结果如下:

漏洞分析

根据官方披露的信息(https://cwiki.apache.org/confluence/display/WW/S2-067)可知:

后续处理上传的拦截器将变更为org.apache.struts2.interceptor.ActionFileUploadInterceptor
其与org.apache.struts2.interceptor.FileUploadInterceptor的差别在于,直接将接收的文件通过 action.withUploadedFiles(acceptedFiles) 传递给 Action

而不是将文件绑定到 Action 的属性中。

那么可以猜测漏洞利用是通过参数绑定实现的,不过CVE-2023-50164以后,无法再借助大小写对set的参数进行覆盖。这时可以结合上文所了解的值栈知识突破,即访问值栈栈顶对象本身并修改其属性。

但后续调试时发现卡在了这一步:

protected boolean isAccepted(String paramName) {AcceptedPatternsChecker.IsAccepted result = acceptedPatterns.isAccepted(paramName);if (result.isAccepted()) {return true;} else if (devMode) { // warn only when in devModeLOG.warn("Parameter [{}] didn't match accepted pattern [{}]! See Accepted / Excluded patterns at\n" +"https://struts.apache.org/security/#accepted--excluded-patterns",paramName, result.getAcceptedPattern());} else {LOG.debug("Parameter [{}] didn't match accepted pattern [{}]!", paramName, result.getAcceptedPattern());}return false;
}

这里可以采用另一种方式:

成功修改文件名。

漏洞复现

这里设置上传路径为/test/a

filePath = ServletActionContext.getServletContext().getRealPath("/") + "test/a/";

正常上传:

非正常上传:

修复方案

目前厂商已发布升级补丁以修复漏洞:https://struts.apache.org/core-developers/file-upload

产品支持

网宿WAAP全站防护-云WAF已支持对该漏洞利用攻击的防护,并持续挖掘分析其他变种攻击方式和各类组件漏洞,第一时间上线防护规则,缩短防护“空窗期”。

除此之外,建议通过Bot管理产品来增强对新漏洞的防护,在大多数情况下,企业遇到的0day不是针对性的定向攻击,而是广泛的自动化扫描,攻击者发现一个0day/新漏洞之后,通常会先使用自动化工具进行全网扫描踩点,发现存在漏洞的网站再进一步攻击,通过部署Bot管理,可以有效阻断自动化扫描工具的访问,从而避免攻击面的暴露。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词