闲来无事看了看FiF口语中一些Task的排行榜,翻着翻着意外发现了一个101分的榜首,按理来说满分才只有100分,因此猜想这个分数一定是被动过手脚的,于是来了兴致,从POST请求与APK反编译两个角度分别尝试破解FiF。
方案一:APK反编译
将FiF的apk文件拖入AndroidKiller,发现加载失败,于是拖入jadx,发现原来上了奇虎的加固壳,考虑到只是把玩娱乐,脱壳会大大增加复杂性,于是暂时放弃反编译的想法。
方案二:POST请求拦截
0x01 配置Fiddler
因为自从用了新电脑就没有抓过包了,因此还是要做一些配置的。Java Jdk和环境变量的配置工作在此掠过了,但考虑到这次Fiddler的配置过程还有点不同寻常,所以这里做一下记录。
运行Fiddler提示8888端口被占用了,询问是否随机取端口。考虑到不使用8888可能后面会造成一些不必要的麻烦,于是打开cmd输入netstat -ano|findstr “8888”,发现原来端口被PID为20348的应用占用了,打开任务管理器的详细信息选卡,发现是Matlab,于是结束进程。
随后重启Fiddler,发现没有端口占用提示了。再次查看8888端口的状态,可以看到这个端口已经成功被Fiddler监听。接下来在手机浏览器访问“IP:8888”,安装Fiddler证书即可,IP可通过控制台ipconfig指令查看。至此环境配置结束。
0x02 POST请求拦截
手机端对应设置好HTTP代理后,打开FiF,发现Fiddler这边的请求很杂乱,这是因为电脑和手机上所有的网络请求都被显示了,于是配置过滤器,只显示抓取Host为m.oral.fifedu.com的请求,同时通过命令bpc:m.oral.fifedu.com来设置请求断点。随便进入一个Task,这里我进的是四级口语模拟题2的Task1。随便读两句。
随后提交,在Fiddler上可以看到请求已经被拦截下来了,
对应在右侧的WebForms中可以看到对应的jasonobject:
{
"recordPath" : "2811000026000000971\/cc253a5178c44088b736bcb9386f324e\/e7ba561752f34de683f6435e47ced8f6\/t\/0_0.mp3",
"score" : "0",
"ansDetail" : "word#0",
"learn_time" : "2",
"questionId" : "e7ba561752f34de683f6435e47ced8f6#0#0",
"accuracy" : "0",
"fluency" : "0",
"complete" : "0"
}
]
显然score代表的就是分数,我们将其修改为101,在Fiddler中单击Run To Completion放行修改过的请求,手机端对应有了相应,提示挑战失败,但我们返回列表并刷新,发现实际上数据已经上传成功并在排行榜上显示了。至此FiF口语的刷分就顺利实现了。
0x03 小结
FiF口语虽然对应用加壳处理了,但是却忘记了对网络请求进行安全加固,导致了刷分的可行性。希望FiF口语官方对请求参数进行加密或组合加密,或利用sign值算法验证请求的合法性,尽快更新应用并修复此漏洞。