spring CORE

admin 2022年4月1日23:32:39评论53 views字数 1218阅读4分3秒阅读模式

参数绑定

简单来说,前端提交参数ket=value,交给服务端,服务端的controller可以进行解析,具体可以百度一下。 代码来源 github直接搜就行

复现

spring CORE

分析

才开始不是很了解,知道了是CVE-2010-1622的绕过,就简单看了一下了解一下参数绑定,先来看看CVE-2010-1622。具体的信息就不给了,大概介绍一下,由于springmvc的内省机制,导致如果一个类存在get方法,当我们传入值的时候,在一定条件下会去从底层进行set。比如x.y=123 x是类,y是他的字段,当我们有y的get方法,就会对y的值进行设置。 

理解几个概念 

PropertyDescriptor:属性描述器,通过他可以获取某个单独的属性 CachedIntrospectionResults:专门用于缓存JavaBean的PropertyDescriptor描述信息的类 

结合这个链接一起理解https://zhuanlan.zhihu.com/p/107842857

基于上面的思路,我们来随便分析一条poc取值过程 断点下在 org.springframework.beans.BeanWrapperImpl#getLocalPropertyHandler

class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp

spring CORE

我们关注数据处理,所以主要看beans相关的,底层的参数传递实现先不用管。在setPropertyValues()方法中,获取了我们传入的数据然后保存在PropertyValue中

spring CORE

继续向下一直到getPropertyAccessorForPropertyPath,对参数进行了分割。

spring CORE

其中调用了getFirstNestedPropertySeparatorIndex,利用]和.对参数进行了分割。退回去,nestedProperty保存了头部,nestedPath保存了分割以后的内容

spring CORE

退回以后,调用getNestedPropertyAccessor(),继续向下

spring CORE

到我们的断点这里,仔细来看,进入getCachedIntrospectionResults,这里判断如果没有缓存就会新建一个缓存(进入方法调用forClass新建一个实例),如果有的话就会获取缓存的信息。

spring CORE

spring CORE

通过查阅资料,我发现了这么一句话,也就是说,在获取缓存的时候,由于存在getClass(),获取也能获取到class的缓存!由于自省机制,相当于我们拥有类似setClass()的能力。

spring CORE

spring CORE

这一步分析出来了 后续基本就是可以一把梭了。后续的操作也是大同小异。最重要的是因为java.lang.Object.getClass(),而Object是一切类的子类,所以导致能获取到class。

spring CORE

再到底层就是利用反射去实现了。就不继续深究了。

spring CORE



原文始发于微信公众号(e0m安全屋):spring CORE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月1日23:32:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   spring COREhttp://cn-sec.com/archives/862317.html

发表评论

匿名网友 填写信息