hutool依赖利用链挖掘分析
1341025112991831 WEB安全 137浏览 · 2025-03-25 17:14

hutool依赖利用链挖掘分析

前言

Hutool 是一个 Java 工具库,提供了一系列 开箱即用的工具类,极大地简化 Java 开发,提高代码的可读性和开发效率。它的目标是 让 Java 更简单,类似于 Java 版的 LodashGuava

Hutool 由 中国开发者 looly 开发,代码简洁、API 设计优雅,适用于 Java 后端开发、工具开发、数据处理 等场景。



在很多反序列化中,我们经常的sink点都是调用bean的getter或者setter方法,也一直没有停止过对如何调用setter和getter的挖掘,比如我们的fastjson和jackson,但是对于hutool组件的挖掘,网上分析文章非常的少,这里也是进行一波调试分析,探究底层到底是如如何调用getter在我们的反序列化中被利用的





测试代码

PHP
复制代码
我们运行发现调用了 put 类的 getter 方法



调用探寻

我们调试分析一下

首先进入 put 方法



重点是我们的 value 对象

根据 set 方法

在这里调用了 JSONUtil.wrap(InternalJSONUtil.testValidity(value)去处理我们的对象

就是把我们的 Java 对象包装为相应的 JSON 结构

jdk 原始类判断

在 wrap 方法中会进行 isJdkClass 判断

首先获取包名,然后判断包名是否以 java 或者 javax 开头,然后还会判断是否 classloader 加载,因为原生类就是

因为是 jdk 的类会直接返回 obj.tostrng,如果不是才会进行下一步

跟进

进入我们的 map

跟进 source 的类型选择对应的 map 方法来处理

isReadableBean 检测

在调用 bean 的处理方法前会坚持当前对象是否为我们的 bean

首先判断是否有 getter 方法

首先需要判断我们的 class 是一个 isNormalClass

然后判断是否有 getter 方法

然后还要判断 hasPublicField

是否有 public 的字段

判断成功后就会进入 mapFromBean 处理

一直跟进来到 copy 方法

将 JavaBean 的属性复制到一个 Map 中,在赋复制过程中会根据 copyOptions 进行一些转换和筛选

isReadable 检测

这里会获取名称和对应的描述

会调用 isReadable

判断这个 fied 是不是 public,有没有对应的 getter 方法,还判断了 fied 是不是 TRANSIENT 修饰

如果是 public 而且有对应的 getter 方法,并且没有被 Transient 修饰才会进入下一步

来到我们的 sink 点

看这个逻辑就是非常清楚了,就是调用我们的 getter 方法

最后也算是分析清楚了

与常规调用 getter 组件区别

TemplatesImpl 类

POC

这个类是我们的老朋友之一了,但是并不能够利用它,至于原因我们来分析分析

还是一样的来到 wrap 方法



这里会进入 isJdkClass 判断

因为这个是 jdk 的原始类

返回为 null



导致直接 object.toString()

并不会进行下面的步骤,导致利用失败

LdapAttribute

这个类非常有意思,是我们的 jdk 的原生类,而且调用它的 getter 方法可以触发 jndi

看到它的 getAttributeSyntaxDefinition 方法

是可以进行 jndi 的

具体参考网上,有很多了,我们尝试利用这个

一样的到 jdk 判断



在判断中任然不可以



所以导致了利用失败



0 条评论
某人
表情
可输入 255