某站点业务漏洞分析
image.png整体流程
点击VIP视频 → 执行goDetail()函数做前端权限校验 → 校验通过跳转详情页/index/video/info.html → 详情页后端鉴权输出携带sign、t参数的m3u8播放地址 → 播放器加载m3u8资源播放视频。
1. 列表页:goDetail(t) 函数分析
触发时机:点击视频列表条目执行。
- 参数
t:被点击视频条目的DOM标签 - 读取DOM自定义属性:
data‑private(视频权限类型)、data‑id(视频编号) 权限逻辑
private=2:VIP专属视频。前端校验未登录则弹出登录弹窗;非VIP弹出开通VIP弹窗,阻止页面跳转。private=1:登录可见视频。未登录弹出登录弹窗,阻止页面跳转。
校验通过后
- 使用
localStorage在浏览器本地记录已观看视频ID,仅本机生效,不上传服务端。 - 跳转视频详情页:
/index/video/info.html&id=视频id
- 使用
测试:控制台重写goDetail函数,强制设置is_vip=1,可以绕过列表页前端弹窗,成功进入视频详情页面。
⚠️注意:仅绕过前端UI拦截,无法从后端拿到合法播放地址。
2. 详情页:播放按钮逻辑分析
页面播放按钮 id="do_play_1" / id="do_play_2",点击触发播放逻辑。
全局变量 is_vip、login_status,由后端页面渲染注入;控制台可直接修改 is_vip=1 绕过详情页播放按钮的VIP弹窗。video_url:存储后端返回携带sign&t参数的m3u8完整地址,该变量由后端接口输出,前端无法伪造。
到此可以确认:真正的会员权限校验发生在后端,前端两处校验均仅为体验层阻拦。
3. m3u8防盗链签名测试
会员账号播放VIP视频,获取m3u8示例:
index.m3u8?sign=bca3cbd98704c40ee65d0a40b4c9f00d&t=1787760320测试现象
- 修改
sign或t任意参数,服务端返回403,证明签名、时间戳校验逻辑生效,链接具备时效性。 - 将完整未修改的m3u8链接,复制到未登录、无会员的浏览器环境直接访问,可以完整播放付费VIP视频。
漏洞根因
获取播放地址阶段:后端校验当前账号是否为VIP,校验通过签发带sign+t的m3u8链接。
资源请求阶段:服务端仅校验sign签名合法性与时间戳t是否过期,没有校验访问者用户身份,不复核请求方是否拥有该视频VIP权限。
业务风险
等价于简易解析接口行为:
只需要一个有效的VIP账号获取有效期内的m3u8链接,拿到链接之后,任意人员均可在链接有效期内观看付费VIP内容。
对爬虫场景:维持一个VIP账号,不断拉取各个视频的m3u8链接,链接即可对外分发使用;链接到达t对应时间戳后自动失效。
总结
- 列表页、详情页两处JS权限判断全部属于前端防护,可被完全绕过,不能作为安全防线。
- 签名
sign、时间戳t实现了防篡改、链接时效过期能力,但缺少用户身份绑定校验,属于失效的访问控制(BOLA)高危业务漏洞。 - 链接有过期时间,并非永久盗链,但有效期内泄露会直接造成付费内容泄露。
法律提示:仅允许在本人授权账号下进行安全学习测试,禁止批量抓取、传播不良视频链接,禁止对外搭建解析服务。