调用网页JS解决前端加密
前言
在做渗透测试过程中,难免会遇到前端加密的情况,这个时候就需要我们对js进行逆向来生成或者解密想要的内容,可以使用python直接调用函数处理,直接使用网页自己的JS代码,省去我们分析的时间。本文简单记录了一次使用pyexecjs库自动化调用相关函数处理该情况的实际案例。
案例
又一次遇到了前端加密,还不搞不行,只能看看咯。跟着步骤来,相信大家都能搞定前端加密这种情况
定位关键函数
通过观察请求及响应包,获取关键字符串,快速定位相关函数
直接定位搜索参数字符串serviceid或者具体的id号,这里我搜索的是服务id号
在这里下断点,简单跟一下加密流程,发现加密关键函数是c=$(b, x.value),继续跟踪这个函数的生成
这里声明了一个新的类l5,在当前js文件检索l5
继续检索,发现是从其他js文件引入来的(这里面的函数及文件引用后缀,每次刷新网页都会变化)
通过简单的函数跟踪,我们就可以大致确定加密函数在哪里,引用了什么文件。我们将有加密函数的js文件和其依赖文件都下载下来。
使用pyexecjs调用执行
首先安装pyexecjs库,直接pip安装即可
pip install PyExecJS
引入js文件,并调用相关函数的关键代码
with open('your.js','r',encoding='utf8',errors='ignore') as f:
jscode = f.read()
ctx = execjs.compile(jscode)
result = ctx.call('your_func', '参数1','参数2')
调用js并直接发包
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import execjs
import json
from enc import aes_encrypt
import requests
headers = {
'Host': 'xxxx',
'Cookie': 'xxxx',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN',
'Origin': 'xxxxx',
'Referer': 'xxxxx',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'Priority': 'u=0',
'Content-Length': '0',
'Te': 'trailers',
'Connection': 'keep-alive'
}
def encodehash(p):
navigator = """
var navigator = {
userAgent: 'Python-ExecJS',
appVersion: '1.0',
};
"""
window = """
var window = {};
window.document = {};
"""
with open('tree-BbjKWDWs.js','r',encoding='utf8',errors='ignore') as f:
jscode = f.read()
ctx = execjs.compile(window + '\n'+ navigator + '\n'+ jscode)
result = ctx.call('re', json.dumps(p),'密钥')
return result
url = 'https://xxx'
# 100012接口
for i in range(0,9):
user = 'xxxxx' + str(i)
p1 = {"identityMethod":["Mobile Number","Email"],"identityType":"xx","account":user}
data = {
"param": encodehash(p1),
"serviceId": "100012"
}
res = requests.post(url,json=data,headers=headers)
print(res.json())
即可实现构造加密请求发送的效果
问题解决
pyexecjs执行js代码报错gbk问题
报错信息:
UnicodeEncodeError: 'gbk' codec can't encode character
解决办法
脚本中加入这个代码
import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
pyexecjs不支持ES6导致模块加载导出报错
解决办法
需要将下载的js文件代码中的导入导出更改为CommonJS
// 导出
export {Jt as K, $t as a, Xt as h};
// 导入
import {K as x, a as K, h as q} from "./module.js";
// 导出
module.exports = {K: Jt, a: $t, h: Xt};
// 导入
const {K: x, a: K, h: q} = require('./module.js');
0 条评论
可输入 255 字