Struts2漏洞笔记之S2-005

漏洞原理

引用_memberAccess修改当前沙箱对静态方法调用限制

漏洞版本

Struts 2.0.0 - Struts 2.1.8.1

漏洞原理

xwork 2.0.4 与 xwork 2.0.6补丁对比

官方针对S2-003漏洞修补主要操刀xwork上,对比struts 2.0.11.2 与 struts2 2.0.12版本中的xowrk包.

ParametersInterceptor中对当前值栈重新初始化valueStack,向当前newStack中新增一个securityMemberAccess对象而该对象中定义了字段allowStaticMethodAccessexcludePropertiesacceptProperties作为新的沙箱进一步限制静态方法执行

image-20201224200742400

image-20201224201344286

漏洞分析

在work 2.0.6版本中字段allowStaticMethodAccess默认设置为true并不是影响方法执行关键字段。跟进java.Runtime.getRuntime执行逻辑中.会经过isMethodAccessible方法判断,在该if语句中需要使得判断为false 才能够执行invokeMethod方法.即isMethodAccessible返回true

image-20201224210032647

继续跟进SecurityMemberAccess:;isAccessible方法,分析逻辑,这里需要使得isAcceptableProperty执行后返回true,跟进该方法后发现isAccepted方法返回true,只要使得isExcluded返回false即可。这里需要修改this.acceptProperties为空才满足条件,而该字段可以通过Ognl表达式引用外部对象修改.

image-20201224211508226

了解外部引用对象逻辑需要跟进ASTVarRef::geValueBody=>OgnlContext::get,通过#_memberAccess就能够获取SecurityMemberAccess对象,就能够进一步修改this.acceptProperties=false

image-20201224212508628

最后payload如下,当前版本可以不用设置allowStaticMethodAccess为true,为了保证poc稳定性可以加上.

(%27\u0023context[\%27xwork.MethodAccessor.denyMethodExecution\%27]\u003dfalse%27)(bla)(bla)&(%27\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET%27)(bla)(bla)&(%27\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\%27open\u0020/System/Applications/Calculator.app\%27)%27)(bla)(bla)

image-20201224212948785

漏洞修复

Struts2 2.2.1 版本中直接加强正则匹配,先知非法字符串.

image-20201224214424414


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!