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,导致权限绕过

漏洞复现

正常情况

  1. /acc/doLogin:配置放行,可正常访问
  2. /acc/isLogin:未配置放行,应被拦截

绕过情况

  1. 访问/acc/isLogin;.js
  2. 框架匹配/**/*.js规则,错误放行
  3. 实际访问到/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过滤机制中存在因分号处理不当导致的权限绕过风险。开发者应:

  1. 更新至最新安全版本
  2. 增强路径过滤函数,包含分号及其编码的检测
  3. 对请求路径进行规范化处理
  4. 审慎配置权限规则,避免仅依赖后缀匹配

通过以上措施,可有效防范此类URL过滤不全导致的安全风险。

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. 路径规范化处理 在权限检查前对请求路径进行规范化处理: 3. 规则配置建议 避免仅依赖后缀匹配规则,应结合完整路径匹配: 4. 安全过滤函数示例 总结 Sa-Token框架在URL过滤机制中存在因分号处理不当导致的权限绕过风险。开发者应: 更新至最新安全版本 增强路径过滤函数,包含分号及其编码的检测 对请求路径进行规范化处理 审慎配置权限规则,避免仅依赖后缀匹配 通过以上措施,可有效防范此类URL过滤不全导致的安全风险。