漏洞描述
Struts2 是第二代基于Model-View-Controller (MVC)模型的java企业级web应用框架。它是WebWork和Struts社区合并后的产物。Apache Struts2在实现过程中使用了OGNL表达式,并将用户通过URL提交的内容拼接入OGNL表达式中,当debug模式开启时,攻击者可以通过构造恶意URL来执行任意Java代码,进而可执行任意命令。
漏洞验证
测试结果如下图所示:
修复建议
1、如您正在使用Jakarta文件上传插件或者是存在漏洞的Struts 2版本请升级至Struts2安全版本。
2、使用Servlet过滤器验证Content-Type丢弃不匹配的请求multipart/form-data。
3、官方表示,如果用户正在使用基于Jakarta的文件上传插件,建议升级至Struts版本2.3.32或2.5.10.1。
4、如果暂时不便升级,官方也已准备了两个可以作为应急使用的Jakarta插件版本,用户可以下载使用,链接地址如下:
https://github.com/apache/struts-extras
改用其他Multipart parser应用,比如Pell,相关链接如下:
https://cwiki.apache.org/confluence/display/S2PLUGINS/P
修复方法
对于该漏洞,可根据修复建议中的升级struts版本来进行修复,本人由struts2.3.23升级到2.3.32版本。由于jar包相互依赖,所以在升级版本的时候还应该注意导入的包。
以下是由struts2.3.23升级到2.3.32版本所替换的jar包,仅供参考:
- ognl-3.0.19.jar
- struts2-config-browser-plugin-2.3.32.jar
- struts2-convention-plugin-2.3.32.jar
- struts2-core-2.3.32.jar
- struts2-json-plugin-2.3.32.jar
- struts2-spring-plugin-2.3.32.jar
- xwork-core-2.3.32.jar
以下是web.xml关于struts2的配置
<!-- struts2配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts-execute</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
结尾
第一次对struts版本进行升级,在替换jar包的过程中,由于jar包的依赖问题导致项目启动不起来的问题还是解决挺长时间的。现在项目已经可以正常启动,但是因为对象有部分字段用懒加载实现的问题,导致了在获取对象属性的时候,会报懒加载异常的问题,这个问题有待明天进行解决。以上就是本人解决该漏洞的步骤,由于如有什么建议或意见,欢迎各位小伙伴提出。