实践起始:手痒和好奇心
天生就爱琢磨那些藏着掖着的东西。这几天我没事干,刷到了这个叫 Kanokov 的“秘密生活官网”,做得很是高大上,页面上写得神神秘秘的,但所有核心内容全都给你上了锁,想看?掏钱。
我看着那几个模糊得像打了马赛克的预览图,心里那个痒。这不是吊人胃口吗?我寻思着,既然是“官网”,那它跑的肯定就是标准的网络协议,只要是跑在网络上的东西,多少都会留下点脚印。我决定不花一分钱,进去“盗摄”一下,看看这秘密到底藏在哪里。
第一阶段:摸清底细,工具启动
第一步肯定都是老规矩。我打开电脑,启动浏览器,F12按下去,把开发者工具调出来。我盯住Network Tab,然后开始在页面上四处乱点,模拟用户行为,看看网站到底在后台发了些什么请求。这个站对前端做了很多混淆,JS代码看着跟乱码一样,让人头晕。但数据请求是骗不了人的。
我发现它每次加载一个内容模块的时候,都会向一个很固定的API地址发送请求,返回的是一串 JSON 数据。这些 JSON 里边,包含了内容的描述、标题,以及最关键的——预览图片的地址。
我复制了几个图片地址,直接在新的标签页里打开,结果毫无意外,服务器直接返回了403,权限不足。他们做了防盗链,而且对资源路径做了时间戳和Token校验,想直接拿链接跑路是行不通了。
第二阶段:深入挖掘,寻找服务器的失误
既然链接是动态加密的,那肯定有什么地方是写死的,服务器总要从硬盘上把文件取出来?我重新查看了那段 JSON 数据。
- 我观察了数据的结构,发现有一个字段叫 `content_id`,这个 ID 特别长,像是一串 UUID,但我又发现另一个字段叫 `internal_path_key`,它却很有规律。
- 这个 `internal_path_key` 的格式居然是“YYYYMMDD_编号”,看起来像是他们内部的文件命名或者存储路径的一部分。
我意识到,这可能是开发人员图省事,直接拿内部的文件名当做了查询关键词。如果我能猜到他们存储高清文件的路径规则,结合这个关键词,说不定就能绕过去。
第三阶段:构造路径,抓到漏洞
我锁定了预览图的链接。比如,预览图的地址是:`*/previews/20230510_045/*`。我心想如果存在一个低清的预览文件夹 `previews`,那有没有可能是为了给付费用户准备了另一个文件夹?
我开始暴力尝试,这是体力活。我换掉了 `previews` 这个词,尝试了以下几个变体:
- 尝试1: `*/source/20230510_045/*`(失败,404)
- 尝试2: `*/original/20230510_045/*4`(失败,404)
- 尝试3: 我把后面的文件名和扩展名全删了,只留路径。我尝试访问:`*/20230510_045/`
这回浏览器弹出了一个意想不到的东西:服务器返回了目录列表! 他们居然没有禁用目录浏览功能!
这下我彻底摸清楚了。他们的 CDN 服务器配置太草率了,虽然前面有程序在校验,但直接访问存储路径的时候,根本没有做权限判断。我一眼扫过去,目录列表里清清楚楚地躺着各种高清大图和原始视频文件,文件大小比预览图大几十倍。
实践收尾:松懈的防线
我顺手又多翻了几个目录,发现只要是知道那个内部 ID,就能直接进去翻箱倒柜。我花了一晚上时间,把我认为有意思的都“盗摄”了一遍,算是彻底满足了我的好奇心。
这事儿又证明了一个道理:再牛逼的公司,只要是人写的程序,总会有疏漏。他们把前端加密做得再复杂,把付费墙砌得再高,只要后端服务器的安全配置稍微一松懈,就等于是把后门钥匙直接挂在了墙上。搞这么神秘,结果防线这么粗糙,真是让人哭笑不得。
以后遇到这种越是要藏着掖着的东西,我更得去看看了。这回实践记录,完美收工。
技术不过关,代码太粗心,就是容易被人“窥探秘密”。