特定版本Vaadin组件反序列化漏洞
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
影响版本
仅限于7.7.14
版本
<dependencies>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-server</artifactId>
<version>7.7.14</version>
</dependency>
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-shared</artifactId>
<version>7.7.14</version>
</dependency>
</dependencies>
流程分析
sink点
这里选择逆向进行分析,通常使用静态扫描工具被标注的也就是sink点的位置,判断可控点和我们的sink点是否形成一条完整的通路,若存在有完整的通路,则表明存在漏洞
在vaadin
相关依赖已知的sink点在NestedMethodProperty#getValue
方法中,其中存在有m.invoke(object)
反射调用函数
其中该反射调用中的object
来自属性instance
全局搜索该属性的写入位置,其在NestedMethodProperty
类的构造函数和setInstance
均能对其进行写入,说明其可控
而在反射调用方法时,是遍历getMethods
的每一个方法进行调用,通过查找该属性的写入,发现其在initialize
方法中存在写入
initialize方法
如果你还记得的话,在NestedMethodProperty
的构造方法对instance
进行赋值后,同样会调用initialize
方法进行初始化
下面简单分析一下该方法的流程
initialize
方法接受两个参数,分别为beanClass
和propertyName
这里传入的属性名参数允许有多个属性,不同的属性名之间通过.
进行连接,在initialize方法对其进行处理时,首先处理propertyName
,将其通过.
分割成一个字符串数组simplePropertyNames
,代表一个一个的“属性名”紧接着,将会遍历这个字符串数组
simplePropertyNames
,并将获取的beanClass和propertyName复制到lastSimplePropertyName
和lastClass
中之后使用上面提取的两个参数,通过调用
MethodProperty.initGetterMethod
方法获取对应属性的getter
方法
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录