freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

漏洞分析 | Apache Struts文件上传漏洞(CVE-2024-53677)
2024-12-31 19:47:46
所属地 福建省

漏洞概述

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关键字即可访问栈顶对象。

1735644972_6773d72cb02e9523ddb81.png!small

示例代码如下:

MyAction.java

package com.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class MyAction extends ActionSupport {
    private String message;
    @Override
    public 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>

结果如下:

1735644987_6773d73b7d6a09843beca.png!small

漏洞分析

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

1735645096_6773d7a8b618010578a0b.png!small

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

1735645110_6773d7b6affe21d7c27da.png!small

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

1735645124_6773d7c497dc061011462.png!small

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

1735645137_6773d7d1c2d08b44549b1.png!small

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


protected boolean isAccepted(String paramName) {
    AcceptedPatternsChecker.IsAccepted result = acceptedPatterns.isAccepted(paramName);
    if (result.isAccepted()) {
        return true;
    } else if (devMode) { // warn only when in devMode
        LOG.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;
}

1735645154_6773d7e295e51962a7588.png!small

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

1735645190_6773d80617e2409ab8975.png!small

成功修改文件名。

1735645364_6773d8b41283fe852bcf6.png!small

漏洞复现

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


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

正常上传:

1735645394_6773d8d281a1ca8c8a4a0.png!small

1735645424_6773d8f09cc370b975154.png!small

非正常上传:

1735645449_6773d909d3e48c16e694e.png!small

1735645465_6773d919c77ed54e3c850.png!small

修复方案

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

# 网络安全 # struts漏洞 # 漏洞分析 # Apache Struts
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录