某站点业务漏洞分析

image.pngimage.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:登录可见视频。未登录弹出登录弹窗,阻止页面跳转。
  • 校验通过后

    1. 使用localStorage在浏览器本地记录已观看视频ID,仅本机生效,不上传服务端
    2. 跳转视频详情页:/index/video/info.html&id=视频id
测试:控制台重写goDetail函数,强制设置is_vip=1,可以绕过列表页前端弹窗,成功进入视频详情页面。
⚠️注意:仅绕过前端UI拦截,无法从后端拿到合法播放地址

2. 详情页:播放按钮逻辑分析

页面播放按钮 id="do_play_1" / id="do_play_2",点击触发播放逻辑。
全局变量 is_viplogin_status,由后端页面渲染注入;控制台可直接修改 is_vip=1 绕过详情页播放按钮的VIP弹窗。
video_url:存储后端返回携带sign&t参数的m3u8完整地址,该变量由后端接口输出,前端无法伪造。

到此可以确认:真正的会员权限校验发生在后端,前端两处校验均仅为体验层阻拦。

3. m3u8防盗链签名测试

会员账号播放VIP视频,获取m3u8示例:

index.m3u8?sign=bca3cbd98704c40ee65d0a40b4c9f00d&t=1787760320

测试现象

  1. 修改signt任意参数,服务端返回403,证明签名、时间戳校验逻辑生效,链接具备时效性。
  2. 将完整未修改的m3u8链接,复制到未登录、无会员的浏览器环境直接访问,可以完整播放付费VIP视频

漏洞根因

获取播放地址阶段:后端校验当前账号是否为VIP,校验通过签发带sign+t的m3u8链接。
资源请求阶段:服务端仅校验sign签名合法性与时间戳t是否过期,没有校验访问者用户身份,不复核请求方是否拥有该视频VIP权限

业务风险

等价于简易解析接口行为:
只需要一个有效的VIP账号获取有效期内的m3u8链接,拿到链接之后,任意人员均可在链接有效期内观看付费VIP内容。
对爬虫场景:维持一个VIP账号,不断拉取各个视频的m3u8链接,链接即可对外分发使用;链接到达t对应时间戳后自动失效。

总结

  1. 列表页、详情页两处JS权限判断全部属于前端防护,可被完全绕过,不能作为安全防线。
  2. 签名sign、时间戳t实现了防篡改、链接时效过期能力,但缺少用户身份绑定校验,属于失效的访问控制(BOLA)高危业务漏洞。
  3. 链接有过期时间,并非永久盗链,但有效期内泄露会直接造成付费内容泄露。
法律提示:仅允许在本人授权账号下进行安全学习测试,禁止批量抓取、传播不良视频链接,禁止对外搭建解析服务。