之前写过图书馆预约抢座,那个时候虽然有加密参数,但是没有校验加密,就放在服务器上自动运行,但是突然有一天开始校验,导致有一天差点没地方学习
作为一个懒货和考研党,怎么可能忍?为了我宿舍里的儿子们不用早起蹲点抢位置,于是乎开始下面的逆向旅途
本人是个新手,虽然以前是web渗透的,但是对js逆向并不熟悉,如果有什么说的不对的地方请各位斧正
目标
学某通图书馆座位预约系统
每个学校不同可能参数也不同,下面是个样例
选座界面:
https://office.xxxx.com/front/third/apps/seatengine/select?id=xxxx&day=2023-06-03&backLevel=2&seatId=xxx
过程
打开选座界面,刚F12打开调试界面就发现有反调试,直接两个一律不在此处暂停
Pasted image 20230603184141.png (61.86 KB, 下载次数: 0)
下载附件
2023-6-3 22:33 上传
首先提交一次预约请求,很明显,以下请求就是这次逆向的主体
Pasted image 20230603183623.png (28.24 KB, 下载次数: 0)
下载附件
2023-6-3 22:33 上传
https://office.xxxx.com/data/apps/seatengine/submit?roomId=1901&startTime=18%3A30&endTime=19%3A00&day=2023-06-03&captcha=&seatNum=022&token=818a0f43a1a64bc98acb3f572fb64336&enc=4e66e0f4a1f3db313ad08288b9c379da
经过小小的测试,token在进入页面就自带,直接爬取网页源代码就可以获得,所以主要的目标是enc
首先通过xhr提取断点
Pasted image 20230603183950.png (53.85 KB, 下载次数: 0)
下载附件
2023-6-3 22:33 上传
当我们断上点了,准备在调用栈一层一层往前找参数来源
Pasted image 20230603185010.png (92.58 KB, 下载次数: 0)
下载附件
2023-6-3 22:33 上传
看到传递的参数,但还要往前找到来源
Pasted image 20230603223631.png (292.31 KB, 下载次数: 0)
下载附件
2023-6-3 22:36 上传
很明显这是混淆的一个函数,后面传的参数是所有其他参数字段,大概率enc就是来源于这里
Pasted image 20230603192628.png (96.65 KB, 下载次数: 0)
下载附件
2023-6-3 22:35 上传
找一下这个函数的来源,点击直接跳转
Pasted image 20230603193622.png (37.73 KB, 下载次数: 0)
下载附件
2023-6-3 22:35 上传
Pasted image 20230603193749.png (73.65 KB, 下载次数: 0)
下载附件
2023-6-3 22:37 上传
好家伙,往上一看,专门加密过了,还有个网址,作为一个小白,还真不知道这个加密,去网上仔细搜索了一波,发现还是挺流行的一个免费加密,看了几个解密的文章,看的头昏脑胀,作为一个懒货,自然是不可能直接开始从头解密的
Pasted image 20230603193825.png (50.16 KB, 下载次数: 0)
下载附件
2023-6-3 22:38 上传
接下来,就请出调试断点大法,当然猜也是必不可少的
由上面就知道_0x6d646b应该就是主要的加密函数,毕竟调用的就是这个函数,又从网上的解密文章得知,该版本加密特征分几段,最下面一段就是被加密的源代码,那么这里的代码从define开始就是被加密的源代码了
Pasted image 20230603195255.png (51.97 KB, 下载次数: 0)
下载附件
2023-6-3 22:38 上传
本人出身是物联网,后来自学web渗透,对js并不是很熟悉,还好最近AI崛起,我直接询问chatgpt,发现define(...这一句是下面需要引用库,控制台已查询,是md5库,不出意外是MD5
Pasted image 20230603200030.png (33.03 KB, 下载次数: 0)
下载附件
2023-6-3 22:39 上传
为了节省时间,我尝试能不能直接一站到底,我在_0x6d646b函数中尝试寻找关键点,如果找不到,就需要一步一步调试了,幸运的是,发现调用md5的地方,果断断了点,重新提交
Pasted image 20230603200843.png (31.17 KB, 下载次数: 0)
下载附件
2023-6-3 22:39 上传
看着这行字符串,很明显是前面所有url中的参数添加进来进行重新排列拼接,感觉这不就来了
"[captcha=][day=2023-06-03][endTime=19:00][roomId=1901][seatNum=022][startTime=18:30][token=xxx][%sd`~7^/>N4!Q#){'']"
Pasted image 20230603201331.png (49.32 KB, 下载次数: 0)
下载附件
2023-6-3 22:39 上传
直接往前追溯_0x4aaee5_中的函数,发现就是个废话函数,直接就是md5加密就行,不过是为了混淆添加了几步
为了确保这里排列的顺序不变,又多试了几次,发现顺序是一样的,那么接下来就毫无悬念了,毕竟虽然混淆十分令人害怕,好几百行代码,但是最后就是个最简单的md5加密,直接进行Python复现
from Crypto.Hash import MD5
def getEnc(today, endTime, seatNum, startTime, token):
content = "[captcha=][day={}][endTime={}][roomId=1901][seatNum={}][startTime={}][token={}][%sd`~7^/>N4!Q#){'']".format(
today, endTime, seatNum, startTime, token)
result = MD5.new()
result.update(content.encode('utf-8'))
return result.hexdigest()
传参进去发现,确实和enc一样
这样某通图书馆预约座位系统被我们扒光了,又可以愉快的抢座预约了,考研党永不为奴