文章插图
可以发现会遍历 aExtractor 数组,并调用 extract() 方法 。
跟进 extract() 方法,此处由于 m_cacheTarget 使用了 transient 修饰,无法被反序列化,因此只能执行 else 部分,最后通过 this.extractComplex(oTarget) 进行最终触发漏洞点

文章插图
this.extractComplex(oTarget) 中可以看到最后通过 method.invoke() 进行反射执行,其中 oTarget 和 aoParam 都是可控的 。

文章插图
我们跟进190的 findMethod() 方法,在 475 行需要使 fExactMatch 为 true,fStatic 为 false 才可让传入 clz 的可以获取任意方法 。fStatic 是可控的,而 fExactMatch 默认为true,只要没进入 for 循环即可保持 true 不变,使 cParams 为空即 aclzParam 为空的 Class 数组即可,此处 aclzParam 从 getClassArray() 方法获取 。

文章插图
在 getClasssArray 中通过获取输入参数的值对应的 Class 进行处理 。

文章插图
由于传入的 aoParam 是一个空的 Object[],所以获取对应的 Class 也为空的 Class[],跟入 isPropertyExtractor() 中进行进行获取可以看到将 this._fMethod 获取相反的值 。

文章插图
由于 m_fMethod 被 transient 修饰,不会被序列化,通过分析 m_fMethod 赋值过程,可发现在 init() 时会获取sCName,并且通过判定是否为 () 结尾来进行赋值 。

文章插图

文章插图
由于参数为 this 的原因,导致getValueExtractorCanonicalName()方法返回的都是 null 。

文章插图
跟入 getValueExtractorCanonicalName()函数,最后是通过调用 computeValuExtractorCanonicalName 进行处理 。

文章插图
跟入 computeValuExtractorCanonicalName() 之后,如果 aoParam不为 null 且数组长度大于 0 就会返回 null,由于 aoParam 必须为 null,因此我们调用的方法必须是无参的 。接着如果方法名 sName 不一 () 结尾,就会直接返回方法名 。否则会判断方法名是否以 VALUE_EXTRACTOR_BEAN_ACCESSOR_PREFIXES 数组中的前缀开头,如果是的话就会截取掉并返回 。

文章插图
回到 extractComplex() 方法中,在 if 条件里会对上述返回的方法名做首字母大写处理,然后拼接 BEAN_ACCESSOR_PREFIXES 数组中的前缀,判断 clzTarget 类中是否含有拼接后的方法 。这里可以看到我们只能调用任意类中的 get 和 is 开头的无参方法 。也就解释了为什么 poc 会想到利用 JNDI 来进行远程动态类加载 。

文章插图
跟进 method.invoke() 方法,会直接跳转至 JdbcRowSetImpl.getDatabaseMetaData() 。

文章插图

文章插图
【黑客大神的Weblogic 远程命令执行漏洞分析】由于JdbcRowSetImpl.getDatabaseMetaData(),调用了 this.connect(),可以看到在 326 行执行了 lookup 操作,触发了漏洞 。

文章插图

文章插图
至此,跟进 getDataSourceName(),可看到调用了可控制的 dataSource 。

文章插图
总结
此漏洞主要以绕过黑名单的形式,利用 UniversalExtractor 任意调用get、is方法导致 JNDI 注入,由此拓展 CVE-2020-14625 。
推荐阅读
- 历史上的太子都是怎么死的 太子谋反有成功的吗
- PS图文教程 : 灯泡里的世界
- 老茶的功效与作用,青茶的功效与作用是什么
- 喝茶的注意事项,喝茶注意事项有哪些
- 吃鸭肉的禁忌有哪些方面
- 五红汤的食用禁忌和好处
- 微波炉热粥会产生哪些伤害呢?
- 好茶叶的四种辨别方法,辨别干仓普洱茶
- 睡眠时错误的认知介绍
- 国际茶叶标准,茶叶清洁的关键
