1. 从一次“不甘心”的付费说起
前几天我正闲得发慌,在几个常看的在线教育平台上瞎逛。说实话,挖洞挖久了,有时候就跟钓鱼似的,半天没个动静,心里就有点空落落的。那天也是,在各种测试环境里“fuzz”来“fuzz”去,净是些边边角角的小问题,要么就是逻辑复杂到让人头秃的硬骨头,啃不动。正打算关电脑摸鱼,手一滑,点进了一个看起来挺正经的课程平台。
界面做得挺漂亮,课程分类也全,但一眼扫过去,好家伙,十门课里有八门都挂着“付费”的小标签。职业病犯了,顺手就按了F12,切到“网络”(Network)标签页,然后点开一门免费课试听。浏览器里刷刷地开始加载,网络请求列表里也跳出来一堆条目。我一眼就盯上了一个返回数据特别长的接口,点开一看,响应体里有个 data 字段,里面是一串看起来像是经过编码的地址。把这个地址复制到新标签页一打开,果然,视频流开始播放了。过程简单得让我有点意外。
好奇心起来了,我又点开一门标价几十块的付费课程。同样操作,F12打开,点击试听。网络请求照样发,但之前那个返回 data 地址的接口,这次返回的内容却空空如也,或者直接返回错误码。更关键的是,我注意到这次请求的 Headers 或者 Payload 里,多了一个之前免费课程请求里没有的参数——sign。这个词在安全圈里太常见了,通常就是服务器用来验证请求合法性、防止篡改的一串加密字符串。看来,这就是免费和付费之间的“门禁”了。
当时心里就一个念头:这“门禁”是纸糊的还是铁打的?我花这几十块钱,是单纯为了买课,还是能顺便买到一个有趣的“案例分析”机会?纠结了大概三分钟,主要是心疼钱,但最终还是那点技术人的“不甘心”占了上风。得,这杯奶茶钱省了,买它一门课!
2. 寻找免费与付费的“分水岭”
钱付了,课到手了,真正的“工作”才开始。我的目标很明确:找出免费请求和付费请求到底差在哪,尤其是那个关键的 sign 参数是怎么算出来的。
我重新打开浏览器开发者工具,并确保“保留日志”(Preserve log)选项是勾选的,这样页面跳转或刷新时,之前的请求记录也不会消失。然后,我开了两个浏览器标签页,或者同一个页面里先后点开:
- 标签页A:我之前发现的那门免费课程。
- 标签页B:我刚花钱买的付费课程。
分别点击播放,然后像侦探对比现场照片一样,仔细比对两个标签页网络请求中,那个最关键的视频数据接口。
注意:这里一定要找对接口。很多时候一个页面会有很多异步请求,你要找的是那个真正返回核心数据(比如视频流地址、文件下载链接、关键文本内容)的接口,而不是什么加载图片、统计信息的杂项。
比对工作主要集中在两个地方:
- 请求参数(Payload):在“网络”标签页点击那个关键请求,查看“负载”(Payload)或“参数”(Params)选项卡。这里列出了所有随请求发送给服务器的数据。
- 请求头(Headers):尤其是“请求头”(Request Headers)部分,有时候
sign也可能放在这里,比如Authorization头或者自定义的X-Sign头。
通过仔细的“找不同”游戏,我很快发现了端倪。付费课程的请求里,除了免费课程也有的 courseId(课程ID)这类基础参数外,确实多了一组参数和一个 sign。这组多出来的参数名字看起来有点怪,像是缩写或者混淆过的,比如 xd、xid 之类的。而 sign 的值则是一长串毫无规律的字母数字组合,明显是某种哈希(如MD5、SHA)或加密(如AES)的结果。
那么,最直


413

被折叠的 条评论
为什么被折叠?



