最近才意识到,要想迅速地有代码审计的能力(起码看得懂别人写的是个啥),从语言一点点学起实在是杯水车薪,感觉比较好的方法是稍微学习一下各种框架,起码能够知道系统的各部分的功能逻辑对应在代码文件夹的哪个文件里,以及相应的安全的防护是在哪里以什么逻辑做的,一方面有助于自己开发的时候灵活地选用框架,另一方面也可以迅速地了解一些不太熟悉的语言。
Apache Shiro
Java的一个安全权限框架。
用法
- 获取当前subject
SecurityUtils.getSubject()
- 测试session
subject#getSession()获取session
subject#isAuthenticated()判断是否已经认证
没有认证的话封装token,setRememberMe
默认配置文件账号密码为“lonestarr”,“vespa”
- 测试role
hasRole()
- 测试是否具备某一个行为
subject#isPermitted()
集成Spring
配置SecurityManager
配置CacheManager
配置Realm
配置LifecycleBeanPostProcessor
配置ShiroFilter
.anon 可以被匿名访问
.authc 必须认证后才可访问
漏洞
使用RemeberMe功能时,用户登录成功生成的cookie,其中,key为RemeberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的,因此在解密时在最后会进行反序列化操作存在RCE隐患。
对于利用条件,必要的AES加密密钥在shiro1.2.4之前版本中使用的是硬编码,AES加密的密钥默认在代码里可以得到,经过base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==
。在其更新版本种,反序列化漏洞存在,但是无法直接获取加密密钥,其使用了硬编码的密钥,使其每次生成一个密钥。
Author: suyumen
Link: https://suyumen.github.io/2022/07/15/2022-07-15-shiro%E6%A1%86%E6%9E%B6/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.