本文共 1676 字,大约阅读时间需要 5 分钟。
漏洞成因官方概述:XWork ParameterInterceptors bypass allows remote command execution
漏洞影响:
漏洞分析:
S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的。我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到Unicode编码情况,导致\u0023或者8进制\43绕过。
S2-005则是绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成漏洞。
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
将编码转换为以下三个步骤:
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true
&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))
&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1
第一步通过设置_memberAccess
变量中的allowStaticMethod
为true,通过括号遵循Ognl语法树规则。第一步完成后,就可以执行静态方法了。
第二步将上下文中的xwork.MethodAccessor.denyMethodExecution
设置为false,允许方法执行。
第三步是真正的攻击代码,通过调用Runtime
类的静态方法获取Runtime对象并执行关闭服务器的代码。
深入分析:
为什么提交这个攻击URL就能使服务器down掉?仅仅看这三句不要以为就懂了,要理解其中的奥妙,必须要阅读源码。
服务器接收到请求后会读取web.xml
文件,里面有个过滤器叫StrutsPrepareAndExecuteFilter
。然后这个过滤器执行完之后,就可以执行我们的Action了。
StrutsPrepareAndExecuteFilter
执行完之后,会执行Struts2
默认拦截器栈defaultStack
。拦截器栈的结构如下:
params
拦截器:处理URL中的参数,将参数作为键值对加入值栈。Ognl
拦截器:处理Ognl表达式。params
拦截器中的doIntecept()
方法会将请求中的参数作为键值对加入值栈。Ognl解析引擎会按照规定的语法规则解析字符串并执行Ognl表达式。
Ognl的解析:
为什么\u0023
形式的POC能够被解析?
OgnlUtil.setValue
方法会将\u0023
转换为#
,从而绕过了过滤。
Ognl
解析引擎会调用Ognl.parseExpression
方法解析字符串,返回语法树。parseExpression
方法会调用OgnlParser.topLevelExpression()
,开始解析语法树。
OgnlParser
会读取字符,处理Unicode转义,解析表达式。
漏洞检测与利用:
工具下载地址:请通过合法渠道获取。
参考链接:(此处不提供具体链接)
转载地址:http://krgc.baihongyu.com/