JetBrains TeamCity 鉴权绕过浅析
字数 2305 2025-08-23 18:31:24

JetBrains TeamCity 鉴权绕过漏洞分析与利用教学文档

1. CVE-2023-42793 漏洞分析

1.1 漏洞概述

CVE-2023-42793 是 JetBrains TeamCity 中的一个鉴权绕过漏洞,允许攻击者绕过身份验证机制获取管理员权限。

1.2 影响版本

漏洞影响 TeamCity 多个版本,具体补丁前的版本均受影响。

1.3 漏洞原理

1.3.1 补丁分析

补丁主要针对 RequestInterceptors 类进行修改:

  • 通过反射在 myPreHandlingDisabled 字段添加了一个路由 /RPC2
  • myPreHandlingDisabledmyMatchingPaths 字段中移除了所有匹配 /**/RPC2 的路径

1.3.2 代码审计

漏洞根源在于 RequestInterceptors 类的处理逻辑:

  1. 请求处理时首先执行 preHandle 方法
  2. 如果 requestPreHandlingAllowed 返回 false 则直接放行请求
  3. 检查访问的是否为 JSP 页面
  4. 使用 myPreHandlingDisabled 字段进行路径匹配
  5. 类初始化时创建并添加了 /**/RPC2 路径到 myPreHandlingDisabled 字段
  6. /RPC 为后缀的 URL 不会被鉴权

1.3.3 关键利用点

jetbrains.buildServer.server.rest.request.UserRequest#createToken 方法:

  • 可以通过 path 变量创建 token
  • 用户可通过 userLocator 指定(admin 默认为 id:1)
  • 将 name 位置设置为 RPC2 即可绕过鉴权

1.4 漏洞复现

利用步骤:

  1. 获取 admin token:

    • 利用 /RPC2 路径绕过鉴权
    • 调用 createToken 方法创建管理员 token
  2. RCE 实现:

    • 使用获取的 admin token 开启 debug API
    • 触发配置重载过程中的 RCE
    • 去掉 Content-Type 字段实现 RCE

2. CVE-2024-27198 漏洞分析

2.1 漏洞概述

CVE-2024-27198 是另一个 TeamCity 的鉴权绕过漏洞,通过特殊构造的请求绕过授权检查。

2.2 漏洞原理

2.2.1 请求分发机制

TeamCity 业务请求分发位于 jetbrains.buildServer.controllers.BaseController

  • 正常授权请求会被重定向到 /unauthorized.html
  • 不存在的 URI 会导致 404 错误,由 PageNotFoundController 处理

2.2.2 关键代码分析

  1. updateViewIfRequestHasJspParameter 方法:

    • 获取外部参数 getJspFromRequest
    • 如果 .jsp 结尾或不包含 admin/ 则不会返回 null
    • 如果与默认视图名 404.jsp 不同则设置为最终返回内容
  2. 视图渲染过程:

    • DispatcherServlet#resolveViewName 得到 JstlView 类型视图
    • 对 JSP 文件视图会进行 dispatch 处理
    • ApplicationContext#getRequestDispatcher 会去除 ; 及之后的部分

2.2.3 鉴权绕过原理

  1. 拦截器 RequestInterceptors#preHandle 只在请求栈大小为 1 时起作用
  2. 请求不存在的 URI 时始终返回 true
  3. 通过控制视图名实现二次 dispatch 请求绕过鉴权

2.3 漏洞利用

2.3.1 获取管理员 token

构造 payload:

curl --noproxy '*' -ik "http://127.0.0.1:8111/xxxx?jsp=/app/rest/users/id:1/tokens/racerz;.jsp" -X POST

2.3.2 利用流程

  1. 构造不存在的 URI 请求
  2. 通过 jsp 参数控制视图名
  3. 利用分号截断和视图渲染机制
  4. 最终请求目标授权端点

3. 漏洞总结

3.1 根本原因

  1. Spring 框架支持通过配置 location 响应错误页面
  2. TeamCity 鉴权未处理嵌套请求
  3. 视图名可控导致可以覆盖默认配置
  4. 通过特殊构造的请求实现二次 dispatch

3.2 防御建议

  1. 及时更新到最新版本
  2. 限制外部输入的视图名参数
  3. 加强嵌套请求的鉴权检查
  4. 对特殊字符进行严格过滤

4. 参考资源

  1. [CVE-2023-42793 JetBrains TeamCity 权限绕过 - Y4er的博客]
  2. [vulhub/teamcity/CVE-2023-42793/README.zh-cn.md]
  3. [Source Code at Risk: Critical Code Vulnerability in CI/CD Platform TeamCity | Sonar]
  4. [JetBrains TeamCity RCE - CVE-2023-42793 (projectdiscovery.io)]
  5. [CVE-2024-27198 and CVE-2024-27199: JetBrains TeamCity Multiple Authentication Bypass Vulnerabilities | Rapid7 Blog]
  6. [Spring Framework Exception Handling Documentation]
JetBrains TeamCity 鉴权绕过漏洞分析与利用教学文档 1. CVE-2023-42793 漏洞分析 1.1 漏洞概述 CVE-2023-42793 是 JetBrains TeamCity 中的一个鉴权绕过漏洞,允许攻击者绕过身份验证机制获取管理员权限。 1.2 影响版本 漏洞影响 TeamCity 多个版本,具体补丁前的版本均受影响。 1.3 漏洞原理 1.3.1 补丁分析 补丁主要针对 RequestInterceptors 类进行修改: 通过反射在 myPreHandlingDisabled 字段添加了一个路由 /RPC2 在 myPreHandlingDisabled 的 myMatchingPaths 字段中移除了所有匹配 /**/RPC2 的路径 1.3.2 代码审计 漏洞根源在于 RequestInterceptors 类的处理逻辑: 请求处理时首先执行 preHandle 方法 如果 requestPreHandlingAllowed 返回 false 则直接放行请求 检查访问的是否为 JSP 页面 使用 myPreHandlingDisabled 字段进行路径匹配 类初始化时创建并添加了 /**/RPC2 路径到 myPreHandlingDisabled 字段 以 /RPC 为后缀的 URL 不会被鉴权 1.3.3 关键利用点 jetbrains.buildServer.server.rest.request.UserRequest#createToken 方法: 可以通过 path 变量创建 token 用户可通过 userLocator 指定(admin 默认为 id:1) 将 name 位置设置为 RPC2 即可绕过鉴权 1.4 漏洞复现 利用步骤: 获取 admin token: 利用 /RPC2 路径绕过鉴权 调用 createToken 方法创建管理员 token RCE 实现: 使用获取的 admin token 开启 debug API 触发配置重载过程中的 RCE 去掉 Content-Type 字段实现 RCE 2. CVE-2024-27198 漏洞分析 2.1 漏洞概述 CVE-2024-27198 是另一个 TeamCity 的鉴权绕过漏洞,通过特殊构造的请求绕过授权检查。 2.2 漏洞原理 2.2.1 请求分发机制 TeamCity 业务请求分发位于 jetbrains.buildServer.controllers.BaseController : 正常授权请求会被重定向到 /unauthorized.html 不存在的 URI 会导致 404 错误,由 PageNotFoundController 处理 2.2.2 关键代码分析 updateViewIfRequestHasJspParameter 方法: 获取外部参数 getJspFromRequest 如果 .jsp 结尾或不包含 admin/ 则不会返回 null 如果与默认视图名 404.jsp 不同则设置为最终返回内容 视图渲染过程: DispatcherServlet#resolveViewName 得到 JstlView 类型视图 对 JSP 文件视图会进行 dispatch 处理 ApplicationContext#getRequestDispatcher 会去除 ; 及之后的部分 2.2.3 鉴权绕过原理 拦截器 RequestInterceptors#preHandle 只在请求栈大小为 1 时起作用 请求不存在的 URI 时始终返回 true 通过控制视图名实现二次 dispatch 请求绕过鉴权 2.3 漏洞利用 2.3.1 获取管理员 token 构造 payload: 2.3.2 利用流程 构造不存在的 URI 请求 通过 jsp 参数控制视图名 利用分号截断和视图渲染机制 最终请求目标授权端点 3. 漏洞总结 3.1 根本原因 Spring 框架支持通过配置 location 响应错误页面 TeamCity 鉴权未处理嵌套请求 视图名可控导致可以覆盖默认配置 通过特殊构造的请求实现二次 dispatch 3.2 防御建议 及时更新到最新版本 限制外部输入的视图名参数 加强嵌套请求的鉴权检查 对特殊字符进行严格过滤 4. 参考资源 [ CVE-2023-42793 JetBrains TeamCity 权限绕过 - Y4er的博客 ] [ vulhub/teamcity/CVE-2023-42793/README.zh-cn.md ] [ Source Code at Risk: Critical Code Vulnerability in CI/CD Platform TeamCity | Sonar ] [ JetBrains TeamCity RCE - CVE-2023-42793 (projectdiscovery.io) ] [ CVE-2024-27198 and CVE-2024-27199: JetBrains TeamCity Multiple Authentication Bypass Vulnerabilities | Rapid7 Blog ] [ Spring Framework Exception Handling Documentation ]