文章首发在:先知社区
https://xz.aliyun.com/t/16413
前言
在做渗透测试过程中,难免会遇到前端加密的情况,这个时候就需要我们对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');
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END














暂无评论内容