Sa-Token对url过滤不全存在的风险点
字数 1040 2025-08-22 22:47:39
Sa-Token URL过滤不全风险分析与防护指南
漏洞概述
Sa-Token框架在处理URL路径过滤时存在不完全过滤的风险,攻击者可能通过特殊构造的URL绕过权限验证机制,访问本应受保护的资源。
漏洞原理分析
1. 核心过滤机制
Sa-Token的URL过滤主要通过以下组件实现:
SaTokenConfigure#getSaServletFilter:配置需要过滤和放行的路径SaPathCheckFilterForServlet#doFilter:执行路径合法性检查SaCheckRequestPathFunction:处理路径编码过滤SaServletFilter#doFilter:全局过滤器执行权限认证
2. 现有防护措施
当前已实现的防护包括:
- 过滤
./和/和.的URL编码 - 过滤二次编码
%25 - 使用
request.getRequestURI()获取请求路径
3. 绕过方式
3.1 路径遍历尝试
初始尝试使用/public/../acc/isLogin,但由于框架已过滤./和其编码形式,此方法无效。
3.2 分号绕过
当规则配置为后缀匹配时(如/**/*.js),可利用分号绕过:
- 构造payload:
/acc/isLogin;.js - 分号在URL中作为参数分隔符,不影响实际访问路径
- 匹配Ant规则
/**/*.js,导致权限绕过
漏洞复现
正常情况
/acc/doLogin:配置放行,可正常访问/acc/isLogin:未配置放行,应被拦截
绕过情况
- 访问
/acc/isLogin;.js - 框架匹配
/**/*.js规则,错误放行 - 实际访问到
/acc/isLogin,实现权限绕过
修复方案
1. 编码过滤增强
在SaCheckRequestPathFunction中增加对以下字符的过滤:
- 分号
;及其URL编码%3B - 其他可能用于路径遍历的特殊字符
2. 路径规范化处理
在权限检查前对请求路径进行规范化处理:
String normalizedPath = request.getRequestURI().normalize().toString();
3. 规则配置建议
避免仅依赖后缀匹配规则,应结合完整路径匹配:
.addExclude("/static/**/*.js", "/acc/doLogin")
4. 安全过滤函数示例
public static String sanitizePath(String path) {
// 替换所有编码形式的斜杠和点
path = path.replaceAll("(?i)%2f", "/")
.replaceAll("(?i)%5c", "/")
.replaceAll("(?i)%2e", ".");
// 过滤分号及其编码
path = path.replaceAll(";|%3b", "");
// 规范化路径
path = Paths.get(path).normalize().toString();
return path;
}
总结
Sa-Token框架在URL过滤机制中存在因分号处理不当导致的权限绕过风险。开发者应:
- 更新至最新安全版本
- 增强路径过滤函数,包含分号及其编码的检测
- 对请求路径进行规范化处理
- 审慎配置权限规则,避免仅依赖后缀匹配
通过以上措施,可有效防范此类URL过滤不全导致的安全风险。