目录
一.Shiro是什么?
(1)Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码 和会话管理。
比如说这里有登录口,你登陆的时候是不是需要鉴权,有大佬就写了专门鉴权的代码,封装成框架,便于开发,Apache Shiro就是之一。
(2)什么东西能够用来鉴权——cookie字段。
shiro直接就将cookie进行了反序列化,是因为其前端只能以数据或者字符串的形式传输,后台为了判断,通过对象里面的字段进行鉴别。在传输前,会对cookie进行加密,传过来之后解密,在反序列化。
二.原理
AES加密的密钥key存在于代码中,用户可以爆破获取密钥。攻击可以构造一个恶意的对象,进行序列化,用AES的密钥进行加密,用base64编码。通过修改remeber me字段,发送给服务器,服务器中shiro框架由于没有对这个字段进行过滤,导致解码过程,直接解析了这段恶意的对象,造成反序列化漏洞。(你可以先看完第三模块在看这个原理)
三.Shiro识别身份的时候的工作流程和存在的漏洞点
1.获取rememberMe cookie
后台拿到这个cookie字段,header头里面有很多属性,其中rememberMe属性,就是为鉴权的反序列化字符串。
使用了cookieRmemberMeManager类来获取rememberme的cookie值, 然后使用getRmemberedSerializedIdentity()方法来对该值进行解密
2.base64解密
使用了cookieRmemberMeManager类来获取rememberme的cookie值, 然后使用getRmemberedSerializedIdentity()方法来对该值进行解密
3.AES解密
在AbstractRememberMeManager类中有如图所示的decrypt方法,该方法可以对传入的值进 行AES解密,然后返回serialiezd值,该解密需要一个key值(漏洞点就是这个),也就是常说的shiro的key值, 由于AES是对称加解密,所以前端传值的时候会将该key值在rememberme的cookie中 传输,然后后台通过该key值来进行解密。
4.反序列化
第一步登录成功,前往服务器。
第二步,服务器对cookie序列化,在AES加密,在BASE64编码,最后传输给浏览器,让浏览器保存。
1.当登录之后,请求资源,通过remeberme功能块带着cookie前往服务器。
2.服务器经过一些列解码,反序列化,进行身份鉴别。
了解到这个过程之后 ,remeberme这里肯定是不能作为漏洞点的,AES加密(对称加密——密钥key),使用了默认的key或者是不变的key,存在在代码里面,这就是漏洞点。1.2.4
四.利用条件
1.使用shiro框架嘛。
2.知道shiro框架里面的key值。
3.存在利用链(可以调用执行命令的函数)。(没有利用链,就算存在漏洞,也无法利用,因为你无法调用)
五.如何判断是不是shiro框架
抓取一个请求包,然后在请求包中的cookie值中添加;rememberMe=1,然后发送,如果返回包中有rememberMe=deleteMe字样,那么就存在shiro框架。
六.获取key值,利用链
一般key是通过工具爆破出来的,所以这里就需要工具了,比如飞鸿的 ShiroExploit.V2.5工具
七.总结
1.Shiro版本< 1.2.5:没有为“remember me”功能配置密钥,允许远程攻击者执行任意代码或通过请求参数绕过预期的访问限制。1.2.5及后续的版本,都是随机产生的密钥。