使用PyV8库应对前端JS加密
Lastmod: 2022-04-23

关键字: 前端JS加密,伪验证码,PyV8,pydictor

抓取网页

推荐Save All Resources chrome插件,扒网页资源很方便。

隐藏了无关信息,本地搭建如下

index.jpg

本来想练习一下使用验证码绕过爆破工具(Pkav HTTP Fuzzer 1.5.6),但抓包未发现验证码参数提交,唯独用户名、密码都做了加密处理

package.jpg

略过这个伪验证码,下一步查找加密出处。开头以为简单Base64加密,F12调试查看资源发现原来有一个加密脚本,CryptoJS,应该是一个挺普遍使用的开源前端加密库。

crypto-js.jpg

翻看HTML源码,查看调用。果然,得到了DES加密的具体参数。

keycode.jpg

尝试手动加密

本来以为根据DES加密的参数,很容易手动模拟一次加密过程,却不合预期。CryptoJS.enc.Base64.parse(key)输出的keyHex,其为wordArray类型,用作加密函数的参数。这时尝试alert(keyHex)输出的字符串作密钥,并不成功。

keyHex调试.jpg

再留意到burpsuit的intruder模块的字符预处理不支持DES加密,意味着,即使还原手动加密的步骤,也不能直接应用于爆破模块。

intruder_payload_peocessing.jpg

使用PyV8库

干脆将直接运行JS脚本,自行生成一个专用字典。锁定使用python的PyV8库执行JS。

#coding=utf-8
#filename test-import.py
import PyV8
import requests

jsfile = open('lib/encode/customjs/my.js','r')
js += jsfile.read()
jsfile.close()

def getEncPasswd(word):
	ctxt = PyV8.JSContext()
	with PyV8.JSLocker():#进程安全锁
		ctxt.__enter__()
		ctxt.locals.password = word
		ctxt.eval(js)
		res = ctxt.locals.result
		ctxt.leave()
	return res.encode('utf-8')

#print getEncPasswd('admin')

运行一下,哈哈,终于得到 bvusJDLPXUo= 这串可爱的字符了。

PyV8.jpg

pydictor

字典生成工具pydictor出场,其能自定义脚本用于Encode字典。 lib/encode/test-encode.py 直接 import上面的脚本了。

pydictor_test_encode.jpg

命令行开跑

python pydictor.py -tool handler wordlist\top1000.txt  --encode test -o customDict.txt

pydictor.jpg

有了字典,愉快地 intruder 吧。