SmartAdmin-3.13.0-”假”权限绕过分析
字数 1136 2025-08-29 08:30:13

SmartAdmin 3.13.0 开发环境权限绕过分析

漏洞概述

SmartAdmin 3.13.0 版本存在一个开发环境下的权限绕过漏洞,该漏洞允许攻击者在开发或测试环境中通过简单的数字token绕过权限验证,直接获取管理员权限。需要注意的是,此漏洞仅存在于开发/测试环境,生产环境中无法利用。

漏洞原理分析

1. 拦截器配置

漏洞根源在于MvcConfig类中的拦截器配置:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(adminInterceptor)
            .excludePathPatterns(SwaggerConfig.SWAGGER_WHITELIST)
            .addPathPatterns("/**");
}
  • excludePathPatterns: 配置了不需要拦截的路径(主要是Swagger相关路径)
  • addPathPatterns: 配置了需要拦截的路径(/**表示所有路径)

2. 权限验证逻辑

AdminInterceptor拦截器中,关键验证逻辑如下:

// 第一步:根据token获取用户
String tokenValue = StpUtil.getTokenValue();
boolean debugNumberTokenFlag = isDevDebugNumberToken(tokenValue);
String loginId = null;

if (debugNumberTokenFlag) {
    // 开发、测试环境,且为数字的话,则表明为调试临时用户
    loginId = UserTypeEnum.ADMIN_EMPLOYEE.getValue() + StringConst.COLON + tokenValue;
    StpUtil.switchTo(loginId);
} else {
    loginId = (String) StpUtil.getLoginIdByToken(tokenValue);
}

RequestEmployee requestEmployee = loginService.getLoginEmployee(loginId, request);

关键点分析:

  1. token获取:从请求头x-access-token获取token值
  2. 开发环境检测isDevDebugNumberToken方法检查:
    • token是否为数字或null
    • 当前是否为开发或测试环境
  3. 权限绕过
    • 如果是开发/测试环境且token为数字,则构造loginId1:token值的形式
    • 1对应管理员ID,直接赋予管理员权限
    • 后续权限检查中,ID为1的用户会被识别为超级管理员,绕过所有权限检查

3. 数据库关联

本地数据库中管理员ID默认为1,这也是为什么构造1:token形式可以获取管理员权限的原因。

漏洞验证

验证步骤:

  1. 选择一个需要权限的接口,如/goods/exportGoods
  2. 发送请求时不带token或带非数字token:
    • 返回未授权错误
  3. 发送请求时带上数字token(如123):
    • 成功访问接口
    • 获取管理员权限

不同场景下的响应:

  1. 无token情况
    • 返回未授权错误
  2. 非超管token
    • 返回权限不足错误
  3. 数字token(开发环境)
    • 成功访问,获取管理员权限

漏洞影响

  • 影响范围:仅影响开发环境和测试环境
  • 影响程度:可获取系统管理员权限
  • 生产环境:不受影响,因为isDevDebugNumberToken在生产环境中会返回false

修复建议

  1. 开发环境安全

    • 不应将开发环境直接暴露在公网
    • 开发环境也应设置基本的安全防护
  2. 代码层面改进

    • 移除或严格限制开发环境的权限绕过功能
    • 为开发环境设置独立的认证机制
  3. 配置检查

    • 确保生产环境的配置不会意外启用开发模式

总结

该漏洞本质上是为方便开发测试而设计的"后门",并非真正的安全漏洞。但它提醒我们:

  1. 开发环境也需要基本的安全防护
  2. 便利性功能可能带来安全隐患
  3. 权限验证逻辑需要严格区分不同环境

在实际开发中,应避免此类可能被误解或滥用的设计,特别是在可能被外部访问的环境中。

SmartAdmin 3.13.0 开发环境权限绕过分析 漏洞概述 SmartAdmin 3.13.0 版本存在一个开发环境下的权限绕过漏洞,该漏洞允许攻击者在开发或测试环境中通过简单的数字token绕过权限验证,直接获取管理员权限。需要注意的是,此漏洞仅存在于开发/测试环境,生产环境中无法利用。 漏洞原理分析 1. 拦截器配置 漏洞根源在于 MvcConfig 类中的拦截器配置: excludePathPatterns : 配置了不需要拦截的路径(主要是Swagger相关路径) addPathPatterns : 配置了需要拦截的路径( /** 表示所有路径) 2. 权限验证逻辑 在 AdminInterceptor 拦截器中,关键验证逻辑如下: 关键点分析: token获取 :从请求头 x-access-token 获取token值 开发环境检测 : isDevDebugNumberToken 方法检查: token是否为数字或null 当前是否为开发或测试环境 权限绕过 : 如果是开发/测试环境且token为数字,则构造 loginId 为 1:token值 的形式 1 对应管理员ID,直接赋予管理员权限 后续权限检查中,ID为1的用户会被识别为超级管理员,绕过所有权限检查 3. 数据库关联 本地数据库中管理员ID默认为1,这也是为什么构造 1:token 形式可以获取管理员权限的原因。 漏洞验证 验证步骤: 选择一个需要权限的接口,如 /goods/exportGoods 发送请求时不带token或带非数字token: 返回未授权错误 发送请求时带上数字token(如123): 成功访问接口 获取管理员权限 不同场景下的响应: 无token情况 : 返回未授权错误 非超管token : 返回权限不足错误 数字token(开发环境) : 成功访问,获取管理员权限 漏洞影响 影响范围 :仅影响开发环境和测试环境 影响程度 :可获取系统管理员权限 生产环境 :不受影响,因为 isDevDebugNumberToken 在生产环境中会返回false 修复建议 开发环境安全 : 不应将开发环境直接暴露在公网 开发环境也应设置基本的安全防护 代码层面改进 : 移除或严格限制开发环境的权限绕过功能 为开发环境设置独立的认证机制 配置检查 : 确保生产环境的配置不会意外启用开发模式 总结 该漏洞本质上是为方便开发测试而设计的"后门",并非真正的安全漏洞。但它提醒我们: 开发环境也需要基本的安全防护 便利性功能可能带来安全隐患 权限验证逻辑需要严格区分不同环境 在实际开发中,应避免此类可能被误解或滥用的设计,特别是在可能被外部访问的环境中。