🧾 后端笑传之传参避:两天在学习网站从 F12 到绩点巅峰
本文内容纯属虚构,仅为我练习 Java Web 开发时产出的习作。本文所述的人物、网站和逆向内容在互联网上均不存在,引用的 AIGC 内容均已标注。本文作者支持知识付费,未侵犯任何人的知识产权。
本文封面使用 AI 生成。
✨ 背景
Alice 最近总是搞不懂课业上的一些问题,很是苦恼。一天,Bob 刷到了一个学习网站,便推荐给 Alice。根据宣传,该网站上不仅有大量的免费学习资源,花“三十九块九”开通会员,更是可以观看更多的课程、享受名师在线答疑解惑等服务。

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

打开 F12 开发者工具,发现该网站的后端使用 Java 开发,前后端通信使用 DWR 库和 JSON RPC。
由于函数名均写得简洁明了,结合响应内容,很容易发现 getOpenQuizPaperDto.rpc
为获取测验题目信息的 API。可手动调用该 API,却发现 answer
为 null
,根本看不到正确答案。
简单浏览该网站并进行几次测验后,发现该网站的测验模块中,其它 API 经常使用 tid
和 aid
两个参数,进行几次同样的测验后,tid
不变,而 aid
变了。所以,我猜测 tid
为试卷 ID,aid
为用户提交的 ID。
更换 Bob 的账号,在开发者工具中调用相同的 API,填入 Alice 测验时的 tid
和 aid
,果然,对比之前的响应,answer
变为了 true
和 false
,拿到了单选题的正确答案。🎉

⚒️ 进阶
第二天,Alice 发现她的课学得太差,且她又是免费用户,老师根本不愿意回答她的问题。于是她起了歪脑筋,想提前获取测验的答案,以答个高分,吸引老师的注意力。
然而,测验的题目是从题库中随机抽取的,每个用户抽到的题目都不一样,以 Alice 可怜的人脉,根本不可能找足够多的人看答案。
于是,她让 AI 写了个脚本,用小号反复提交相同的测验,刷出一大堆不同的 aid
以尽可能多地覆盖题库,之后再找 Bob 借会员账号,用那些 aid
调用之前所述的 API,果真拿到了题库中大部分题的正确答案。在这之后,她便动起了歪脑筋,打开了新世界的大门。

该网站中所有涉及到在线答题的模块(如测验、作业、考试等)都使用 tid
和 aid
两个参数,即使调用方式不同,但也万变不离其宗。比如在作业模块中,使用 DWR 调用,tid
和 aid
分别对应 param0
和 param1
,照样可以提前拿到答案。
在尝到利用漏洞的甜头后,Alice 爬下了整门课程的答案,甚至包括一个学员只能提交一次的结课总评,她也开了七八个小号去拼凑题库。最终,她靠着排名第一的“成绩”在所有学员中“脱颖而出”,经过数次答疑解惑,终于在学校的课程中,拿到了很高的绩点。
🤔 反思
本文的内容虽为虚构,但源于真实案例。
近一年随着 Cursor 等 AI 辅助开发工具的流行,编程门槛大幅降低,即便毫无基础的普通人,也能在短短几天内完成网站开发并顺利上线。这些工具在带来便捷与效率的同时,也衍生出一系列不容忽视的问题。部分开发者过度依赖 AI 生成代码,却缺乏对代码逻辑的深度理解与安全审查,从而闹出了本文所参考案例中的安全笑话。
在设计网站后端 API 时,一定要做好鉴权,判断好用户的输入是否合理合规,进行好安全测试。
不要让知识付费失去了付费的意义,让学习网站失去了学习的本质。