`
penchy
  • 浏览: 59040 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Struts2/XWork < 2.2.0远程执行任意代码漏洞分析及修补

阅读更多

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远程代码执行漏洞初探1

    Struts2 S2-029 远程代码执行漏洞初探 Struts2 是一个基于 Java 的 Web 框架,使用 OGNL 表达式来访问 ActionContext 中的对象数据。在 Struts2 中,标签库使用 OGNL 表达式来获取对象数据,例如 `&lt;s:property ...

    Struts 2 远程代码执行漏洞(s2-045\s2-046)修复所用到的包

    升级到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 --来源 ...

    struts框架搭建

    ### Struts2框架搭建及配置详解 #### 一、Struts2框架简介 Struts2是Struts的一个改进版本,它结合了WebWork框架和Struts框架的优点,并且增加了许多新特性,使得开发者能够更加方便地开发Java Web应用程序。...

    struts2下的Xwork2源文件

    struts2下的Xwork2源文件 在 opensymphony开源社区http://www.opensymphony.com/ 可匿名使用SVN checkout xwork2的源代码 http://svn.opensymphony.com/svn/xwork/trunk

    XWork绕过安全限制执行任意命令漏洞补丁

    XWork处理用户请求参数数据时存在漏洞,远程攻击者可以利用此漏洞在系统上执行任意命令。 Struts2中WebWork框架使用XWork基于HTTP参数名执行操作和调用,将每个HTTP参数名处理为OGNL(对象图形导航语言)语句,而...

    struts2之xwork

    而XWork是Struts2的核心组件,它负责处理Action的业务逻辑和控制流程。在深入理解Struts2与XWork的关系之前,我们首先需要了解MVC模式的基本概念。 MVC模式是一种软件设计模式,它将应用程序分为三个主要部分:模型...

    Struts2中使用标签实现组合查询和带分页的例子

    在Struts2框架中,`&lt;sx:&gt;`标签是Struts2 XWork库的一部分,用于增强JSP页面的功能,提供更强大的数据绑定和表单处理能力。本篇将重点讲解如何利用`sx:`标签实现组合查询和带分页功能。 首先,让我们了解下Struts2的...

    struts2_xwork2下载

    根据提供的文件信息,我们可以深入探讨Struts2与XWork2的相关知识点,特别是关于它们的下载、功能特性以及在实际项目中的应用。 ### Struts2框架简介 Apache Struts2是基于MVC(Model-View-Controller)设计模式的...

    Struts2和Webwork远程命令执行漏洞分析1

    Struts2和Webwork远程命令执行漏洞主要源于Apache Struts2框架中的一个设计缺陷,该框架使用OGNL(Object-Graph Navigation Language)表达式来处理用户输入,这为恶意攻击者提供了可乘之机。该漏洞发生在Struts2的...

    论坛系统(Struts 2+Hibernate+Spring实现)

    论坛系统(Struts 2+Hibernate+Spring实现)&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE validators SYSTEM ...

    Struts2中xwork源码

    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半中文帮助文档 Struts2.2.3 + xwork半中文帮助文档

    Struts2配置详解

    &lt;struts&gt; &lt;bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork"/&gt; &lt;bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory"/&gt; ...

    struts2-xwork-ognl的源文件(jar包)

    同时,源代码分析也能帮助开发者避免潜在的问题,如安全漏洞,例如著名的Struts2 S2-045远程代码执行漏洞,就是由于OGNL表达式不当处理导致的。因此,理解和掌握这些源代码不仅能提高开发效率,也有助于增强应用的...

    基于struts2的hello world输出

    这个Action类会包含一个返回"success"的结果,这是Struts2默认的执行成功后的结果代码。 ```java public class HelloWorldAction extends ExecuteOperations implements ActionSupport { public String execute() ...

    Struts2中的xwork源代码

    深入理解XWork的源代码对于提升Struts2的开发技能至关重要。 首先,让我们来看看`xwork-2.1.1-sources`这个文件,它是XWork库的源代码,包含了所有相关的类和接口,供开发者研究和学习。通过阅读源代码,我们可以...

    简单的struts2小程序

    Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性、可扩展性良好的应用程序的工具和机制。在这个"简单的Struts2小程序"中,我们可以深入理解Struts2...

    Struts2.2.3 Xwork帮助文档

    **帮助文档**:"xwork2.2.3.chm"和"Strut2.2.3.chm"这两个CHM文件包含了详细的Struts2和Xwork的API参考、配置指南、示例代码和最佳实践。开发者可以通过查阅这些文档,了解如何配置Struts2的XML文件,如何创建和配置...

    struts-xwork-core源码

    Struts-xwork-core是Struts2框架的核心组件,它提供了Action和结果的执行模型,以及类型转换、数据验证和国际化等功能。在这个压缩包中,包含了该核心库的源代码,对于学习和理解Struts2的工作原理及其内部机制极具...

Global site tag (gtag.js) - Google Analytics