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用的是人家的核心呢?:)。
相关推荐
Struts2 S2-029 远程代码执行漏洞初探 Struts2 是一个基于 Java 的 Web 框架,使用 OGNL 表达式来访问 ActionContext 中的对象数据。在 Struts2 中,标签库使用 OGNL 表达式来获取对象数据,例如 `<s:property ...
升级到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框架搭建及配置详解 #### 一、Struts2框架简介 Struts2是Struts的一个改进版本,它结合了WebWork框架和Struts框架的优点,并且增加了许多新特性,使得开发者能够更加方便地开发Java Web应用程序。...
struts2下的Xwork2源文件 在 opensymphony开源社区http://www.opensymphony.com/ 可匿名使用SVN checkout xwork2的源代码 http://svn.opensymphony.com/svn/xwork/trunk
XWork处理用户请求参数数据时存在漏洞,远程攻击者可以利用此漏洞在系统上执行任意命令。 Struts2中WebWork框架使用XWork基于HTTP参数名执行操作和调用,将每个HTTP参数名处理为OGNL(对象图形导航语言)语句,而...
而XWork是Struts2的核心组件,它负责处理Action的业务逻辑和控制流程。在深入理解Struts2与XWork的关系之前,我们首先需要了解MVC模式的基本概念。 MVC模式是一种软件设计模式,它将应用程序分为三个主要部分:模型...
在Struts2框架中,`<sx:>`标签是Struts2 XWork库的一部分,用于增强JSP页面的功能,提供更强大的数据绑定和表单处理能力。本篇将重点讲解如何利用`sx:`标签实现组合查询和带分页功能。 首先,让我们了解下Struts2的...
根据提供的文件信息,我们可以深入探讨Struts2与XWork2的相关知识点,特别是关于它们的下载、功能特性以及在实际项目中的应用。 ### Struts2框架简介 Apache Struts2是基于MVC(Model-View-Controller)设计模式的...
Struts2和Webwork远程命令执行漏洞主要源于Apache Struts2框架中的一个设计缺陷,该框架使用OGNL(Object-Graph Navigation Language)表达式来处理用户输入,这为恶意攻击者提供了可乘之机。该漏洞发生在Struts2的...
论坛系统(Struts 2+Hibernate+Spring实现)<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators SYSTEM ...
XWork是Struts2的核心组件,负责处理请求、动作调度、数据绑定以及异常处理等核心功能。本文将深入探讨XWork的源码,解析其设计理念和关键实现,帮助开发者更好地理解和使用Struts2。 1. **ActionInvocation**:...
Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档
<struts> <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork"/> <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory"/> ...
同时,源代码分析也能帮助开发者避免潜在的问题,如安全漏洞,例如著名的Struts2 S2-045远程代码执行漏洞,就是由于OGNL表达式不当处理导致的。因此,理解和掌握这些源代码不仅能提高开发效率,也有助于增强应用的...
这个Action类会包含一个返回"success"的结果,这是Struts2默认的执行成功后的结果代码。 ```java public class HelloWorldAction extends ExecuteOperations implements ActionSupport { public String execute() ...
深入理解XWork的源代码对于提升Struts2的开发技能至关重要。 首先,让我们来看看`xwork-2.1.1-sources`这个文件,它是XWork库的源代码,包含了所有相关的类和接口,供开发者研究和学习。通过阅读源代码,我们可以...
Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性、可扩展性良好的应用程序的工具和机制。在这个"简单的Struts2小程序"中,我们可以深入理解Struts2...
**帮助文档**:"xwork2.2.3.chm"和"Strut2.2.3.chm"这两个CHM文件包含了详细的Struts2和Xwork的API参考、配置指南、示例代码和最佳实践。开发者可以通过查阅这些文档,了解如何配置Struts2的XML文件,如何创建和配置...
Struts-xwork-core是Struts2框架的核心组件,它提供了Action和结果的执行模型,以及类型转换、数据验证和国际化等功能。在这个压缩包中,包含了该核心库的源代码,对于学习和理解Struts2的工作原理及其内部机制极具...