【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+授权

news/2024/12/3 7:59:56/文章来源:https://www.cnblogs.com/o-O-oO/p/18583222

用户登陆成功之后, 要进行响应的操作就需要有对应的权限; 在进行操作之前对权限进行检查 - 授权.

权限控制通常有两类做法:

不同身份的用户登录,不同的操作菜单(没有权限的菜单不显示)
对所有用户显示所有菜单,当用户点击菜单以后再验证当前用户是否有此权限,如果没有则提示权限不足。

HTML 授权 - shiro 标签

我们使用<shiro:hasRole name="角色名">,<shiro:hasPermission name="权限名">, 可以判断当前角色是否具有某种权限, 从而显示在页面上, 例如:

<shiro:hasRole name="kmanager"> <!-- 是否是 kmanager 角色 --><li class="layui-nav-item layui-nav-itemed"><a class="" href="javascript:;">客户管理</a><dl class="layui-nav-child"><shiro:hasPermission name="sys:k:save"> <!-- 是否具有 sys:k:save 权限 --><dd><a href="javascript:;">新增客户</a></dd></shiro:hasPermission><shiro:hasPermission name="sys:k:delete"><dd><a href="javascript:;">删除客户</a></dd></shiro:hasPermission><shiro:hasPermission name="sys:k:update"><dd><a href="javascript:;">修改客户</a></dd></shiro:hasPermission><shiro:hasPermission name="sys:k:find"><dd><a href="">查询客户</a></dd></shiro:hasPermission></dl></li>
</shiro:hasRole>

最终运行效果如图:

可以发现zhaoliu和lisi登陆上显示的功能模块是不同的.

过滤器授权 - 修复越权

当然, 我们上面lisi用户是不存在查询客户权限的, 那么当lisi通过一些手段得到了查询客户的API路径, 则会造成越权漏洞, 我们可以本地模拟一下这个环境.

PageController中定义方法:

@RequestMapping("/xFind")
public String kFind() {return "k_find"; // 定位到 /resources/templates/k_find.html 文件
}

定义k_find.html页面:

<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head><meta charset="UTF-8"><title>查询客户页面</title>
</head>
<body>
<h3>查询客户主页</h3>
<h4>当前用户: <shiro:principal/></h4>
</body>
</html>

随后定义/resources/templates/index.html模板, 在该模板中增加一个iframe, 以及超链接跳转:

<shiro:hasPermission name="sys:k:find"><dd><a href="/kFind" target="MainIframe">查询客户</a></dd><!-- 其他内容... -->
</shiro:hasPermission>
<div class="layui-body"><iframe width="100%" height="780" name="MainIframe"></iframe>
</div>

随后我们查看zhaoliu (具有查询客户权限)以及wangwu (不具有查询客户权限)的两种访问情况:

实际场景 wangwu 也存在查询客户的权限, 因为 <shiro:hasRole> 标签功能被隐藏了, 测试的时候最好使用zhangsan & zhaoliu进行测试.

这样就造成了一个越权漏洞, 而修复方法也很简单, 我们只需要对/kFind这个路由增加权限判断即可, 那么我们配置ShiroFilter如下:

@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, String> hashMap = new HashMap<>();hashMap.put("/", "anon"); // / 支持匿名访问hashMap.put("/login", "anon"); // login 支持匿名访问hashMap.put("/static/**", "anon"); // static 下的内容随便访问hashMap.put("/logout", "logout"); // 访问则退出登录hashMap.put("/kFind", "perms[sys:k:find]"); // 当前用户存在 sys:k:find 权限才允许访问shiroFilterFactoryBean.setFilterChainDefinitionMap(hashMap);shiroFilterFactoryBean.setLoginUrl("/login");shiroFilterFactoryBean.setUnauthorizedUrl("/"); // 当权限不允许时, 跳转的路径return shiroFilterFactoryBean;
}

配置完毕后不存在sys:k:find权限的用户直接访问/kFind会被拦截.

注解授权 - 修复越权

除了上面的方法, 我们也可以在PageController::kFind上面定义注解:


@RequestMapping("/kFind")
@RequiresPermissions("sys:k:find") // 如果当前用户具备该权限, 那么才让访问.
public String kFind() {return "k_find"; // 定位到 /resources/templates/k_find.html 文件
}

当然定义完毕后, 我们需要在ShiroAutoConfigruation类中进行定义该注解所需要的Bean:

@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();advisorAutoProxyCreator.setProxyTargetClass(true);return advisorAutoProxyCreator;
}@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();advisor.setSecurityManager(securityManager);return advisor;
}

如果当前用户不存在sys:k:find权限, 那么会显示如下内容:

并且IDEA中会收到抛出来的异常信息:

org.apache.shiro.authz.AuthorizationException: Not authorized to invoke method: public java.lang.String com.heihu577.controller.PageController.kFind()

那么这种情况我们应该如何处理呢?这里我们可以通过Spring全局异常来将其跳转到某个页面中去即可.

package com.heihu577.exception;@ControllerAdvice
public class ErrorHandler {@ExceptionHandler(AuthorizationException.class)public ModelAndView handleException(Exception e) {ModelAndView modelAndView = new ModelAndView("index"); // 认证失败跳转到主页modelAndView.addObject("exception", e);System.out.println("进入异常处理...");return modelAndView;}
}

手工授权 - 修复越权

当然我们也可以使用subject进行判断, 代码如下:

@RequestMapping("/kFind")
// @RequiresPermissions("sys:k:find")
public String kFind() {Subject subject = SecurityUtils.getSubject();if (subject.isPermitted("sys:k:find")) {return "k_find"; } else {return "index";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/845906.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+Shiro 加密

加密的过程如下:研究这部分内容, 我们需要将数据库中Password值都改为MD5处理后的值, 过程如下: mysql> SELECT * FROM tb_users; +---------+----------+----------+---------------+ | user_id | username | password | password_salt | +---------+----------+----------…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+退出登录

在我们的ShiroAutoConfiguration::ShiroFilterFactoryBean中, 我们增加如下代码: @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilte…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+自定义 Realm

在真正的项目中, 我们不会使用Shiro提供的JdbcRealm, 而是使用自定义Realm, 配合我们的MyBatis, 以及自定义表结构进行联合使用.表结构定义 那么下面我们来定义这些表:-- 用户信息表 CREATE TABLE `tb_users`(user_id int unsigned primary key auto_increment,username varcha…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+IniRealm

IniRealm 如果我们想在SpringBoot中进行使用Shiro, 那么我们肯定是需要围绕如下环节进行研究. 创建 pom.xml: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3&l…

【Java漏洞】Shiro 漏洞:SpringBoot 整合 Shiro+JdbcRealm

JdbcRealm 其中JdbcRealm需要创建如下表结构: CREATE TABLE `users`(id int primary key auto_increment,username varchar(60) not null unique,password varchar(60) not null,password_salt varchar(20) ); -- 创建五个用户如下 INSERT INTO `users`(username, password) VA…

【Java漏洞】Shiro 漏洞:基于 Java SE 基本使用

在pom.xml文件中进行引入依赖: <dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.1</version></dependency> </dependencies>因为本次的Realm从文…

【Java漏洞】Shiro 漏洞:Shiro 核心组件

Shiro 的运行流程为如下:这里 Subject 的创建是由 SecurityUtils 进行创建的, 后面我们代码会给出案例, 官方给出的图如下:

【Java漏洞】Shiro 漏洞:权限管理

Shiro 的漏洞已爆出很多年, 我们只关心到了它如何触发, 有时并没有想过这个框架是干嘛的, 甚至没有分析过该框架的底层运行逻辑, 那么本篇文章, 让大家从开发者的角度, 来观察。 概念为了实现不同身份登录系统, 出现的功能模块不一样。这个需求叫做权限管理。 学生登录后, 出现…

读数据保护:工作负载的可恢复性02收集需求

收集需求1. 要点 1.1. 数据保护并不是IT里面最出彩的部分1.1.1. 让这个组织知道自己可能遭受哪些风险1.1.2. 与该组织内具有核心竞争力的IT产品通常没有什么联系1.2. 做数据保护所需的资源通常很昂贵,而且这些资源并不会体现在该组织卖给客户的最终产品里1.2.1. 没人会情愿为这…

怎么去除img之间存在的间隔缝隙?

在前端开发中,img 元素之间出现间隔缝隙通常是由几个原因造成的,以下列出常见原因及解决方法: 1. 默认的 inline-block 行为:原因: img 元素默认是 inline-block 元素。inline-block 元素会受到空格和换行符的影响,这些空格和换行符会被渲染成一个空格,从而导致元素之间出…

window10安装子系统wsl2

启用linux子系统 打开控制面板 点击程序点击 启用或关闭 Windows 功能勾选 适用于 Linux 的 Windows 子系统 然后点击确定[Haima的博客] http://www.cnblogs.com/haima/

免费实时翻译软件-MTtranslator

MTtranslator 基于win11的实时字幕(Live Captions),利用本地大模型(Helsinki-NLP/opus-mt-en-zh)实现实时翻译功能。功能特点仅支持英文到简体中文翻译该应用专为实时字幕翻译设计,支持从英文到简体中文的转换。离线操作翻译完全离线进行,保证隐私安全。但翻译质量仅供参…