发布于 ,更新于 

🧾 后端笑传之传参避:两天在学习网站从 F12 到绩点巅峰

⚠️ 免责声明

本文内容纯属虚构,仅为我练习 Java Web 开发时产出的习作。本文所述的人物、网站和逆向内容在互联网上均不存在,引用的 AIGC 内容均已标注。本文作者支持知识付费,未侵犯任何人的知识产权。
本文封面使用 AI 生成。

✨ 背景

Alice 最近总是搞不懂课业上的一些问题,很是苦恼。一天,Bob 刷到了一个学习网站,便推荐给 Alice。根据宣传,该网站上不仅有大量的免费学习资源,花“三十九块九”开通会员,更是可以观看更多的课程、享受名师在线答疑解惑等服务。

随后,Alice 登录上这个网站,发现网站上的课程确实对她的学习很有帮助。可是,Alice 完成在线课程的随堂测验后,却发现她没有会员,看不到测验的答案和解析,实在是很苦恼。由于她最近换了一台“普通百姓都能买得起”的新手机,把生活费都花光了,实在是开不起这个“三十九块九”的会员。于是,她便研究起了这个学习网站。

🔍 初探

使用免费账号登录该学习网站,并且进行一次随堂测验,发现不开会员,确实根本不知道正确答案。

打开 F12 开发者工具,发现该网站的后端使用 Java 开发,前后端通信使用 DWR 库和 JSON RPC。
由于函数名均写得简洁明了,结合响应内容,很容易发现 getOpenQuizPaperDto.rpc 为获取测验题目信息的 API。可手动调用该 API,却发现 answernull,根本看不到正确答案。

简单浏览该网站并进行几次测验后,发现该网站的测验模块中,其它 API 经常使用 tidaid 两个参数,进行几次同样的测验后,tid 不变,而 aid 变了。所以,我猜测 tid 为试卷 ID,aid 为用户提交的 ID。

更换 Bob 的账号,在开发者工具中调用相同的 API,填入 Alice 测验时的 tidaid,果然,对比之前的响应,answer 变为了 truefalse,拿到了单选题的正确答案。🎉

⚒️ 进阶

第二天,Alice 发现她的课学得太差,且她又是免费用户,老师根本不愿意回答她的问题。于是她起了歪脑筋,想提前获取测验的答案,以答个高分,吸引老师的注意力。

然而,测验的题目是从题库中随机抽取的,每个用户抽到的题目都不一样,以 Alice 可怜的人脉,根本不可能找足够多的人看答案。

于是,她让 AI 写了个脚本,用小号反复提交相同的测验,刷出一大堆不同的 aid 以尽可能多地覆盖题库,之后再找 Bob 借会员账号,用那些 aid 调用之前所述的 API,果真拿到了题库中大部分题的正确答案。在这之后,她便动起了歪脑筋,打开了新世界的大门。

该网站中所有涉及到在线答题的模块(如测验、作业、考试等)都使用 tidaid 两个参数,即使调用方式不同,但也万变不离其宗。比如在作业模块中,使用 DWR 调用,tidaid 分别对应 param0param1,照样可以提前拿到答案。

在尝到利用漏洞的甜头后,Alice 爬下了整门课程的答案,甚至包括一个学员只能提交一次的结课总评,她也开了七八个小号去拼凑题库。最终,她靠着排名第一的“成绩”在所有学员中“脱颖而出”,经过数次答疑解惑,终于在学校的课程中,拿到了很高的绩点。

🤔 反思

本文的内容虽为虚构,但源于真实案例。

近一年随着 Cursor 等 AI 辅助开发工具的流行,编程门槛大幅降低,即便毫无基础的普通人,也能在短短几天内完成网站开发并顺利上线。这些工具在带来便捷与效率的同时,也衍生出一系列不容忽视的问题。部分开发者过度依赖 AI 生成代码,却缺乏对代码逻辑的深度理解与安全审查,从而闹出了本文所参考案例中的安全笑话。

在设计网站后端 API 时,一定要做好鉴权,判断好用户的输入是否合理合规,进行好安全测试。

不要让知识付费失去了付费的意义,让学习网站失去了学习的本质。