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