S2-037 远程代码执行漏洞检测与利用

本文深入分析Struts2 S2-037远程代码执行漏洞,该漏洞无需开启动态方法执行即可触发,影响2.3.20至2.3.28.1版本。文章详细描述了漏洞利用思路及修复建议。

struts2 s2-037远程代码执行漏洞介绍

S2-037的漏洞利用思路建立在s2-033的基础只上,还是对method没有进行过滤导致的,漏洞影响Struts 2.3.20 – Struts 2.3.28.1版本,使用到REST插件的Struts2应用,会被攻击者实现远程代码执行攻击,struts2 历次的漏洞公告和详情官方都有专门的页面进行整理和汇总,可以从这个页面找到历次的struts2的漏洞。

https://cwiki.apache.org/confluence/display/WW/Security+Bulletins

struts2 s2-037漏洞详情分析

此次的s2-037是基于033的一个绕过,在033中,需要开启动态方法执行,也就是032的条件,同时还需要安装rest插件。而037中,不需要开启动态方法执行就能触发代码执行漏洞。

首先看看033触发过程

开启动态方法执行需要在struts.xml中配置,这和032没区别

在getMapping方法中,在处理动态代码执行过程中设置的属性没有做过滤

因为在uri中的!后面的属性加入到了mapping中,然后如果开启了动态代码执行,也就是allowDynamicMethodCalls开启,最后method会进入到com.opensymphony.xwork2.DefaultActionInvocation类的invokeAction方法,之后的就是跟032一样了,可以参考之前的我们分析struts2漏洞的文章。

接下来看看037怎么绕过开启动态方法,通杀所有rest插件的。

在调用完handleDynamicMethodInvocation(mapping, mapping.getName());后面又调用了

同时看到这里没有判断

所以这个地方不需要开启动态执行,同时也在这里给出了提示

这里加上了三目运算符才绕过测试结果如下:

可以看到成功执行了system命令。

Poc:

目前官方已经在该页面给出了公告。

https://cwiki.apache.org/confluence/display/WW/S2-037

受影响的用户请尽快升级您的版本到2.3.29。

### Struts2 S2-061 远程代码执行分析 Apache Struts2 是一个广泛使用的 Java Web 开发框架,其设计基于 MVC 架构,提供了强大的标签库和 OGNL 表达式解析功能。然而,在 2020 年 12 月 8 日,Apache Struts 官方披露了 S2-061 远程代码执行(CVE-2020-17530),该源于某些标签属性在特定情况下会进行 OGNL 表达式的二次解析,从而导致 OGNL 注入。攻击者可以构造恶意请求,远程执行任意命令,甚至控制服务器,造成严重安全风险 [^1]。 的核心在于 Struts2 对某些标签属性(如 `id`)的值进行两次 OGNL 表达式解析。当这些属性值中包含 `%{x}` 形式的内容,且 `x` 的值由用户控制时,攻击者可以注入恶意的 OGNL 表达式,例如 `%{payload}`,从而触发远程代码执行 [^3]。 S2-061 是对之前 S2-059 的修复绕过。S2-059 的补丁主要修复了沙盒绕过问题,但未完全阻止 OGNL 表达式的执行。S2-061 利用了 `org.apache.commons.collections.BeanMap` 类,该类存在于 `commons-collections-x.x.jar` 包中,而 Struts2 官方最小依赖包并未包含此库。因此,即使存在支持 OGNL 表达式注入的点,若未使用该依赖包,也无法成功利用 [^3]。 ### 影响范围 S2-061 影响使用 Apache Struts2 的多个版本,尤其是在使用某些标签属性时存在 OGNL 表达式二次解析的情况。攻击者可以构造特定的请求,利用远程执行任意命令,进而控制服务器,造成数据泄露、系统瘫痪等严重后果 [^1]。 ### 修复方案 1. **升级 Struts2 版本**:官方在披露后发布了修复版本,建议用户尽快升级到 Struts 2.5.26 或更高版本。新版本中对 OGNL 表达式的解析机制进行了改进,避免了标签属性的二次解析问题 [^1]。 2. **避免使用用户输入构造 OGNL 表达式**:在开发过程中,应避免将用户输入直接拼接到 OGNL 表达式中,尤其是标签属性值。应使用安全的输入验证和输出编码机制,防止恶意输入被当作表达式解析 [^3]。 3. **移除不必要的依赖库**:由于 S2-061 的利用依赖于 `commons-collections` 包,因此建议检查项目依赖,移除不必要的 `commons-collections` 版本,以降低攻击面 [^3]。 4. **启用安全模式(沙盒)**:Struts2 提供了安全模式(沙盒)功能,可以在一定程度上限制 OGNL 表达式的执行。建议在配置文件中启用沙盒模式,并限制表达式的执行权限 [^4]。 5. **部署 Web 应用防火墙(WAF)**:为了进一步增强安全性,建议在前端部署 Web 应用防火墙(WAF),对请求进行过滤和检测,识别并拦截包含 OGNL 表达式的恶意请求 [^2]。 ### 示例代码:安全的输入处理 以下是一个简单的示例,展示如何避免将用户输入直接拼接到 OGNL 表达式中: ```java public class SafeInputAction { private String userInput; public String execute() { // 对用户输入进行过滤和转义 String safeInput = escapeUserInput(userInput); // 将安全处理后的输入用于业务逻辑 // ... return "success"; } private String escapeUserInput(String input) { // 实现输入过滤逻辑,如移除特殊字符 if (input == null) { return null; } return input.replaceAll("[^a-zA-Z0-9]", ""); } // Getter 和 Setter public String getUserInput() { return userInput; } public void setUserInput(String userInput) { this.userInput = userInput; } } ``` 在 JSP 页面中,确保标签属性不直接使用用户输入构造 OGNL 表达式: ```jsp <s:textfield name="userInput" label="请输入内容" /> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值