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. 后端启动
- 使用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) - 构造恶意链接:
/vulnerable/note_auto_post_sink/../../sink/promote/lax_in_extra_param_promote/66fc8c17d29c4a98a44a4a87? - 实际请求被转换为:
/api/sink/promote/lax_in_extra_param_promote/66fc8c17d29c4a98a44a4a87?/see - 诱导管理员访问此链接,实现权限提升
2. CSPT2CSRF-GET to POST
漏洞场景
- 首先发送GET请求获取Note详情
- 将响应中的
_id用于构造后续请求路径
利用步骤
- 利用靶场提供的Gadget:
/api/gadget/files/66fc8d071bcf0dd223467bba/raw - 构造恶意链接重定向到Gadget:
/vulnerable/note_auto_get_to_post_sink/../../gadget/files/66fc8d071bcf0dd223467bba/raw - 响应中的
_id被拼接为:/api/v1/notes/..api/sink/promote/lax_in_extra_param_promote/66fc8c17d29c4a98a44a4a87?/seen - 实际触发管理员权限提升请求
替代方案
若缺乏可用Gadget,可利用URL跳转:
/api/gadget/open_redirect?url=恶意服务器地址
3. 1-click CSPT2CSRF: Path Param
漏洞场景
- 获取Note详情并将
_id显示在页面上 - 用户操作(如点击Update按钮)时使用该ID构造请求
利用步骤
- 构造恶意链接:
/vulnerable/note_path_param/../../gadget/files/66fc8d0755cf0db1bcfab29c/raw/details - 诱导管理员访问并点击Update按钮
- 实际发送请求:
/api/sink/promote/body_or_query?id=66fc8c17d29c4a98a44a4a87 - 实现权限提升(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)