前言
对于常见的Vaadin反序列化的流程大致可归纳为以下几个步骤
-
寻找到一个反序列化入口,调用
PropertysetItem#toString
方法 -
在上述方法中,能够调用任意类的
getValue
方法,上文中也是找到了NestedMethodProperty#getValue
方法,在该方法中将调用属性的getter方法 -
对于getter方法的选取,上文中使用了
TemplateImpl
链
OK,能够调用任意类的getValue
方法,在Vaadin相关依赖中是否存在其他恶意的getValue方法呢?本文据此展开。
寻找有害getValue
满足条件的相关类并不是很多,其中NestedMethodProperty
类可以排除掉,上文中选用的就是该类
AbstractSelect
首先是AbstractField
类,其getValue
方法仅仅是实现了取值的功能,并不存在利用的可能
然后是AbstractSelect
类,重点分析一下该方法的流程:
-
首先是调用父类的
getValue
方法,获取retValue
值,也即是AbstractField#getValue
,最终调用的是AbstractField#getFieldValue
根据不同的情况返回不同的属性值,其均可控 -
进入一个if判断语句,若属性值
multiSelect
为true则步入,该属性值可控
接下来若super.getValue
方法返回的值不是Set
或者Collection
则进入最后一个else语句,这里因为items
可控,能够调用任意的containsId
方法
SQLContainer#containsId
前面提到能够调用任意类的containsId
方法,因items
属性为Container
类,所以其仍存在限制
这里存在一个SQLContainer#containsId
的实现
前面部分都没有什么奇怪的操作,也比较简单明了,这里我们关注最后一个if语句,若传参itemId
,也即是前面通过super.getValue
得到的返回值,该返回值属于RowId
实例,并且不是TemporaryRowId
的实例:这里将会调用queryDelegate.containsRowWithKey(((RowId) itemId).getId())
,这里的属性名queryDelegate
直译为查询委派,可能会有数据库执行的功能实现
该方法有两个实现类:
TableQuery
这里使用了generateSelectQuery
动态生成查询语句
重点在于:如果activeConnection
属性值若为null,则步入if (!isInTransaction())
if语句,并调用beginTransaction
进行处理
最终是调用到父类AbstractTransactionalQuery
的beginTransaction
方法
这里调用了connectionPool.reserveConnection
方法进行连接的reserve操作,也即是JDBCConnectionPool
接口的实现类
JDBCConnectionPool
J2EEConnectionPool
在J2EEConnectionPool#reserveConnection
的调用过程中,若dataSource
为空,则会调用lookupDataSource
进行lookup操作,这里的dataSourceJndiName
变量我们是可控的,这里会造成JNDI注入攻击
SimpleJDBCConnectionPool
而在
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)