Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补[转自Neeao's Blog]
2010-08-04 17:44
1661 查看
Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补[转自Neeao's Blog]
2010-08-03 16:52
Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补[转自Neeao's Blog:http://neeao.com/archives/59/#viewSource]
Neeao 发表于 2010-07-16, 16:31. 发表在: 信息安全
1.exploit-db网站在7月14日爆出了一个Struts2的远程执行任意代码的漏洞,此漏洞危害之大,可谓百发百中,直接root,只要采用了Struts2和webwork框架的系统(对于webwork的版本,不太清楚,我这里没环境对其一一测试,这里有两者关系的介绍),基本上无一幸免。
2.昨天在接到朋友的提醒后,迅速将公司的一些使用此框架开发的项目漏洞修补了,我想大部分大公司的也在第一时间修补的差不多了,但是仍有很多公司,没有安全团队的,估计被黑了还被蒙在鼓里,感觉有必要在这里提醒下使用struts开发的朋友们,因为毕竟自己当初也做过java的开发。
3.漏洞成因在漏洞的poc中已经说的很详细了,但是都是英文的,而且对于Java不了解的人,可能会看得一头雾水,这里简单分析下,其实也是将原文粗略的翻译下了,对于其中名词不熟悉的请Google之:
Struts2的核心是使用的webwork框架,而webwork又是使用的XWork来处理action的,并且通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:
user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL将它转换为:
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。
除了支持参数的设置和读取,ONGL支持另外的一些功能:
调用方法:foo()
调用静态方法:@java.lang.System@exit(1)
类的调用:new MyClass()
处理上下文变量:#foo = new MyClass()
由于ONGL的调用可以通过http传参来执行,为了防止攻击者以此来调用任意方法,Xwork设置了两个参数来进行防护:
OgnlContext的属性 'xwork.MethodAccessor.denyMethodExecution'(默认为真)
SecurityMemberAccess私有字段 'allowStaticMethodAccess'(默认为假)
为方便开发人员经常访问各种对象,XWork定义了很多预定义的上下文变量:
#application
#session
#request
#parameters
#attr
这些变量代表各种服务器变量。为了防止攻击者篡改服务器端对象,XWork的ParametersInterceptor是不允许参数名称中有#的,大约在一年前,漏洞发现者找到了一种方法来绕过这种保护(XW-641),即通过java的unicode字符串来表示:/u0023。当时感觉通过一种方法(OGNL value stack clearing)来修补是不够的,但是没有更多的时间来研究。
今年早些时候,漏洞发现者又发现了一些Xwork的一些预定义的变量:
#context - 这个方法的能否被调用是基于OgnlContext的 'xwork.MethodAccessor.denyMethodExecution' 属性的值
#_memberAccess - SecurityMemberAccess的'allowStaticAccess' 字段用来防止静态方法的执行
#root
#this
#_typeResolver
#_classResolver
#_traceEvaluations
#_lastEvaluation
#_keepLastEvaluation
使用XW-641所描述的方法,漏洞发现者通过修改一些值能够调用被保护的Java代码,并且执行任意的Java代码:1 #_memberAccess['allowStaticMethodAccess'] = true
2 #foo = new java .lang.Boolean("false")
3 #context['xwork.MethodAccessor.denyMethodExecution'] = #foo
4 #rt = @java.lang.Runtime@getRuntime()
5 #rt.exec('mkdir /tmp/PWNED')
事实证明通过构造http请求能够调用该OGNL的表达式。这个漏洞的PoC于2010年7月12日发布。如果想测试你的应用程序是否有漏洞,可以使用下面的测试代码,将会调用:java.lang.Runtime.getRuntime().exit(1)
')(meh)=true&(aaa)(('/u0023context[/'xwork.MethodAccessor.den]http://mydomain/MyStruts.action?('/u0023_memberAccess[/'allowStaticMethodAccess/']')(meh)=true&(aaa)(('/u0023context[/'xwork.MethodAccessor.den
yMethodExecution/']/u003d/u0023foo')(/u0023foo/u003dnew%20java.lang.Boolean("false")))&(asdf)(('/u0023rt.exit(1)')(/u0023rt/u003d@java.lang.Runtime@getRunti
me()))=1
4.如何修补此漏洞:
目前官方已出了补丁:http://svn.apache.org/viewvc?view=revision&revision=956389
5.快写完了,发现绿盟也将这个漏洞中文说明也发出来了,不过标题是:XWork ParameterInterceptor类绕过安全限制漏洞
严格点说,这个应该是XWork的漏洞,谁让Struts2用的是人家的核心呢?:)。
2010-08-03 16:52
Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补[转自Neeao's Blog:http://neeao.com/archives/59/#viewSource]
Neeao 发表于 2010-07-16, 16:31. 发表在: 信息安全
1.exploit-db网站在7月14日爆出了一个Struts2的远程执行任意代码的漏洞,此漏洞危害之大,可谓百发百中,直接root,只要采用了Struts2和webwork框架的系统(对于webwork的版本,不太清楚,我这里没环境对其一一测试,这里有两者关系的介绍),基本上无一幸免。
2.昨天在接到朋友的提醒后,迅速将公司的一些使用此框架开发的项目漏洞修补了,我想大部分大公司的也在第一时间修补的差不多了,但是仍有很多公司,没有安全团队的,估计被黑了还被蒙在鼓里,感觉有必要在这里提醒下使用struts开发的朋友们,因为毕竟自己当初也做过java的开发。
3.漏洞成因在漏洞的poc中已经说的很详细了,但是都是英文的,而且对于Java不了解的人,可能会看得一头雾水,这里简单分析下,其实也是将原文粗略的翻译下了,对于其中名词不熟悉的请Google之:
Struts2的核心是使用的webwork框架,而webwork又是使用的XWork来处理action的,并且通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:
user.address.city=Bishkek&user['favoriteDrink']=kumys
ONGL将它转换为:
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。
除了支持参数的设置和读取,ONGL支持另外的一些功能:
调用方法:foo()
调用静态方法:@java.lang.System@exit(1)
类的调用:new MyClass()
处理上下文变量:#foo = new MyClass()
由于ONGL的调用可以通过http传参来执行,为了防止攻击者以此来调用任意方法,Xwork设置了两个参数来进行防护:
OgnlContext的属性 'xwork.MethodAccessor.denyMethodExecution'(默认为真)
SecurityMemberAccess私有字段 'allowStaticMethodAccess'(默认为假)
为方便开发人员经常访问各种对象,XWork定义了很多预定义的上下文变量:
#application
#session
#request
#parameters
#attr
这些变量代表各种服务器变量。为了防止攻击者篡改服务器端对象,XWork的ParametersInterceptor是不允许参数名称中有#的,大约在一年前,漏洞发现者找到了一种方法来绕过这种保护(XW-641),即通过java的unicode字符串来表示:/u0023。当时感觉通过一种方法(OGNL value stack clearing)来修补是不够的,但是没有更多的时间来研究。
今年早些时候,漏洞发现者又发现了一些Xwork的一些预定义的变量:
#context - 这个方法的能否被调用是基于OgnlContext的 'xwork.MethodAccessor.denyMethodExecution' 属性的值
#_memberAccess - SecurityMemberAccess的'allowStaticAccess' 字段用来防止静态方法的执行
#root
#this
#_typeResolver
#_classResolver
#_traceEvaluations
#_lastEvaluation
#_keepLastEvaluation
使用XW-641所描述的方法,漏洞发现者通过修改一些值能够调用被保护的Java代码,并且执行任意的Java代码:1 #_memberAccess['allowStaticMethodAccess'] = true
2 #foo = new java .lang.Boolean("false")
3 #context['xwork.MethodAccessor.denyMethodExecution'] = #foo
4 #rt = @java.lang.Runtime@getRuntime()
5 #rt.exec('mkdir /tmp/PWNED')
事实证明通过构造http请求能够调用该OGNL的表达式。这个漏洞的PoC于2010年7月12日发布。如果想测试你的应用程序是否有漏洞,可以使用下面的测试代码,将会调用:java.lang.Runtime.getRuntime().exit(1)
')(meh)=true&(aaa)(('/u0023context[/'xwork.MethodAccessor.den]http://mydomain/MyStruts.action?('/u0023_memberAccess[/'allowStaticMethodAccess/']')(meh)=true&(aaa)(('/u0023context[/'xwork.MethodAccessor.den
yMethodExecution/']/u003d/u0023foo')(/u0023foo/u003dnew%20java.lang.Boolean("false")))&(asdf)(('/u0023rt.exit(1)')(/u0023rt/u003d@java.lang.Runtime@getRunti
me()))=1
4.如何修补此漏洞:
目前官方已出了补丁:http://svn.apache.org/viewvc?view=revision&revision=956389
5.快写完了,发现绿盟也将这个漏洞中文说明也发出来了,不过标题是:XWork ParameterInterceptor类绕过安全限制漏洞
严格点说,这个应该是XWork的漏洞,谁让Struts2用的是人家的核心呢?:)。
相关文章推荐
- Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补
- Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补
- Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补
- ElasticSearch远程任意代码执行漏洞(CVE-2014-3120)分析
- Struts S2-016 远程任意命令执行漏洞检测代码
- OrientDB远程代码执行漏洞利用与分析
- Apache Tomcat CVE-2017-12615远程代码执行漏洞分析
- Bash 远程任意代码执行安全漏洞(最严重漏洞)
- 某远程代码执行漏洞影响超过70个不同的CCTV-DVR供应商的漏洞分析
- 格式化字符串漏洞执行任意代码分析
- Bash 远程任意代码执行安全漏洞(最严重漏洞)
- PHP168 V6.02 整站系统远程执行任意代码漏洞利用
- PHP-CGI远程任意代码执行漏洞(CVE-2012-1823)修复方案
- phpcms前台任意代码执行漏洞(php<5.3)
- 【技术分享】TP-Link WR841N路由器任意代码执行漏洞分析(附演示视频)
- Struts 2最新0day破坏性漏洞(远程任意代码执行)等的重现方法
- Struts2 S2 – 032远程代码执行漏洞分析报告
- php cgi远程任意代码执行漏洞
- Fckeditor <= 2.4.2 的任意文件上传漏洞代码解析
- Struts 2最新0day破坏性漏洞(远程任意代码执行)等的重现方法