Undertow URL解析特性及其安全问题
字数 1378 2025-08-25 22:59:03

Undertow URL解析特性及其安全风险分析

一、概述

本文详细分析Undertow Web容器在处理包含特殊字符(如分号)的URL时的解析特性,以及与Tomcat的差异,揭示由此可能引发的安全风险。

二、问题背景

发现一个未授权访问漏洞案例:

  • 攻击者使用URL:http://www.xxx.com/admin/..;/index.action
  • 正常URL应为:http://www.xxx.com/admin/index.action

环境:Undertow + Spring Boot

三、技术原理分析

1. Tomcat URL解析机制

Tomcat处理/..;/这类URL时:

  1. /..;/识别为根目录
  2. 解析过程:
    • CoyoteAdapter.service()接收原始请求
    • postParseRequest()处理请求/响应
    • parsePathParameters()处理分号路径参数(如/path;name=value)
    • normalize()标准化URI,处理/../等特殊字符

示例:

  • 输入:/admin/..;/index.action
  • 处理后:/index.action

2. Undertow URL解析机制

Undertow处理方式与Tomcat不同:

  1. HttpRequestParser.handlePath()中:
    • 以分号为分隔符拆分URL
    • 前半部分存入exchange对象
    • 后半部分作为参数处理
  2. Filter链构造:
    • 基于分号前的路径匹配Filter
    • Controller基于分号后的路径路由

关键差异:

  • Filter匹配分号前的路径(如/admin/..)
  • Controller匹配分号后的路径(如/index.action)

四、安全风险分析

1. 风险场景

URL示例:http://127.0.0.1/admin/..;/admin/index.action

可能存在的安全问题:

  1. Filter鉴权逻辑检测/admin/*.action并跳转登录页
  2. Controller路由检测/admin/index.action跳转后台主页
  3. Undertow环境下:
    • Filter无法匹配/admin/..
    • Controller匹配/admin/index.action
    • 导致未授权访问

2. 根本原因

URL解析不一致:

  • Filter和Controller对同一URL的解析结果不同
  • 鉴权逻辑与实际路由逻辑分离

五、解决方案

  1. 获取完整请求路径鉴权

    • 在Undertow环境下,应获取完整URL进行鉴权
    • 避免仅依赖部分路径判断
  2. 统一解析逻辑

    • 确保安全控制层与实际路由层使用相同的URL解析方式
  3. 输入验证

    • 对URL中的特殊字符(如分号)进行严格验证
    • 拒绝包含可疑字符的请求

六、总结

  1. 这不是一个漏洞,而是Web容器的解析特性差异
  2. Undertow和Tomcat对分号的处理方式不同:
    • Tomcat:删除分号并标准化路径
    • Undertow:分号前后分别处理
  3. 使用不当会导致安全控制被绕过
  4. 建议在Undertow环境下采用更严格的URL处理方式

七、参考文献

  1. Tomcat URL解析漏洞分析
  2. Undertow与Tomcat对比
  3. Spring URL处理机制
Undertow URL解析特性及其安全风险分析 一、概述 本文详细分析Undertow Web容器在处理包含特殊字符(如分号)的URL时的解析特性,以及与Tomcat的差异,揭示由此可能引发的安全风险。 二、问题背景 发现一个未授权访问漏洞案例: 攻击者使用URL: http://www.xxx.com/admin/..;/index.action 正常URL应为: http://www.xxx.com/admin/index.action 环境:Undertow + Spring Boot 三、技术原理分析 1. Tomcat URL解析机制 Tomcat处理 /..;/ 这类URL时: 将 /..;/ 识别为根目录 解析过程: CoyoteAdapter.service() 接收原始请求 postParseRequest() 处理请求/响应 parsePathParameters() 处理分号路径参数(如 /path;name=value ) normalize() 标准化URI,处理 /../ 等特殊字符 示例: 输入: /admin/..;/index.action 处理后: /index.action 2. Undertow URL解析机制 Undertow处理方式与Tomcat不同: 在 HttpRequestParser.handlePath() 中: 以分号为分隔符拆分URL 前半部分存入exchange对象 后半部分作为参数处理 Filter链构造: 基于分号前的路径匹配Filter Controller基于分号后的路径路由 关键差异: Filter匹配分号前的路径(如 /admin/.. ) Controller匹配分号后的路径(如 /index.action ) 四、安全风险分析 1. 风险场景 URL示例: http://127.0.0.1/admin/..;/admin/index.action 可能存在的安全问题: Filter鉴权逻辑检测 /admin/*.action 并跳转登录页 Controller路由检测 /admin/index.action 跳转后台主页 Undertow环境下: Filter无法匹配 /admin/.. Controller匹配 /admin/index.action 导致未授权访问 2. 根本原因 URL解析不一致: Filter和Controller对同一URL的解析结果不同 鉴权逻辑与实际路由逻辑分离 五、解决方案 获取完整请求路径鉴权 : 在Undertow环境下,应获取完整URL进行鉴权 避免仅依赖部分路径判断 统一解析逻辑 : 确保安全控制层与实际路由层使用相同的URL解析方式 输入验证 : 对URL中的特殊字符(如分号)进行严格验证 拒绝包含可疑字符的请求 六、总结 这不是一个漏洞,而是Web容器的解析特性差异 Undertow和Tomcat对分号的处理方式不同: Tomcat:删除分号并标准化路径 Undertow:分号前后分别处理 使用不当会导致安全控制被绕过 建议在Undertow环境下采用更严格的URL处理方式 七、参考文献 Tomcat URL解析漏洞分析 Undertow与Tomcat对比 Spring URL处理机制