java序列化和反序列化的概念:

序列化:把Java对象转换为字节流的过程。

反序列化:把字节流恢复为Java对象的过程。

序列化函数接口:

Java:Serializable Externalizable接口、fastjson、jackson、gson、ObjectInputStream.read、

ObjectObjectInputStream.readUnshared、XMLDecoder.read、ObjectYaml.loadXStream.fromXML、

ObjectMapper.readValue、JSON.parseObject等

PHP:serialize()、 unserialize() 

Python:pickle

java序列化特征:

1、java序列化功能特性

反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或DB存储等业务场景。因此审计过程中重点关注这些功能板块。

2、java序列化数据特性

一段数据以rO0AB开头,你基本可以确定这串就是JAVA序列化base64加密的数据。

或者如果以aced开头,那么他就是这一段java序列化的16进制。

3、java反序列化使用场景

http参数,cookie,sesion,存储方式可能是base64(rO0),压缩后的base64,MII等

Servlets http,Sockets,Session管理器,包含的协议就包括:JMX,RMI,JMS,JND1等

xm lXstream,XmldEcoder等(http Body:Content-type: application/xml)

json(jackson,fastjson)http请求中包含

4、利用类别

引用库包调用反射(如:ysoserial),自身框架组件特性(如:Fastjson

5、利用工具

jndi,ysoserial,marshalsec,FastjsonExploit

5.1、框架组件

fastjson,shiro,jackson,CommonsCollections

6、挖掘思路

-原生态的关键函数搜索

-框架组件的引用查看获取

案例:Java项目-jspxcms-shiro框架反序列化漏洞

1.源码导入idea,搭建好环境

2.在idea查看依赖包发现使用了 Apache Shiro 并且版本小于 1.4.2,存在shiro-721漏洞


3.根据网上的shiro-721漏洞利用方法,使用ysoserial工具-选择CommonsBeanutils1 利用链,

因为项目中引用了下图的三个库,符合CommonsBeanutils1 利用链

4.ysoserial工具根目录启动cmd,输入:java -jar ysoserial.jar CommonsBeanutils1 "calc" > payload.class  生成payload。意思:

调用ysoserial.jar和这个利用链CommonsBeanutils1,"calc"这个就是要执行的命令,输入到payload.class文件里

5.然后利用Shiro的Exp爆破出可以攻击的 rememberMe Cookie:

https://github.com/wuppp/shiro_rce_exp。

填充rememberMe字段:登录网站时勾选--自动登录,即可在数据包cookie中生成。最后加上个payload.class文件,最终可获得加密的payload。

输入:python2 shiro_exp.py 目标地址 rememberMe字段 payload.class

6.注意:爆破时间较长(一小时左右),payload长度决定爆破速度快慢。

爆破成功,返回payload:

7.再次访问目标地址,使用burp抓包,修改cookie中rememberMe字段的值为刚刚生成的payload,

发包成功执行命令——弹出计算器

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。