目录
什么是shiro?
shiro是功能强大且容易使用的java安全框架。shiro可以非常容易开发出足够好的应用。
shiro可以帮助我们完成:认证.授权.加密.会话管理等
Shiro有着很好的通用性,不局限于Web 环境,但在Web 环境下一些特定的需求需要手动编写代码定制,有一定的代码侵入。
-shiro核心架构
什么是安全框架?
安全框架就是解决系统安全问题的框架,如果没有安全框架,我们需要手动处理每个资源的访问控制,比较繁琐。使用安全框架,可以通过配置的方式实现对资源的访问限制。
反序列化与序列化
序列化其实就是讲数据转化成一种可逆的数据结构,逆向的过程就叫做反序列化
序列化过程:是指把一个 Java 对象变成二进制内容,实质上就是一个 byte[]。因为序列化后可以把 byte[] 保存到文件中,或者把 byte[] 通过网络传输到远程(IO),如此就相当于把 Java 对象存储到文件或者通过网络传输出去了。
反序列化过程:把一个二进制内容(也就是 byte[] 数组)变回 Java 对象。有了反序列化,保存到文件中的 byte[] 数组又可以“变回” Java 对象,或者从网络上读取 byte[] 并把它“变回” Java 对象。
什么情况下需要序列化? 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候; 当你想用套接字在网络上传送对象的时候; 当你想通过RMI传输对象的时候。
shiro反序列化漏洞
Apache Shiro框架提供了一个记住我的功能,这个功能在用户登录成功之后,会生成一个加密后的cookie。其中记住我的RememberMe就是cookie中的key。cookie的值是对相关信息进过序列化,再进行aes加密,再使用base64编码之后形成的。 服务端接收cookie值时,也是按照以下步骤解析的:
1.检索RememberMe cookie的值
2.base64解码
3.使用aes解码(加密密钥硬编码)
4.进行反序列化操作(未做过滤处理) 在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
怎么判断是否存在反序列化漏洞?
登录页面随便输入用户名密码用burpsuite抓包
在cookie后加入rememberMe=1
在响应包中显示如下说明存在shiro框架可能存在漏洞
如果没有的话,在请求包里的cookie中添加rememberMe=deleteMe,查看相应包里面set-cookie是否有相同字样,有则表示有该漏洞。