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,
发包成功执行命令——弹出计算器
原文始发于微信公众号(小黑子安全):代码审计-Java项目-反序列化漏洞