【JSrpc破解前端加密问题】

目录

一、背景

二、项目介绍

三、JSrpc 处理前端加密步骤


一、背景

  解决日常渗透测试、红蓝对抗中的前端密码加密问题,让你的爆破更加丝滑;降低js逆向加密的难度,降低前端加密逻辑分析工作量和难度。

二、项目介绍

  运行服务器程序和js脚本 即可让它们通信,实现调用接口执行js获取想要的值;

实现原理:在网站的控制台新建一个WebScoket客户端链接到服务器通信,调用服务器的接口 服务器会发送信息给客户端 客户端接收到要执行的方法执行完js代码后把获得想要的内容发回给服务器 服务器接收到后再显示出来。具体项目地址和食用细节参考:https://github.com/jxhczhl/JsRpc

三、JSrpc 处理前端加密步骤

第一步 构建RPC通信环境

浏览器中访问目标网站,注入rpc服务端代码到浏览器中:

服务端代码如下:

function Hlclient(wsURL) {this.wsURL = wsURL;this.handlers = {_execjs: function (resolve, param) {var res = eval(param)if (!res) {resolve("没有返回值")} else {resolve(res)}}};this.socket = undefined;if (!wsURL) {throw new Error('wsURL can not be empty!!')}this.connect()
}Hlclient.prototype.connect = function () {console.log('begin of connect to wsURL: ' + this.wsURL);var _this = this;try {this.socket = new WebSocket(this.wsURL);this.socket.onmessage = function (e) {_this.handlerRequest(e.data)}} catch (e) {console.log("connection failed,reconnect after 10s");setTimeout(function () {_this.connect()}, 10000)}this.socket.onclose = function () {console.log('rpc已关闭');setTimeout(function () {_this.connect()}, 10000)}this.socket.addEventListener('open', (event) => {console.log("rpc连接成功");});this.socket.addEventListener('error', (event) => {console.error('rpc连接出错,请检查是否打开服务端:', event.error);});};
Hlclient.prototype.send = function (msg) {this.socket.send(msg)
}Hlclient.prototype.regAction = function (func_name, func) {if (typeof func_name !== 'string') {throw new Error("an func_name must be string");}if (typeof func !== 'function') {throw new Error("must be function");}console.log("register func_name: " + func_name);this.handlers[func_name] = func;return true}//收到消息后这里处理,
Hlclient.prototype.handlerRequest = function (requestJson) {var _this = this;try {var result = JSON.parse(requestJson)} catch (error) {console.log("catch error", requestJson);result = transjson(requestJson)}//console.log(result)if (!result['action']) {this.sendResult('', 'need request param {action}');return}var action = result["action"]var theHandler = this.handlers[action];if (!theHandler) {this.sendResult(action, 'action not found');return}try {if (!result["param"]) {theHandler(function (response) {_this.sendResult(action, response);})return}var param = result["param"]try {param = JSON.parse(param)} catch (e) {}theHandler(function (response) {_this.sendResult(action, response);}, param)} catch (e) {console.log("error: " + e);_this.sendResult(action, e);}
}Hlclient.prototype.sendResult = function (action, e) {if (typeof e === 'object' && e !== null) {try {e = JSON.stringify(e)} catch (v) {console.log(v)//不是json无需操作}}this.send(action + atob("aGxeX14") + e);
}function transjson(formdata) {var regex = /"action":(?<actionName>.*?),/gvar actionName = regex.exec(formdata).groups.actionNamestringfystring = formdata.match(/{..data..:.*..\w+..:\s...*?..}/g).pop()stringfystring = stringfystring.replace(/\\"/g, '"')paramstring = JSON.parse(stringfystring)tens = `{"action":` + actionName + `,"param":{}}`tjson = JSON.parse(tens)tjson.param = paramstringreturn tjson
}

 如下注入至浏览器中,并连接通信环境

// 注入环境后连接通信
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz");
// 可选  
//var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz&clientId=hliang/"+new Date().getTime())

启动我们的中间监听器,可以看到有上线:

接口调用说明:

  • /list :查看当前连接的ws服务 (get)
  • /ws :浏览器注入ws连接的接口 (ws | wss)
  • /wst :ws测试使用-发啥回啥 (ws | wss)
  • /go :获取数据的接口 (get | post)
  • /execjs :传递jscode给浏览器执行 (get | post)
  • /page/cookie :直接获取当前页面的cookie (get)
  • /page/html :获取当前页面的html (get)

尝试调用浏览器ws接口并传入js代码

import requestsjs_code = """
(function(){console.log("test")return "执行成功"
})()
"""url = "http://localhost:12080/execjs"
data = {"group": "zzz","code": js_code
}
res = requests.post(url, data=data)
print(res.text)

如下就证明成功实现了rpc通信和接口调用:

第二步处理加密

加密函数寻找:

定位加密函数,抓包分析,加密登录接口位于/api/sys_yonghua/login_web,全局搜索接口login_web

断点分析后,hook插桩函数和方法为:

const processedParam = v()(param); const encryptedValue = n["default"].prototype.$AesDesHelper.AesOrDes_Encrypt(processedParam);

v()进行md5加密,模块n["default"].prototype.$AesDesHelper中的AesOrDes_Encrypt(l)方法对md5后的值进行加密,加密方法知道之后,接下来就是注册函数方法了。

注册函数方法:

1、浏览器控制台注册无参数方法


// 注册一个方法 第一个参数hello为方法名,
// 第二个参数为函数,resolve里面的值是想要的值(发送到服务器的)
demo.regAction("hello", function (resolve) {//这样每次调用就会返回“yesyesyesyes+随机整数”var Js_sjz = "好困啊"+parseInt(Math.random()*1000);resolve(Js_sjz);
})

无参接口调用:

2、浏览器控制台注册带参数方法

demo.regAction("md5", function (resolve, param) {// 确保 v() 可以访问并返回一个处理后的值const processedParam = v()(param); const encryptedValue = n["default"].prototype.$AesDesHelper.AesOrDes_Encrypt(processedParam);resolve(encryptedValue);
});

带参param接口调用,即可实现本地浏览器前端加密:

第三步python脚本批量处理

导入密码字典:

python脚本调用接口进行批量处理加密:

import requests
import threadingpath = "http://127.0.0.1:12080/go?group=zzz&action=md5&param="
encrypt_list = []def GetEncrypt(password):url = path+'"'+password+'"'response = requests.get(url=url)if response.status_code == 200:encrypt_list.append(response.json()["data"])print(response.json()["data"])else:return {"status": response.status_code, "error": "Request failed"}def MultProcess():threads = []with open("password.txt",'r') as file:for password in file:thread = threading.Thread(target=GetEncrypt,args=(password,))threads.append(thread)thread.start()for i in threads:i.join()if __name__ == '__main__':print("开始加密处理")MultProcess()with open("after_encrypt.txt",'w') as file:for i in encrypt_list:file.write(i.strip()+"\n")print("加密处理结束")

加密后的字典:

最后配合burpsuite实现爆破:

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143916.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

TC8:SOMEIP_ETS_009-019

SOMEIP_ETS_009: echoENUM 目的 检查枚举类型的参数及其顺序能够被顺利地发送和接收 测试步骤 1、Tester:创建SOME/IP消息 2、Tester:使用method echoENUM发送SOME/IP消息 3、DUT:返回method响应消息,其数据(值和顺序)与请求中的相同 期望结果 3、DUT:返回method响应消…

为什么说开放式比入耳式耳机更受欢迎?精选开放式耳机推荐

在音频设备不断推陈出新的今天&#xff0c;开放式耳机以其别样的魅力走进人们的视野。与传统入耳式耳机不同&#xff0c;开放式耳机在多个方面独具优势。它能带来清晰自然的音质&#xff0c;让音乐的每一个细节都生动呈现。佩戴上&#xff0c;它给予耳朵充分的自由空间&#xf…

ABAP-Logger ABAP 日志记录与任何其他语言一样轻松

ABAP-Logger ABAP 日志记录与任何其他语言一样轻松 ABAP Logger SAP Logging as painless as any other language. ABAP Version: 702 or higher See the mission statement Features Record message in Application Log(BC-SRV-BAL)Display message Installation Insta…

ECCV 2024 | 扩散模型diffusion如何改进?方向论文大汇总

1、∞-Brush : Controllable Large Image Synthesis with Diffusion Models in Infinite Dimensions 从错综复杂的领域特定信息中合成高分辨率图像仍是生成建模中的一个重大挑战&#xff0c;尤其适用于大图像域&#xff08;如数字组织病理学和遥感&#xff09;中的应用。现有方…

android开发 模拟api接口数据

Android开发者如何模拟接口获得自己想要的数据进行测试? - 简书 (jianshu.com)https://www.jianshu.com/p/05523321e692

腾讯百度阿里华为常见算法面试题TOP100(6):回溯、二分查找、二叉树

之前总结过字节跳动TOP50算法面试题&#xff1a; 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 回溯 46.全排列 class Solution { private:vector<vector<int> > ans;void dfs(vector<int>& nums, vector<int>&a…

数据库函数

1.字符串函数 例子&#xff1a; 2.数值函数 例子&#xff1a; 3.日期函数 例子&#xff1a; 4.流程函数 例子&#xff1a; 参考视频&#xff1a;27. 基础-函数-字符串函数_哔哩哔哩_bilibili

高级大数据开发学习路线指南

掌握大数据技术是一项系统性工程&#xff0c;涉及到广泛的技能和专业知识。为了帮助初学者构建坚实的基础&#xff0c;并逐步成长为大数据领域的专家&#xff0c;下面详细阐述了一条全面而深入的学习路线&#xff1a; 1. Java 编程基础 - 打造坚实的底层技能 关键知识点&…

Skyeye 云智能制造 v3.14.5 发布,ERP 商城

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

进程的通信

进程的通信方式 进程的通信方式有很多种&#xff0c;今天我就为大家介绍各种通讯方式&#xff0c;例如:管道&#xff0c;信号&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号量 1.管道 1.1 管道的简介: 管道分为无名管道与有名管道 无名管道:无名管道用于父子进…

基于SpringBoot+Vue的企业会议室预定管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Mac 搭建仓颉语言开发环境(Cangjie SDK)

文章目录 仓颉编程语言通用版本SDK Beta试用报名仓颉语言文档注册 GitCode登录 GitCode 下载 Cangjie SDK配置环境变量VSCode 插件VSCode 创建项目 仓颉编程语言通用版本SDK Beta试用报名 https://wj.qq.com/s2/14870499/c76f/ 仓颉语言文档 https://developer.huawei.com/c…

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…

【Java集合】TreeMap

概述 TreeMap实现了SortedMap接口&#xff0c;能够把它保存的记录根据键排序&#xff0c;默认是按键值的升序排序&#xff0c; 也可以指定排序的比较器&#xff0c;当用Iterator遍历TreeMap时&#xff0c;得到的记录是排过序的。 如果需要一个按键排序的map&#xff0c;建议使用…

Linux相关概念和重要知识点(4)(自举、vim)

1.语言和编译器的发展 &#xff08;1&#xff09;汇编语言的出现 计算机只能看懂二进制&#xff0c;但是用二进制实现一个功能就太难了&#xff0c;人们需要发明一种高效的语言。人们抽象出一套编程逻辑&#xff0c;定义了一系列操作&#xff0c;接下来就需要实现它。最初人们…

深入理解ConcurrentHashMap

HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作&#xff0c;调用了HashMap的putVal()&#xff0c;具体原因&#xff1a; 假设两个线程A、B都在进行put操作&#xff0c;并且hash函数计算出的插入下标是相同的&#xff1b; 当线程A执行完第六行由于时间片…

计算机网络:概述 --- 体系结构

目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…

轴承表面缺陷检测系统源码分享

轴承表面缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

Mybatis续

步骤 爆红 点了右上角还是爆红不要着急&#xff0c;右下角正在下载 new 如果new的是package&#xff0c;用com.zhang&#xff0c;能事项分级 如果new的是文件夹&#xff0c;用com/zhang&#xff0c;就能实现分级。如果用com.zhang&#xff0c;则创建的文件夹名是com.zhang …

【Java面向对象二】static(二)修饰成员方法的应用场景

文章目录 前言一、static修饰成员方法的应用场景二、使用例子三、工具类没有创建对象的需求&#xff0c;建议将工具类的构造方法进行私有总结 前言 记录学习过程中的工具类的使用。 一、static修饰成员方法的应用场景 1、类方法的常见应用场景 类方法最常见的应用场景是做工…