问题现象:
Apache Struts s2-005 远程代码执行漏洞(CVE-2010-1870)
受影响版本:
Struts 2.0.0 - Struts 2.1.8.1
漏洞描述:
在Struts2中访问OGNL的上下文对象必须要使用#符号,S2-003的修复方案中对#号进行过滤,但是没有考虑到unicode编码情况,导致\u0023或者8进制\43绕过。
http://struts.apache.org/docs/s2-005.html
Apache Struts s2-008 远程代码执行漏洞(CVE-2012-0392)
受影响版本:
Struts 2.1.0 - Struts 2.3.1
漏洞描述:
Struts2框架存在一个DevMode模式,方便开发人员调试程序。如果启用该模式,攻击者可以构造特定代码导致OGNL表达式执行,以此对主机进行入侵。
http://struts.apache.org/docs/s2-008.html
Apache Struts s2-016 远程代码执行漏洞(CVE-2013-2251)
受影响版本:
Struts 2.0.0 - Struts 2.3.15
漏洞描述:
在Struts2中,DefaultActionMapper类支持以"action:"、"redirect:"、"redirectAction:"作为导航或是重定向前缀,但是这些前缀后面同时可以跟OGNL表达式。由于Struts2没有对这些前缀做过滤,导致利用OGNL表达式调用java静态方法执行任意系统命令。
http://struts.apache.org/docs/s2-016.html
Apache Struts s2-019 远程代码执行漏洞(CVE-2013-4316)
受影响版本:
Struts 2.0.0 - Struts 2.3.15.1
漏洞描述:
Struts2的“动态调用机制(Dynamic Method Invocation)”存在数量不少的漏洞,一直以来都被各类攻击手法所利用。但“动态调用机制”在2.3.15.1版本以前都是默认打开状态,用户应该把它禁用掉。
http://struts.apache.org/docs/s2-019.html
Apache Struts s2-020 远程代码执行漏洞(CVE-2014-0094)
受影响版本:
Struts 2.0.0 - Struts 2.3.16
漏洞描述:
Apache Struts 2.0.0-2.3.16版本的默认上传机制是基于Commons FileUpload 1.3版本,其附加的ParametersInterceptor允许访问‘class‘ 参数(该参数直接映射到getClass()方法),并允许控制ClassLoader。在具体的Web容器部署环境下(如:Tomcat),攻击者利用 Web容器下的Java Class对象及其属性参数(如:日志存储参数),可向服务器发起远程代码执行攻击,进而植入网站后门控制网站服务器主机。
http://struts.apache.org/docs/s2-020.html
问题分析过程:
1)升级至最新版本2.3.20;
Struts.xml :
Struts 2.3.20 配置文件新增加了参数为struts.excludedClasses,此参数为了严格验证排除一些不安全的对象类型。
value="
java.lang.Object,
java.lang.Runtime,
java.lang.System,
java.lang.Class,
java.lang.ClassLoader,
java.lang.Shutdown,
ognl.OgnlContext,
ognl.MemberAccess,
ognl.ClassResolver,
ognl.TypeConverter,
com.opensymphony.xwork2.ActionContext" />
升级注意事项:
替换jar包:
l xwork-core-2.3.20.jar
l struts2-json-plugin-2.3.20.jar
l struts2-core-2.3.20.jar
l commons-lang3-3.2.jar
l freemarker-2.3.19.jar
l asm-x.x.jar
l asm-commons-x.x.jar
l asm-tree-x.x.jar
l commons-io-X.X.X.jar
l commons-lang3-X.X.X.jar
l commons-fileupload-X.X.X.jar
l freemarker-X.X.X.jar
l javassist-X.X.X.jar
l ognl-X.X.X.jar
l struts2-core-X.X.X.X.jar
l xwork-core-X.X.X.jar
l struts2-spring-plugin-2.3.20.jar
项目struts.xml文件添加
第一句 修改为:
2) S2-016和S2-017修复步骤:
重写struts2 DefaultActionMapper的handleSpecialParameters方法,增加action、redirect、redirectAction等参数的过滤。此方法可修补S2-016、S2-017漏洞。
操作步骤:
2.1 新建com/website/struts2/MyDefaultActionMapper.java,代码如下:
2.2 复制MyDefaultActionMapper.class 到 /com/website/struts2/目录。
2.3 用struts.xml添加如下代码:
2.4 重启服务器。
public class MyDefaultActionMapper extends DefaultActionMapper { public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) { Set uniqueParameters = new HashSet(); Map parameterMap = request.getParameterMap(); for (Iterator iterator = parameterMap.keySet().iterator(); iterator.hasNext();) { String key = (String) iterator.next(); if ((key.endsWith(".x")) || (key.endsWith(".y"))) { key = key.substring(0, key.length() - 2); } // -- jason.zhou 20130708 add start -- // if ((key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:"))) { return; } // -- jason.zhou 20130708 add end -- // if (!uniqueParameters.contains(key)) { ParameterAction parameterAction = (ParameterAction) this.prefixTrie.get(key); if (parameterAction != null) { parameterAction.execute(key, mapping); uniqueParameters.add(key); break; } } } } }
struts.xml
<!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --> <bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class="com.website.struts2.MyDefaultActionMapper" /> <constant name="struts.mapper.class" value="myDefaultActionMapper" />