分类目录归档:信息安全

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代码:

#_memberAccess['allowStaticMethodAccess'] = true
#foo = new java .lang.Boolean("false")
#context['xwork.MethodAccessor.denyMethodExecution'] = #foo
#rt = @java.lang.Runtime@getRuntime()
#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用的是人家的核心呢?:)。

7safe的web安全开发安全编码培训课程的目录

from:7safe

1. Introduction to Web application
* Authentication
* Authorization
* cookies
* HTTP protocol
* overview of Google hacking.

2. Attacking Authentication
* Types of authentication
* clear text http protocol
* Username Enumeration
* Security through Obscurity

3. Web server Issues
* IIS/Apache exploits and introduction to hacking tools such as metasploit
* Insecure HTTP methods

4. Cross Site Scripting
* Types of XSS
* Secure cookie, HTTP-only
* Complicated XSS

5. Cross Site Request Forgery
* Demo
* Complicated XSRF with POST requests
* XSRF in web services

6. Session Fixation

7. CRLF injection
* Proxy Poisoning, XSS with CRLF injection.

8. Clickjacking

9. SQL Injections(basic to advanced)
* Introduction to SQL Injections
* Authentication bypass
* Extracting Data
* O.S code execution
* Overview of advanced sql injections.

10. Malicious File Uploads

11. Vulnerable flash Applications

12. parameter manipulation attacks

13. business logic bypass.
* Authentication bypass
* Other logical flaws

14. SSL misconfigurations
* SSL and Man in the middle attacks
* screenshots

15. Security problems with thick client applications.

LVS环境下的ARP欺骗简单分析

今天遇到一个问题,同事问怎么来防止LVS环境下的ARP欺骗,对于LVS不是太熟悉,于是到whitehat群中请教,然后自己又看了下关于LVS的资料,做了个简单的分析,记录下。

首先了解下LVS,LVS是Linux服务器集群系统(Linux Virtual Server)的简称,其官方网址为: http://www.linuxvirtualserver.org/zh/lvs3.html,其中LVS主要采用了三种IP负载均衡技术,即:

VS/NAT 通过NAT实现虚拟服务器(Virtual Server via Network Address Translation);
VS/TUN 通过IP隧道实现虚拟服务器(Virtual Server via IP Tunneling);
VS/DR 通过直接路由实现虚拟服务器(Virtual Server via Direct Routing

具体的介绍可以到官网查看,我们这里只分析下它们的架构:

1.VS/NAT

http://www.linuxvirtualserver.org/zh/lvs3/vs-nat.jpg

上图是官网给出的架构图,VS/NAT主要有一台调度服务器和下面的一个内网组成,中间通过交换机连接。

其数据流为:用户->调度服务器->Switch/Hub->到达real服务器->Switch/Hub–>调度服务器->用户。

a.调度服务器同一交换环境下的服务器来ARP欺骗调度服务器VIP。如果ARP欺骗的话,通过调度服务器同一交换机下的服务器来欺骗调度服务器这个IP,是可以完成的,它们在同一交换环境下的。

b.如果采用调度服务器IP来欺骗同一交换环境下的其他IP,因为入侵进去的话,实际登陆的可能是调度服务器后面的内网里的某一台服务器,如果这个session断开的话,可能就无法找到是哪一台服务器了,这是其一;当然了,由于是负载均衡吗,我们可以把内网所有的主机都控制了,然后再来实施ARP欺骗,很显然,由于此IP在内网,我们很难欺骗调度服务器VIP相同网段的其他IP。

预防:那么直接在交换机上设置VIP和mac的绑定理论上应该就可以防止对VIP的ARP欺骗了。

2.VS/TUN

http://www.linuxvirtualserver.org/zh/lvs3/vs-tun.jpg

通过上图,可以看出,VS/TUN的架构为一台调度服务器,下面是目标服务器。

数据流为:用户->调度服务器->目标服务器->直接返回给用户.

ARP欺骗攻击

a.通过了解TUN方式的VS可以知道调度服务器实际上和后台的目标服务器是同处一个交换环境下面的,那么我们就可以使用VIP同一交换环境下的IP对调度服务器VIP进行攻击,由于VS的real服务器和调度服务器一个交换环境下,那么也可以对任一台进行ARP欺骗攻击,前提是得知道他们的真实IP地址,而不是VIP地址。

b.通过VS来ARP欺骗VIP同一交换环境下的其他IP,调度服务器给我们随机分配一台目标服务器,由于目标服务器和调度服务器是在一个交换环境下,那么就可以成功的对其实施ARP欺骗攻击,当然了,也要知道调度服务器分配的真实IP地址了。

预防:理论上可以通过在交换机上设置IP地址和MAC绑定的方法来防止ARP欺骗。

3.VS/DR

http://www.linuxvirtualserver.org/zh/lvs3/vs-dr.jpg

上图为DR方式的VS,调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过高速的交换机或者HUB相连。VIP地址为调度器和服务器组共享,调度 器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只 是用于处理目标地址为VIP的网络请求。

数据流:用户->调度服务器->目标服务器->用户。

ARP欺骗攻击:

a.通过VIP环境下的IP来欺骗VIP,由于在同一交换环境下,欺骗是可以成功的。

b.那么通过VIP来ARP欺骗同网段的其他IP呢,获得的权限可能是调度器分配的目标服务器任意一台,由于他们都处于同一交换环境,但是,目标服务器只响应调度服务器的ARP请求,其本身无法发送ARP广播,在这里的话,就无法通过目标服务器来达到ARP欺骗其他服务器的目的了,实际上类似于给目标服务器设置了一个接受ARP的白名单,将自己保护起来了。

预防:理论上只需要绑定VIP对应的调度器MAC就可以预防ARP欺骗。

     以上仅仅是凭自己对LVS的理解来分析的,真实的LVS环境没有接触过,也不知道是否真如上面所说,欢迎各位看官批评指正。

By:Neeao 2010-01-28 16:55