项目运行环境
环境搭建:
Ruoyi:4.2
MYSQL: 8.0.32 MySQL Community Server
JDK:jdk-8u161-windows-x64
MAVEN:apache-maven-3.2.3-bin
Shiro反序列化漏洞
Shiro反序列化漏洞
Shiro(<=1.2.4):AES加密的密钥默认硬编码在代码里,任何有权访问源代码的人都可以知道默认加密密钥。攻击者可以通过秘钥创建一个恶意对象,对其进行序列化、编码,然后将其作为cookie的rememberMe字段内容发送,Shiro 将对其解码和反序列化,导致服务器运行一些恶意代码。
Shiro(1.2.4<=版本<=1.4.1):需要一个合法的登录账号,利用用户的RememberMe cookie作为Padding Oracle Attack 的前缀,然后制作精心制作的RememberMe来执行Java反序列化攻击。
Shiro(1.4.2<=):Shiro 1.4.2 版本对于Shiro 反序列化来说是个分水岭,由AES-CBC加密模式改为AES-GCM,在不知道秘钥的情况下可利用工具对秘钥进行爆破,但是相对来说是很困难的。
虽然不同的版本攻击方式有所区别,但是只要秘钥泄露或者秘钥硬编码在代码中该系统就是不安全的。
查看pom.xml文件可以查看Shiro依赖包的版本为1.4.2,如下图所示:
在项目中搜索CipherKey,可以发现Shiro的秘钥是硬编码在代码中,如下图所示:
直接利用工具shiro_attack-2.2.jar
执行相关命令,如下图所示:
SQL注入
该项目使用Mybatis作为数据库持久化框架,全局搜索${寻找SQL注入,如下图所示:
点击进入SysRoleMapper.xml,SQL注入点在第58行,直接使用占位符$,如下图所示:
点击左侧箭头快速跳转到DAO层,如下图所示:
Ctrl加鼠标左键,选择第一个。最终来到 SysRoleServiceImpl 的实现层,如下图所示:
进入SysRoleServiceImpl后,再回溯到Controller层,SysRoleController中第59行和第69行都有调用这个方法,如下图所示:
键盘按住Ctrl加鼠标左键,点击 SysRole ,查看SysRole 具体代码,其中发现了 DataScope ,如下图所示: