RBAC管理系统代码审计

基于SpringBoot+SpringSecurity的RBAC管理系统
项目地址:
GitHub - witmy/my-springsecurity-plus: ☕基于SpringBoot+SpringSecurity的RBAC管理系统,易读易懂🔥
c349c40566d8102c462bfecc19a745a9.png

组件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.codermy</groupId>
  <artifactId>my-springsecurity-plus</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>my-springsecurity-plus</name>
  <description>my-springsecurity-plus-admin</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.56</version>
    </dependency>
    <dependency>
      <groupId>org.thymeleaf.extras</groupId>
      <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <!--swagger-->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.9.2</version>
    </dependency>
    <!--swagger ui-->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.9.2</version>
    </dependency>
    <!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 验证码-->
        <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!--jjwt-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!--   UserAgentUtils   -->
        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
            <version>1.21</version>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 获取系统信息 -->
        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>4.4.2</version>
        </dependency>

        <!--ip2region,这是根据ip查地址的工具,有兴趣自己可以了解-->
        <!-- <dependency>-->
        <!-- <groupId>org.lionsoul</groupId>-->
        <!-- <artifactId>ip2region</artifactId>-->
        <!-- <version>1.7.2</version>-->
        <!-- </dependency>-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.13</version>
        </dependency>
        <!--hutool工具-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.7.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

常见的漏洞组件

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.56</version>
    </dependency>

fastjson 1.2.56 版本是存在漏洞版本的

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

mybatis 容易出现sql注入

fastjson

fastjson 主要搜索关键字:

JSON.toJSONString和JSON.parseObject/JSON.parse

都不存在,搜索了没啥可控的地方
b3c3490cf7f0054275c2dcb3c64a0db9.png
项目实际并没有使用到parseObject

SQL注入

使用的mybatis

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

预编译了会使用#{
可以搜索关键字

${
order by 
in 
like 
....

常用还是喜欢搜索${
f877c1247b73fe82b5617a68484c57a1.png
直接搜索就能找到一个地方存在
参数是 dictName
跟踪一下
点击这个小箭头跳转或是搜索id都是可以的
cedc59b9706e6d90e7480f7ca1979ee0.png
点击箭头跳转会跳转到dao层
0116a6609818a14fac866fe70a6a89c0.png
然后再点击getFuzzyDictByPage
1c4ebfa94c2313f67ab200a57cca11f7.png
跳转到service层
ac3d87204730574b24b7aaa54be36dad.png

@Override
public Result<MyDict> getDictPage(Integer offectPosition, Integer limit, MyDict myDict) {
    Page page = PageHelper.offsetPage(offectPosition,limit);
    List<MyDict> fuzzyDictByPage = dictDao.getFuzzyDictByPage(myDict);
    return Result.ok().count(page.getTotal()).data(fuzzyDictByPage).code(ResultCode.TABLE_SUCCESS);
}

@Override
public MyDict getDictByName(String dictName) {
return dictDao.getDictByName(dictName);
}

是一个分页查询数据的功能
点击getDictPage
跳转到Controller 层
dac424ca0d77f96ab2c4f4928ea66121.png

@GetMapping
    @ResponseBody
    @ApiOperation(value = "字典列表")
    @PreAuthorize("hasAnyAuthority('dict:list')")
    @MyLog("查询字典列表")
    public Result getDictAll(PageTableRequest pageTableRequest, MyDict myDict){
        pageTableRequest.countOffset();
        return dictService.getDictPage(pageTableRequest.getOffset(),pageTableRequest.getLimit(),myDict);
    }

是一个查询字典列表 的功能去后台查看
797060ca849fdcc88912130caa1bd6b4.png
点击查询字典抓包
b5b3dd3046b6b18345cc7bf4636d1e8c.png
175c1c8fa7e71e3d3a6fd33fd8e98413.png
找到SQL注入参数 :dictName
输入单引号会报错
1439c539131ac16743210e2549b8a0c7.png
闭合不了 ,直接拼接sql语句
使用延时注入测试
261031b1bed0d5ab446df943da253d3b.png
c476401265c296526adf74268f7293ae.png
成功延迟3秒 ,存在注入 。

越权

越权的代码审计还不太会,先结合黑盒测试 ,然后再去看看代码
先添加一个低权限的用户
4792463e6e1fed7eb0b06fdb1bf37aba.png
高权限用户查询人员
8cdac8c8d8210d4f45f077a75d0b3b64.png
高权限的编辑接口
d02f5b00ccd80ed79fd2411f2b962750.png

/api/user/edit/?userId=1

切换低用户
低权限用户啥都没有
630e105e2b3edd632dafd1d00cd4c1c2.png
使用接口看看
通过编辑的接口就可以查看所有人的信息
d2ea8bcac43c1646c942a064b64fba76.png
证明是存在垂直越权的
他这是存在一个是否为admin的判断的
c1050cbcfdeb8a5188353913808c2a1c.png
但是这里还是有点逻辑没搞懂,可能因为sql哪里是没有做查询用户限制的 。

未授权

项目引入了SpringSecurity
a23084298be0d12891b7c730332a57ff.png
SpringSecurity会配置一些放行的静态资源,有时错误的配置会将一些关键资源放行,造成未授权访问
搜索静态
431d4744fd2d9ca6e5a930745775918f.png
有一个放行静态资源的接口
常见熟悉的就有
5a247a274876e9ff4412bbd9ae4b6910.png

druid
actuator
swagger-ui.html
.....

d2fdd9194264a2503afbb3d832e3d459.png
f19f924579abe970a9ec527cb6fcbd88.png
配置里面也会写druid的账号密码
39cc604f1037d4dee24374ea40c137ab.png
afb34cbc940adc27f8a8b7466f6d8b85.png

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RBAC(Role-Based Access Control)是一种常见的权限管理模型,它基于角色来控制对系统资源的访问权限。下面是一些关于RBAC权限管理实战的步骤: 1. 定义角色:首先需要明确系统中的不同角色,如管理员、普通用户、编辑员等。每个角色应该有明确的职责和权限范围。 2. 确定权限:对于每个角色,需要确定其具体的权限列表。这包括可以执行的操作、可以访问的资源等。一般来说,可以将权限分为读取、写入、修改和删除等级别。 3. 分配角色:根据用户的实际需求和职责,将相应的角色分配给他们。这可以通过用户注册时选择角色,或者由管理员在后台手动分配。 4. 实现权限验证:在系统中实现权限验证机制,确保用户只能访问其拥有权限的资源。这可以通过在代码中添加条件判断,或者使用框架提供的权限管理功能来实现。 5. 动态调整:随着业务需求的变化,可能需要动态调整角色和权限。在系统中提供相应的界面或接口,使管理员能够灵活地修改角色和权限配置。 6. 审计和日志记录:记录用户的操作日志和权限变更日志,以便监控系统的安全性和追踪问题。 总结起来,RBAC权限管理实战包括定义角色、确定权限、分配角色、实现权限验证、动态调整和审计日志记录等步骤。通过合理使用RBAC模型,可以提高系统的安全性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值