记一次在线培训系统的逆向破解

来由

单位需要对职工专业学习情况进行考核,故找了个部署在内网上的培训和考核系统,该系统支持批量导入题库和智能批卷,但是限制了最大用户数,超过数量需要收取额外费用,熟悉的工作又来了,那试下破解吧。

小窥

先看下网站架构,老框架thinkPhP+Mysql+Apache,既然代码逻辑在PhP里,那大概率能破
哪里出问题就整哪里,来到添加用户页面,填好信息点击添加用户,提示超出最大用户数量

打开F12看发了个啥包,路由就是这么个路由userCtl.php?a=userAddUser,返回值maxRegNum,那判断最大用户数的逻辑就在这里面了,要改的就是它

还是完整过一遍吧,先确定当前页面对应的本地路径,按照thinkPhP的路由规则,定位到了\view\tpl\admin\user\userCtl下的userAddUser.tpl.php,打开看一下,嗯就是它了

看一下"点击保存"以后干了啥,哦这个文件里没有相关处理的方法,那应该在js里,根据id=save来调用方法

于是找到了js的路径\view\js\admin\user\userAdd.js,果然有对id=save点击方法的定义,前面这些都是前端对输入字段的校验

接着往下看,收集到前端各个字段后,对后端userCtl.php?a=userAddUser发出了请求,并设置回调函数addUserOk

看下回调函数,请求的返回值若为maxRegNum,则弹窗“注册人数已打最大值”

分析完毕,所有线索均指向userCtl.php?a=userAddUser,目标是修改该路由对应的后端代码,绕过校验逻辑,让其不要返回maxRegNum

开工

根据路由定位到了\admin\user\userCtl.php文件,打开一看,哦豁加密了

那还得先解密才能修改代码,首先想法是在网站目录里查找自带的解密程序(因为肯定只有先解密,这个PhP才能正常跑起来),扫了一眼网站的目录结构,没发现什么二进制程序,想了以下后端运行的流程:请求打到PhP路径后,由php-cgi直接把php代码跑起来,也没经过什么中间解密层,php-cgi应该也是原生的不会有啥解密功能,那解密大概率就在php页面本身里了,再回头一看,这个页面第一行不是明文么,肯定是会先执行的,扫了眼大概是加载了一个ionCube的插件,难道是这个插件做了解密工作?
网上一搜,果然ionCube是一套对PhP进行加密/解密的商业工具,并且已经集成到了PhP扩展里

然后搜索ionCube的解密方法,找到了两个靠谱的在线解密网站(ipkEasyToYou),试用了下两者皆可解密,完整解密的话后者10欧元/10天

前者1元/次,故梭哈

成功获取完整解密代码

直接定位maxRegNum,就在这个if语句里对超出用户数量的情形进行了判断,就是从数据库里取出现有用户数量然后和getLicenseInfo(也就是数据库中保存的准许的用户数量)进行比较,超过就exit

看了下直接跳过这个判断逻辑,后面的代码就会把注册用户当成正常用户进行处理,看起来也没啥问题,那我们直接注释掉这个if分支吧
本来想将修改后的代码重新加密再上传的,但发现这个商用的ionCube加密软件挺贵的,那就直接用明文上传覆盖吧,反正第一行不加载ionCube插件就可以了,就当做一个正常的PHP代码运行
上传覆盖后,重新注册用户,即可绕过校验,后续功能也正常

后记

继一个月前用WebSocket写了套海康威视的门禁代码,给单位省了一笔工程经费后,又搞了个免费的在线培训系统,啥时候组织能拿出计划经费里的一小部分,稍微补贴一下卑微的我呢-。-(可怜)

posted @ 2024-07-05 21:40  z5onk0  阅读(37)  评论(0编辑  收藏  举报