java struts2 远程执行任意java代码bug漏洞修复

漏洞前提

开启动态方法调用, struts.xml配置

<constant name="struts.enable.DynamicMethodInvocation" value="true" />
沙盒绕过

通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,这样就可以绕过SecurityMemberAccess的限制。

漏洞详情

https://struts.apache.org/docs/s2-032.html

详解测试

假如动态方法调用已经开启,然后我们要调用对应的login方法的话 我们可以通过http://localhost:8080/struts241/index!login.action来执行动态的方法调用。这种动态方法调用的时候method中的特殊字符都会被替换成空,但是可以通过http://localhost:8080/struts241/index.action?method:login来绕过无法传入特殊字符的限制。

接收到的参数会经过处理存入到ActionMapping的method属性中。DefaultActionProxyFactory将ActionMappping的method属性设置到ActionProxy中的method属性(虽然做了escapeEcmaScript,escapeHtml4过滤,但是我们可以通过变量传递方式绕过,具体可以参考poc)。如下图

而DefaultActionInvocation.java中会把ActionProxy中的method属性取出来放入到ognlUtil.getValue(methodName + “()”, getStack().getContext(), action);方法中执行ognl表达式,如下图

3. 沙盒绕过

通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,这样就可以绕过SecurityMemberAccess的限制。

4. poc

a. 测试环境

b. 结果

修复方案

升级至struts 2.3.20.2,struts 2.3.24.2, struts 2.3.28.1

临时解决方案

1. 检查是否使用struts2
2. 检查是否开启动态方法调用
3. 在struts前端nginx配置正则拦截攻击请求
正则:if($args ~ @ognl.OgnlContext@DEFAULT_MEMBER_ACCESS) { return 404;}
升级Struts 2至Struts 2.3.20.2, Struts 2.3.24.2 或者 Struts 2.3.28.1,以便彻底解决此问题。

时间: 2024-11-03 21:55:49

java struts2 远程执行任意java代码bug漏洞修复的相关文章

Sun Java Web Server 能让攻击者远程执行任意命令&nbsp;

涉及程序: Solaris and Windows NT 描述: Sun Java Web Server 能让攻击者远程执行任意命令 详细: Sun 的 Java Web 服务器存在多个安全问题,允许攻击者远程以 web 服务器权限执行命令. 它的 Web 管理模块监听 9090 端口,通过 http 处理管理命令."com.sun.server.http.pagecompile.jsp92.JspServlet" servlet用来编译并执行JSP文件的,通过增加"/ser

java中动态执行一段代码

动态|执行 动态的执行一段简单代码,采用生成java文件,调用javac编译,反射执行的方式. 只是一个简单测试,有些地方有待完善. 代码如下 -------------------------------------------------------------------------------- import java.io.*; /** * 动态执行一段代码(生成文件->编译->执行) * @author kingfish * @version 1.0 */public class

宝马,福特等多款品牌车辆TCUs存漏洞,可导致远程执行任意代码

本文讲的是宝马,福特等多款品牌车辆TCUs存漏洞,可导致远程执行任意代码,近日,三名安全研究人员发现了宝马,福特,英菲尼迪和日产等品牌车辆中使用的远程信息处理控制单元(TCUs)的安全漏洞. 这三名安全研究人员发现的是由大陆集团制造的远程信息处理控制单元(TCU)的安全漏洞.大陆集团总部位于德国汉诺威,世界第四大轮胎制造商,前身是创立于1871年的橡胶制造商,Continental-Caoutchouc und Gutta-Percha Compagnie. 这三名研究人员分别是来自McAfee

Allaire JRUN 2.3远程执行任意命令漏洞

JRun 涉及程序: JRUN 描述: Allaire JRUN 2.3远程执行任意命令漏洞 详细: Allaire 的 JRUN 服务器 2.3上存在一个安全漏洞,允许远程用户把在 WEB 服务器上的任意文件作为JSP代码编译/执行. 如果URL请求的目标文件使用了前缀"/servlet/",则JSP解释执行功能被激活.这时在用户请求的目标文件路径中使用"../",就有可能访问到 WEB 服务器上根目录以外的文件.在目标主机上利用该漏洞请求用户输入产生的一个文件,

在javascript中执行任意html代码的方法

关于javascript的eval()函数无法执行html代码的问题,下面为大家介绍下一种在javascript中执行任意html代码的方法,感兴趣的朋友不要错过 今天码代码中偶然发现有一种情况javascript的eval()函数无法执行html代码,比如:  代码如下: <script>eval('<li>hehe</li>')</script>    代码是不会执行的,但是改为如下就可以执行了:   代码如下: <script>eval('

深入理解JAVA虚拟机--Idea远程执行本地Java代码

工程配置 上传文件配置 运行结果 源代码 联系作者 今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的程序,不会对原有程序运行带来任何影响.程序的原理可以去看书,本文主要结合IDEA把使用过程记录一下 工程配置 新建一个工程,把书中的5个类倒入,然后写一个测试类(test),这个类的代码就是要让远程服务器自动执行的.test.jsp是用来触发远程服

Struts2 又现高危漏洞,黑客分分钟可远程执行任意系统命令【紧急预警】

    由于该漏洞影响范围较广(Struts 2.3.5 - Struts 2.3.31, Struts 2.5 - Struts 2.5.10),漏洞危害程度严重,可造成直接获取应用系统所在服务器的控制权限. 这是什么意思? 黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令,将会对受影响站点造成严重影响,引发数据泄露.网页篡改.植入后门.成为肉鸡等安全事件. 为什么说本次漏洞影响极大? 此前 s2-016 漏洞同样危害非常严重,多数站点已经打补丁,而本次漏洞在 s2-016 补丁后的

PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解

这个新的修复方法初衷是好的, 但是却带来一个严重的问题(5.3.10中已经修复), 这个问题最初是由Stefan Esser发现的. 请看之前(5.3.9)最终的修复方案(php_register_variable_ex):  代码如下 复制代码 while (1) {      if (zend_symtable_find(symtable1, escaped_index, index_len + 1, (void **) &gpc_element_p) == FAILURE         

在javascript中执行任意html代码的方法示例解读_javascript技巧

今天码代码中偶然发现有一种情况javascript的eval()函数无法执行html代码,比如: 复制代码 代码如下: <script>eval('<li>hehe</li>')</script> 代码是不会执行的,但是改为如下就可以执行了: 复制代码 代码如下: <script>eval('</script><li>hehe</li><script>')</script>