一个前端js加密逆向的题目,CTF很少见这种题,不过实战中肯定会有,无论是SRC还是说......等等 前端js加密主要还是为了隐藏接口,避免被拿去做一些自动化测试或者脚本,一般来说像这个题的登录接口爆破,还有一些比如说购物网站抢单抢票之类的,比较常见还有数据爬虫,一些公司都会因为各种目的专门去搞这种甚至专门的部门来爬取各种数据,无论是做分析还是干些其他什么的.

这个题出的挺好的,很符合现在大部分网站的那种各种shit套娃加密,就是故意恶心人,看来出题人也是很有实战经验的,没少赤,不然也出不了这个题.

解题步骤

绕过无限debugger

一进去就是无限debugger,网上有很多绕过的文章,这里推荐一个插件

GitHub - 0xsdeo/AntiDebug_Breaker: JavaScript Reverse Tools -- JS逆向工具
JavaScript Reverse Tools -- JS逆向工具. Contribute to 0xsdeo/AntiDebug_Breaker development by creating an account on GitHub.

安装后固定

开启这个后刷新即可绕过

js文件就四个,1 2 3 被混淆了算是主逻辑,crypto-js.min.js 是一个总的集合,包含各种js加密算法以供调用,没必要分析.

然后这个三个js 我尝试去混淆也没用,直接开始手撕(当然是AI手撕😅

这个混淆我也不确定是否能被反混淆,当时简单看了下不行就没想多的了

嘻嘻

分析加密逻辑

第一件事就是f12-->网络抓一个登录包,找到这个启动器,里面有js实现发包的定位逻辑位置,点进去打断点,最好两个都打.

再次登录一下,基本可以看出加密逻辑集中在这里

里面类似_0xea7c('0x37e', 'nNa]') 其实就是常见的一个混淆手段,这个函数是一个解密函数,会把这里面的参数拿去解密得到正确的值才能去正常调用函数操作什么的,里面可能是RC4啊或者怎么自定义的函数,直接在控制台输出即可看到正确内容

往上翻可以大概看到数据从

TOKEN: "8e6d1de895eb8cd2108295b87daf4c18"
passWord: "123"
timeStamp: 1769931801945
userName: "123"

变成了 p q n 还有什么iv key 类似DES加密的数据,最后打包成了一串常见jwt的编码(其实是js的base64打包

这里可以先简单记录一下值,然后再次相同账号密码登录,看看有哪些在变哪些没变,不过上述的东西其实都在变,这里我想的是可能是RSA的OAEP,会在加密的时候添加随机值进去导致生成的密文一直在变,key 和 iv也在同时变化,然后看回显的值也是被加密的,猜测可能是这个iv和key用于解密

这里由于混淆的跟shi一样,笔者没那个石粒 不能够一眼丁真出主要逻辑只能分析上述,于是求助AI大人,将主要逻辑复制后,用控制台生成解密的原文值给AI,并把你的猜测给AI,让AI帮你分析具体逻辑,然后AI大爷让你干嘛你就干嘛,比如说追函数,追值,如果发现AI 降智,可以再开一个对话,或者换一个,让当前对话给你总结大概然后再复制给新对话即可.最后直接给结论(不想再去找一遍了,估计也懒得看,还不如自己去吃一遍来的划算🥵

登录请求明文(账号/密码/时间戳/随机TOKEN)
        |
        v
生成随机 SM4 key / iv
        |
        +------------------------------+
        |                              |
        v                              v
SM4-CBC 加密明文 -> p          SM2 公钥加密 {key,iv} -> q
        |                              |
        +--------------+---------------+
                       |
                       v
构造 payloadJson + keyivJson
                       |
                       v
MD5(payloadJson + "|Infernity|" + keyivJson) -> n
                       |
                       v
组装 JSON {p,q,n}
                       |
                       v
JSON -> UTF8 -> Base64
                       |
                       v
POST /login
Content-Type: text/plain
Body: Base64字符串

以及相关明文公钥和盐

SM2 公钥
0405e2169f794a08c63c75b5a5bcc0c9adb857177d76ea3b0f4afa168fb1f0854 e5c68df39ba3cd2baecf1a236aaa049a562971c868c5102bc387152489e139e3e

MD5 盐
const SALT = "|Infernity|";

这里SM是国密的意思,不是RSA,国内的喜欢用这个做加密,然后这个key和iv也是用做国密加密解密的,不是DES,不过这个key和iv会做复用来解密是真的,这也是为什么每次回显的响应会变化的原因之一

EXP

最终的EXP原本是笔者打算做一个整合的python脚本直接跑,但是实现加密逻辑的时候有点瑕疵,还需要优化一下,害怕是个兔子洞浪费时间,遂直接生成一个PHP网页用原生js实现整个逻辑,只需要上传字典文件就行

其实是刚好在测环境有现成的php docker

最终写脚本用的是免费的Google AI studio,前面分析用的GPT5.2,花了不少时间反正,一血感觉纯粹是大家不愿意赤这个,我是之前实习的时候赤过,挺熟悉的想练练手🤔 后面做出来后看还是挺多人做出来的.

总结

js逆向大概的思路和操作就这样,其实还可以配合burp插件做hook什么的,然后能够反混淆的话就尽量反混淆,我只是试了https://obf-io.deobfuscate.io/不行就算了,估计这个题也能反混淆吧或者更简单的操作?还没看官方wp.

可能大佬还有高招,这里只是说我会的,不喜勿喷,嘻嘻

然后这个题也可以尝试用模拟浏览器什么的操作去搞,一个是太慢了,另一个是消耗资源过大,这是最后的办法.