CSPT漏洞学习笔记
字数 2052 2025-08-30 06:50:27

客户端路径遍历(CSPT)漏洞全面解析与实战指南

0x00 漏洞概述

1. 漏洞定义

CSPT(Client-Side Path Traversal,客户端路径遍历)是一种安全漏洞,其核心在于攻击者可以通过操纵前端处理的路径逻辑,在URL中插入../等字符来篡改实际访问的路径。这种漏洞允许攻击者将请求重定向到其他API接口或触发未授权操作。

2. 漏洞影响范围

几乎所有前端输入点都可能存在CSPT漏洞,包括但不限于:

  • 查询参数(Query Parameters)
  • 路径参数(Path Parameters)
  • URL片段(Fragment Parameters)

3. 典型攻击示例

构造恶意链接:

https://api.target.com/api/data?id=1337/../../anotherEndpoint?details

当受害者访问此链接时,实际发送的请求会被篡改为:

https://api.target.com/api/anotherEndpoint

0x01 漏洞原理

1. 核心概念

CSPT漏洞利用可分为两部分:Source(源)和Sink(汇),与代码审计中的概念相似。

1.1 Source(源)

  • 在CSPT中,Source指触发HTTP请求的操作点
  • 是将前端输入映射到后续请求的关键点
  • 示例:根据前端传入的id值映射到不同的API请求

1.2 Sink(汇)

  • 在CSPT中,Sink指另一个具有相同权限的API接口
  • 决定了攻击者能够执行的操作和漏洞的危害程度
  • 示例:接收特定JSON数据的API端点

2. 漏洞危害

CSPT本身危害有限,但与其他漏洞结合可形成"组合拳":

  • 绕过CSRF防护措施(如随机数、SameSite属性等)
  • 实现未授权操作
  • 提升权限
  • 导致XSS攻击

0x02 靶场搭建

1. 环境准备

1.1 Node.js环境

推荐使用nvm管理Node版本:

# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 配置环境变量
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# 安装指定版本Node.js
nvm install 20.9.0
nvm use 20.9.0
nvm alias default 20.9.0

1.2 靶场项目

使用Doyensec提供的CSPTPlayground:

git clone https://github.com/doyensec/CSPTPlayground

2. 后端启动

  1. 使用Docker搭建MongoDB数据库
  2. 进入CSPTPlayground/backend/app目录
  3. 安装依赖(建议添加--no-audit参数)
  4. 启动后端服务

3. 前端启动

  1. 进入CSPTPlayground/frontend/app目录
  2. 安装依赖(建议使用代理或国内镜像源)
  3. 修改CSPTPlayground/frontend/app/src/config.js中的配置
  4. 启动前端服务

0x03 漏洞利用实战

1. CSPT2CSRF-POST

漏洞场景

  • 访问页面时自动向API发送/api/v1/notes/ID/seen请求
  • Note ID被映射到请求路径中

利用步骤

  1. 获取目标用户ID(如member用户的66fc8c17d29c4a98a44a4a87)
  2. 构造恶意链接:
    /vulnerable/note_auto_post_sink/../../sink/promote/lax_in_extra_param_promote/66fc8c17d29c4a98a44a4a87?
    
  3. 实际请求被转换为:
    /api/sink/promote/lax_in_extra_param_promote/66fc8c17d29c4a98a44a4a87?/see
    
  4. 诱导管理员访问此链接,实现权限提升

2. CSPT2CSRF-GET to POST

漏洞场景

  1. 首先发送GET请求获取Note详情
  2. 将响应中的_id用于构造后续请求路径

利用步骤

  1. 利用靶场提供的Gadget:
    /api/gadget/files/66fc8d071bcf0dd223467bba/raw
    
  2. 构造恶意链接重定向到Gadget:
    /vulnerable/note_auto_get_to_post_sink/../../gadget/files/66fc8d071bcf0dd223467bba/raw
    
  3. 响应中的_id被拼接为:
    /api/v1/notes/..api/sink/promote/lax_in_extra_param_promote/66fc8c17d29c4a98a44a4a87?/seen
    
  4. 实际触发管理员权限提升请求

替代方案

若缺乏可用Gadget,可利用URL跳转:

/api/gadget/open_redirect?url=恶意服务器地址

3. 1-click CSPT2CSRF: Path Param

漏洞场景

  1. 获取Note详情并将_id显示在页面上
  2. 用户操作(如点击Update按钮)时使用该ID构造请求

利用步骤

  1. 构造恶意链接:
    /vulnerable/note_path_param/../../gadget/files/66fc8d0755cf0db1bcfab29c/raw/details
    
  2. 诱导管理员访问并点击Update按钮
  3. 实际发送请求:
    /api/sink/promote/body_or_query?id=66fc8c17d29c4a98a44a4a87
    
  4. 实现权限提升(PUT请求)

4. 1-click CSPT2CSRF: Query Param

原理与Path Param类似,只是参数位置不同。

5. 1-click CSPT2CSRF: Fragment Param

原理与前述相同,使用URL片段传递参数。

6. CSPT2XSS: Query Param - innerHTML

漏洞场景

  1. 获取Note详情并直接写入页面
  2. 未对内容进行适当转义

利用步骤

  1. 通过CSPT篡改响应内容
  2. 注入恶意脚本实现XSS
  3. 或通过URL重定向到恶意服务器获取XSS载荷

0x04 防御措施

1. 输入验证

  • 对所有用户输入进行严格验证
  • 过滤../等路径遍历字符
  • 使用白名单验证输入格式

2. 路径处理

  • 避免前端处理敏感路径逻辑
  • 在后端规范化和验证完整路径
  • 使用绝对路径而非相对路径

3. 权限控制

  • 实施最小权限原则
  • 对敏感操作进行二次验证
  • 使用CSRF Token等机制

4. 安全开发

  • 避免将用户输入直接映射到API路径
  • 对动态生成的请求进行完整性检查
  • 实施内容安全策略(CSP)

0x05 参考资源

  1. Netragard - Saving CSRF: Client Side Path Traversal to the Rescue
  2. Doyensec CSPT2CSRF Whitepaper
  3. PayloadsAllTheThings - Client Side Path Traversal
  4. CSPT Burp Extension
客户端路径遍历(CSPT)漏洞全面解析与实战指南 0x00 漏洞概述 1. 漏洞定义 CSPT(Client-Side Path Traversal,客户端路径遍历)是一种安全漏洞,其核心在于攻击者可以通过操纵前端处理的路径逻辑,在URL中插入 ../ 等字符来篡改实际访问的路径。这种漏洞允许攻击者将请求重定向到其他API接口或触发未授权操作。 2. 漏洞影响范围 几乎所有前端输入点都可能存在CSPT漏洞,包括但不限于: 查询参数(Query Parameters) 路径参数(Path Parameters) URL片段(Fragment Parameters) 3. 典型攻击示例 构造恶意链接: 当受害者访问此链接时,实际发送的请求会被篡改为: 0x01 漏洞原理 1. 核心概念 CSPT漏洞利用可分为两部分:Source(源)和Sink(汇),与代码审计中的概念相似。 1.1 Source(源) 在CSPT中,Source指触发HTTP请求的操作点 是将前端输入映射到后续请求的关键点 示例:根据前端传入的id值映射到不同的API请求 1.2 Sink(汇) 在CSPT中,Sink指另一个具有相同权限的API接口 决定了攻击者能够执行的操作和漏洞的危害程度 示例:接收特定JSON数据的API端点 2. 漏洞危害 CSPT本身危害有限,但与其他漏洞结合可形成"组合拳": 绕过CSRF防护措施(如随机数、SameSite属性等) 实现未授权操作 提升权限 导致XSS攻击 0x02 靶场搭建 1. 环境准备 1.1 Node.js环境 推荐使用nvm管理Node版本: 1.2 靶场项目 使用Doyensec提供的CSPTPlayground: 2. 后端启动 使用Docker搭建MongoDB数据库 进入 CSPTPlayground/backend/app 目录 安装依赖(建议添加 --no-audit 参数) 启动后端服务 3. 前端启动 进入 CSPTPlayground/frontend/app 目录 安装依赖(建议使用代理或国内镜像源) 修改 CSPTPlayground/frontend/app/src/config.js 中的配置 启动前端服务 0x03 漏洞利用实战 1. CSPT2CSRF-POST 漏洞场景 访问页面时自动向API发送 /api/v1/notes/ID/seen 请求 Note ID被映射到请求路径中 利用步骤 获取目标用户ID(如member用户的 66fc8c17d29c4a98a44a4a87 ) 构造恶意链接: 实际请求被转换为: 诱导管理员访问此链接,实现权限提升 2. CSPT2CSRF-GET to POST 漏洞场景 首先发送GET请求获取Note详情 将响应中的 _id 用于构造后续请求路径 利用步骤 利用靶场提供的Gadget: 构造恶意链接重定向到Gadget: 响应中的 _id 被拼接为: 实际触发管理员权限提升请求 替代方案 若缺乏可用Gadget,可利用URL跳转: 3. 1-click CSPT2CSRF: Path Param 漏洞场景 获取Note详情并将 _id 显示在页面上 用户操作(如点击Update按钮)时使用该ID构造请求 利用步骤 构造恶意链接: 诱导管理员访问并点击Update按钮 实际发送请求: 实现权限提升(PUT请求) 4. 1-click CSPT2CSRF: Query Param 原理与Path Param类似,只是参数位置不同。 5. 1-click CSPT2CSRF: Fragment Param 原理与前述相同,使用URL片段传递参数。 6. CSPT2XSS: Query Param - innerHTML 漏洞场景 获取Note详情并直接写入页面 未对内容进行适当转义 利用步骤 通过CSPT篡改响应内容 注入恶意脚本实现XSS 或通过URL重定向到恶意服务器获取XSS载荷 0x04 防御措施 1. 输入验证 对所有用户输入进行严格验证 过滤 ../ 等路径遍历字符 使用白名单验证输入格式 2. 路径处理 避免前端处理敏感路径逻辑 在后端规范化和验证完整路径 使用绝对路径而非相对路径 3. 权限控制 实施最小权限原则 对敏感操作进行二次验证 使用CSRF Token等机制 4. 安全开发 避免将用户输入直接映射到API路径 对动态生成的请求进行完整性检查 实施内容安全策略(CSP) 0x05 参考资源 Netragard - Saving CSRF: Client Side Path Traversal to the Rescue Doyensec CSPT2CSRF Whitepaper PayloadsAllTheThings - Client Side Path Traversal CSPT Burp Extension