漏洞概述
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;
@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>
结果如下:
漏洞分析
根据官方披露的信息(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 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;
}
这里可以采用另一种方式:
成功修改文件名。
漏洞复现
这里设置上传路径为/test/a
filePath = ServletActionContext.getServletContext().getRealPath("/") + "test/a/";
正常上传:
非正常上传:
修复方案
目前厂商已发布升级补丁以修复漏洞:https://struts.apache.org/core-developers/file-upload
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)