『Java安全』Shiro1.0.0未标准化路径造成越权访问(CVE-2010-3863)复现与浅析

本文详细介绍了Apache Shiro的一个安全漏洞,该漏洞允许未授权的/越权访问。通过环境配置、代码审计和复现步骤,展示了如何利用未标准化路径造成权限问题。修复方案是确保路径处理的标准化,防止恶意用户通过特殊路径绕过权限控制。
摘要由CSDN通过智能技术生成

影响版本

1.0.0-incubating

漏洞原理

未标准化路径造成/./越权访问

漏洞复现

环境配置

环境采用springboot+shiro,配置基础见下文:

https://ho1aas.blog.csdn.net/article/details/125367641

在这里插入图片描述

ShiroConfig

package com.example.shirospring.config;

import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    @Bean
    public IniRealm getIniRealm(){
        return new IniRealm("classpath:shiro.ini");
    }

    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(IniRealm iniRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(iniRealm);
        return securityManager;
    }

    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
        filter.setSecurityManager(defaultWebSecurityManager);

        Map<String,String> filterMap = new HashMap<>();

        filterMap.put("/**", "anon");

        filter.setFilterChainDefinitionMap(filterMap);

        filter.setLoginUrl("/login.html");
        filter.setUnauthorizedUrl("/unauthorized.html");

        return filter;
    }
}

UserController

package com.example.shirospring.controller;

import com.example.shirospring.service.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserServiceImpl userService;

    @PostMapping("/login")
    public String login(String username,String password){
        try {
            userService.checkLogin(username,password);
            return "login successfully!";
        } catch (Exception e) {
            return "error";
        }
    }
}

UserServiceImpl

package com.example.shirospring.service;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl {
    public void checkLogin(String username, String password) throws Exception{
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        subject.login(token);
    }
}

index login unauthorized

写三个简单的html就行了
在这里插入图片描述

shiro.ini

写两个用户和角色就行

[users]
user=user,user
admin=admin,admin

[roles]
admin=*
user=use

复现操作

在resources下写一个secret.html

在这里插入图片描述
然后在ShiroConfig.getShiroFilterFactoryBean,也就是过滤器,添加需要鉴权才可访问

在这里插入图片描述
使用burp在未登录情况访问secret.html,提示未登录需要鉴权

在这里插入图片描述
然后尝试访问/./secret.html,读取成功,这一步不能使用hackbar

在这里插入图片描述

代码审计

PathMatchingFilterChainResolver.getChain获取过滤器链然后调用过滤器

在这里插入图片描述
获取请求URL,这里直接截取了,没有任何处理

在这里插入图片描述

接下来就是依次匹配,直到匹配成功

在这里插入图片描述

匹配利用AntPathMatcher.matches

在这里插入图片描述
直接全字匹配了,用的是字符串比较

在这里插入图片描述
在这里插入图片描述
这样配置filter就会导致未授权/越权访问

参考

https://su18.org/post/shiro-1/

欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://ho1aas.blog.csdn.net/article/details/125404334
版权声明:本文为原创,转载时须注明出处及本声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值