参数绑定
简单来说,前端提交参数ket=value,交给服务端,服务端的controller可以进行解析,具体可以百度一下。 代码来源 github直接搜就行
复现
分析
才开始不是很了解,知道了是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
我们关注数据处理,所以主要看beans相关的,底层的参数传递实现先不用管。在setPropertyValues()方法中,获取了我们传入的数据然后保存在PropertyValue中
继续向下一直到getPropertyAccessorForPropertyPath,对参数进行了分割。
其中调用了getFirstNestedPropertySeparatorIndex,利用]和.对参数进行了分割。退回去,nestedProperty保存了头部,nestedPath保存了分割以后的内容
退回以后,调用getNestedPropertyAccessor(),继续向下
到我们的断点这里,仔细来看,进入getCachedIntrospectionResults,这里判断如果没有缓存就会新建一个缓存(进入方法调用forClass新建一个实例),如果有的话就会获取缓存的信息。
通过查阅资料,我发现了这么一句话,也就是说,在获取缓存的时候,由于存在getClass(),获取也能获取到class的缓存!由于自省机制,相当于我们拥有类似setClass()的能力。
这一步分析出来了 后续基本就是可以一把梭了。后续的操作也是大同小异。最重要的是因为java.lang.Object.getClass(),而Object是一切类的子类,所以导致能获取到class。
再到底层就是利用反射去实现了。就不继续深究了。
原文始发于微信公众号(e0m安全屋):spring CORE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论