shiro的一点总结
本文来说说之前有一篇面试中提到的shiro反序列化问题。
分为以下几部分。
- 问题点的产生及原理
- AES加密
- 问题点的利用扩大
- 问题点自动化利用
- 什么是Shiro以及Shiro的作用
Shiro是一款java的安全框架。作用与会话部分,提供身份验证,会话管理,数据加密,用户认证功能。
- 问题点的产生及原理
1.1 漏洞产生点
漏洞的产生点在于shiro的remeberMe功能处,该功能提供了cookie的加密序列化存储,默认使用AES算法加密的方式。
1.2 Shiro反序列化的产生
在存储cookie的过车各种,由于AES算法的密钥为非保密密钥(包括可猜测,硬编码等问题)导致,反序列化漏洞。
- AES加密
先来说说什么是AES算法。
概念是对称加密,包含四步操作AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。
解密就是进行逆操作。
由于采用的是对称加密,所以拥有密钥的情况下,内容可知。
(详解:https://www.cnblogs.com/luop/p/4334160.html)
- 问题点的利用扩大以及获取测试
问题点在于,服务端收到用户发来的cookie时,会先进性base64解码,然后AES解密,最后进行反序列化操作。
攻击点也就在于反序列化操作中,问题的产生点在于AES解密的破解。当然,算不上是破解,只能说是AES加密的绕过。这里的方式是获取密钥,在早期的shiro系统中密钥是硬编码,所以可以直接获取,后更新为随机编码。
3.1 如何利用
利用payload需要先序列化->利用相应密钥进行AES加密->base64编码,放在cookie中的remeberme字段中,发送即可。
3.2 如何挖掘
官方硬编码存在版本为低于1.24版本,该版本以上采用了由开发者设置的方式,未设置的会采用动态生成的方式。
但是由于很多情况下shiro是集成的,部分产品基于二次开发,导致实际上和硬编码的效果是一样的。
所以第一步是收集shiro的编码。
第二步进行比对,若正确则可用。
第三步就是发送payload。
这里重点讲一下比对的过程,这也是漏洞挖掘的最关键点。
首先,这个方法的来源是这篇分析博客(https://mp.weixin.qq.com/s/WDmj4-2lB-hlf_Fm_wDiOg),感谢大佬。
分两步,第一步确定存在,即给予一个remeberme字段(为了防止第一次碰对的情况,请使用base64编码的垃圾数据),通过其返回set-cookie:remeberMe=deleteMe字段,确定尝试点。
第二步,发送加密数据,如果不存在set-cookie:remeberMe=deleteMe字段,则证明加密的加密模式与密钥与目标相同。(这里包括密钥内容与加密模式)
第三步发送加密payload。
- 问题点自动化利用
自动化利用的方式重点就这密钥收集,类型判断以及payload生成上。
具体的工具,想仿写一个,近期没时间动手,请参考上文。
- WAF的绕过
先思考这类waf我们如何检测,是进行进行payload检测,解码后过长禁止?
进行解码后内容对比,还是密钥输入?
首先可知不可能每次让用户输入密钥,其次,解码后内容大小本身我们也不可控,更何况有上文说的那种大小绕过方式。
https://mp.weixin.qq.com/s/qF7Jgiev5B7zLEHwGXry3A
这篇文章的师傅测试了aliyun的waf规则,发现只有对最简单的默认key的匹配。这个key,他通用吗?这个是早版本的key,过两天有时间看看ali有没有同步更多的key吧。(挖个坑)
后面师傅还给了一种默认key也可以过waf的方式,那就是利用解析漏洞。(先这么称呼),解析规则的不同带来了不同的绕过体验。
这个和我之前sql注入那篇提到的waf绕过有异曲同工之妙,也是通过解码无害的思想对攻击语句进行“修饰”。
时间缘故,没找到什么好比过这位师傅的绕过方式,考虑一下防御问题。
同样的是长度限制,是否能够提取常见数据进行一个长度提取,然后进行大小限制。显而易见的是waf性能要求较高,算是提取特征进行防御的一种方式。
第二种解码后,只能说提供方式但是由于安全性的问题并不可取。
安全开发高于安全防御吧hh。
还有就是遇到不可解密的数据应当提供日志,警告等方式。
加密模式应该宽松化等等。
(接下来会写一下常见的古今加密流程,顺便实现一下这个工具,也挖个坑吧。)

浙公网安备 33010602011771号