手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享

手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享

0x1 前言

哈咯,师傅们!最近在学习js逆向相关的知识点,跟着网上的师傅的课程已经很多相关文章探索学习,今天想着写一篇js逆向断点调试&js逆向前端加密对抗相关的文章出来,给师傅们分享下,有不正确的地方,希望大佬勿喷。

这篇文章主要是给没有学习过js逆向的师傅学习的,分享一些js逆向基础知识,js实战断点调试技巧以及后面分享js逆向靶场搭建以及js逆向前端加密对抗,拿微信小程序常用的AES、RSA和明文Sign 签名校验绕过几个方面给师傅们分享下操作技巧。

最后面给师傅们分享一个前段时间搞的一个企业src的商城优惠卷并发漏洞,也是拿到了一千块的赏金,漏洞都很详细的给师傅们分享了这个案例,师傅们看完我上面的js断点调试和js前端加解密靶场打法等,可以去尝试玩下,要是有地方写的有问题,大佬勿喷!

0x2 如何找到加密算法

这里我直接拿Google浏览器控制面板来给师傅们演示下这个流程,主要是通过F12调试控制js前端代码

其中里面的作用域,调用堆栈,XHR断点这三个功能需要了解认识下

一、作用域(Scope)

作用域是指变量、函数和对象在代码中可访问的范围,决定了标识符(变量名、函数名)的可见性。

主要类型:

  • 全局作用域:在所有函数和代码块之外声明的变量,在整个程序中都可访问。
const globalVar = "我是全局变量"; function test() { console.log(globalVar); // 可访问 }
  • 函数作用域:在函数内部声明的变量,仅在该函数内部可访问。
function test() { const funcVar = "我是函数内变量"; console.log(funcVar); // 可访问 } console.log(funcVar); // 报错:未定义
  • 块级作用域:由 {} 包裹的代码块(如 ifforwhile)中用 let/const 声明的变量,仅在块内可访问。
if (true) { const blockVar = "我是块内变量"; console.log(blockVar); // 可访问 } console.log(blockVar); // 报错:未定义

作用: 避免变量名冲突,控制内存使用(离开作用域后变量可能被垃圾回收)。

二、调用堆栈(Call Stack)

调用堆栈是JavaScript引擎用于管理函数调用顺序的一种数据结构(遵循“后进先出”原则)。

工作原理:

  • 当函数被调用时,引擎会为其创建一个“执行上下文”并压入栈顶。
  • 函数执行完毕后,其执行上下文从栈顶弹出,控制权回到之前的函数。
  • 栈顶始终是当前正在执行的函数。

示例:

function a() { console.log("a开始"); b(); console.log("a结束"); } function b() { console.log("b开始"); c(); console.log("b结束"); } function c() { console.log("c执行"); } a();

调用堆栈过程:

  1. 执行 a()a 入栈 → 栈:[a]
  2. a 中调用 b()b 入栈 → 栈:[a, b]
  3. b 中调用 c()c 入栈 → 栈:[a, b, c]
  4. c 执行完毕 → c 出栈 → 栈:[a, b]
  5. b 执行完毕 → b 出栈 → 栈:[a]
  6. a 执行完毕 → a 出栈 → 栈空

作用: 追踪函数执行顺序,调试时可通过堆栈信息定位代码执行路径(如报错时的“堆栈跟踪”)。

三 、XHR断点(XHR Breakpoint)

XHR断点是浏览器开发者工具中的一种调试功能,用于在发送AJAX请求(XMLHttpRequest 或 Fetch)时暂停代码执行,方便调试网络请求相关逻辑。

使用场景:

  • 调试接口请求参数是否正确
  • 查看请求发送时机和触发条件
  • 分析请求被拦截或修改的逻辑

四、 js基础断点调试

我们这里随便输入一个电话号码以及密码,直接看这个网络这里,可以看到账户输入的账户、密码都被进行了加密

其中我们常见的加密内容是md5、base64加密的,但是下面这个系统加密的一看就不是常见的加密方式

像这个,我们要是想要在我们输入账户密码的后,在传输到服务器端中可以将其加密的字段截取,然后进行分析,看看这个网站是使用什么类型进行加密的,就可以进行破解了,这就是后面我需要讲的js断点调试。

我们输入账号密码-> 浏览器接受到我们的账号密码-> 根据js进行加密-> 发送到对方的服务器(网页)

服务器接收数据-> 对我们的数据进行解密-> 判断我们的数据解密后是否正常-> 正常就返回正常结果(否则返回报错)

0x3 实战断点调试-找加密算法

一、案例一

在讲这个案例断点调试之前,先带师傅们认识下这几个按钮工具作用

工具栏作为断点调试的操作工具,包含了 6 个按钮:

  • 按钮 1:让代码继续执行,运行到下一个断点会中断执行,如果没有设置断点会直接运行完代码
  • 按钮 2:跳过下一个函数调用。即不遇到函数时,执行下一步;遇到函数时,不进入函数直接执行下一步
  • 按钮 3:跳进下一个函数上下文。即不遇到函数时,执行下一步;遇到函数时,进入函数上下文,查看函数具体内容
  • 按钮 4:跳出当前函数调用
  • 按钮 5:单步调试,当前断点的下一步
  • 按钮 6:停用/激活全部断点

这里直接搜索Vip/LoginResult接口关键字,因为我们断点调试的话需要点击web端端某个个功能点,出发我们后面打的断点才可以成功,这里我们开始点击登陆,直接请求的是这个接口,所有这里我们可以先搜索这个Vip/LoginResult关键词看看

这里直接选择最上面的top文件,右击选择在所有文件中搜索

找到这个有关登陆功能处的代码,然后打断点

可以尝试多打几个断点,然后挨个阶段运行调试看看

点击登陆按钮,就可以成功执行断点了,右边那个按钮就是执行到下一个断点

可以看到图中,代码断点运行成功了,在控制台输入logindata,就可以显示对应的加密数据了(手机号、密码)

二、案例二

老规矩还是直接输入手机号和密码,然后看F12中的网络数据包,可以看到这里的密码也是进行了加密

找到登陆口附近的js代码,寻找publickey关键字

这里先随机设置一个断点

设置好断点后,点击登录,即可触发断点,进行 js 断点的调试。

可以看到点击完登陆,出现了这个功能

常见的js逆向加密搜索关键字:

encrypt encryptedData setPublicKey publicKey

直接进行js断点调试,在控制台输入dataJson.password,就可以看到密码的js加密数据

三、案例三

这里再给师傅们分享一个标签断点法,这里刚好有个网上实际的站点,拿出来给师傅们分享下

线F12,然后点击1,然后把鼠标选中2(登陆功能上)

然后右键选中“登陆”标签,将子树修改,和属性修改都勾选上。然后我们随便输入一个账号密码点击登录

这样就可以成功 把运行的js代码给断下来了,但是目前这个网站今天写文章的时候已经找不到加密函数了,可能是已经修复了这个系统

0x4 js逆向靶场安装

前端加密对抗练习靶场——encrypt-labs下载链接:https://github.com/SwagXz/encrypt-labs

1、直接下载这个压缩包即可

2、然后解压之后直接放在phpstudy的www网站目录下

3、这里还需要把这个文件下的数据库的用户名和密码都修改成phpstudy默认的root

要不然会提示连接数据库账号密码错误

4、还需要注意的一点就是php的版本需要大于7.3.4版本

要不然会有提示openssl等服务启动不了等报错

5、使用命令行创建encryptDB数据库

mysql -u root -p create database encryptDB 

6、导入sql数据

mysql> use encryptdb; Database changed mysql> source C:\phpstudy_pro\WWW\encrypt-labs-main\encryptDB.sql

账号密码是:admin:123456,直接登陆即可完成靶场搭建了

0x5 解密工具下载

一、autoDecoder

工具下载链接:https://github.com/f0ng/autoDecoder

下载jar文件那个,直接导入burpsuit插件即可使用

具体的使用和操作方法,师傅们可以看这个文章,写的很详细:

https://blog.ZEEKLOG.net/2202_75361164/article/details/144360050

二、Js-Forward脚本工具

Js-Forward是为了解决在渗透测试过程中所遇到的WEB参数加密而开发出的脚本工具

工具下载链接:https://github.com/G-Security-Team/JS-Forward

三、JsRpc工具

工具下载链接:https://github.com/jxhczhl/JsRpc/releases/tag/v1.095

具体操作使用方法如下:https://github.com/jxhczhl/JsRpc

四、ctool浏览器插件加解密

工具下载链接:https://github.com/baiy/Ctool/releases/tag/v2.3.0

这里直接拿Google浏览器演示,下载下面的压缩包

然后解压,Google浏览器插件点击加载这个工具文件夹即可

0x6 对称加密-AES 加解密

一、AES 加解密简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序)加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

AES 加解密:常用的微信小程序加解密方法

常见的搜索关键词:

encrypt、encryptedData、setpublickey

二、AES固定Key

第一种比较简单,key和iv写死,抓包发现数据传输被加密了

这里直接定位搜索“encryptedData”加密字段定位到算法位置

简单的分析,就是一个固定key 和iv 的aes加密,直接还原明文数据

{"username":"admin","password":"123456"}

三、AES服务端获取key

key和iv没有写在前端,直接使用bp抓包即可

这里使用bp插件autoDecoder,先配置自带的方法,红框的配置要注意配置好

主页面配置,仅登录所以关键字写了password

然后进入intruder进行爆破登录尝试

成功爆破

0x7 非对称加密-RSA 加解密

一、如何快速判定 RSA 呢?

RSA 只能加密短小的数据,如果数据太大,会直接报错,因此可以入超长数值,看看是否报错!

提示了这个错误,显示加密失败,说明就是非对称加密- RSA加密了

对于非对称加密,他需要设置公钥,因此一般全局搜索:

setpublickey、encrypt

二、RSA 加密

这个关卡不难,搜索非对称加密RSA常用的加密关键字:setpublickey,通过前端js找到公钥

然后通过断点调试,进行找到没有加密的原始数据

跟上面一样使用bp的插件autoDeceder

0x8 Sign 签名校验绕过

直接使用bp抓包,数据包的参数如下:username、password、nonce、timestamp、signature

我们这里来给师傅们演示下这个signature参数的由来

登陆界面,密码输入1234567,返回包提示密码错误

这个靶场的密码是123456,那么在bp数据包中,直接这里就把密码修改成123456,看看返回包

显示signature校验不正确,因为前面username、password、nonce、timestamp参数会生成signature传入到后台,后台就回和我们这里输入到signature进行匹配,要是不一样,就会进行报错

搜索关键字:signature,去断点看js代码

function sendDataWithNonce(url) { const username = document.getElementById("username") .value; const password = document.getElementById("password") .value; const nonce = Math.random() .toString(36) .substring(2); const timestamp = Math.floor(Date.now() / 1000); const secretKey = "be56e057f20f883e"; const dataToSign = username + password + nonce + timestamp; const signature = CryptoJS.HmacSHA256(dataToSign, secretKey) .toString(CryptoJS.enc.Hex);

打完断点,点击明文加签,进行断点调试

  1. 首先将usernamepasswordnonce(随机数)和timestamp(时间戳)拼接成一个字符串dataToSign,作为待签名的数据
拼接:admin123456drzeh01d5sn1755059730 

  1. 使用CryptoJS库的HmacSHA256方法,用secretKey(be56e057f20f883e)对拼接后的字符串进行 HMAC-SHA256 加密,生成signature(签名)
cd5e4af5343372cc5945539cddb67c8d33ae0f9be361c60e935e80b4c5a5f719

  1. 这样再替换回到数据包中即可成功登陆了

0x9 企业SRC实战分享—优惠卷

这个企业SRC是个商城的web资产应用,一进去,直接使用手机号登陆,因为像这样的可以直接使用手机号登陆(有账号),方便后续的渗透测试,很多功能点可能得登陆进去才可以测试

上面图片中,登陆到后台,有好几个功能点跟会员优惠卷有关系,商城优惠卷并发领取,必须得测下

点击领取,然后进行抓包测试,可以看到优惠卷的ID,为什么这里我要提下这个ID值呢,因为在后面我们还可以进行优惠卷横向并发,把不同金额的优惠卷ID进行便利并发领取,比如说你新人只能领取100元的,但是你通过ID横向并发领取到了200元的客户回归优惠卷,那么这个对商城是不是就有一定的危害了

然后可以使用这个并发插件脚本进行爆破,数量可以设置20个即可

def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=20, requestsPerConnection=100, pipeline=False ) for i in range(20): engine.queue(target.req, target.baseInput, gate='race1') engine.openGate('race1') engine.complete(timeout=60) def handleResponse(req, interesting): table.add(req)

可以看到数据包的状态200和长度都是一样的,那就说明我们成功进行了并发操作

然后返回账号的卡卷中心,发现领取了24张优惠卷

其中里面有20元、50元、100元优惠卷,并发操作都一样,都可以进行无限并发领取优惠卷

返回会员支付界面,可以看到支付的优惠卷都是可以直接使用叠加的,漏洞提交平台,一千块大洋到手

0x10 总结

这篇文章到这里就结束了,希望看完这篇文章对师傅们有帮助,该文章主要是记录和分享我的学习过程和一些漏洞挖掘的案例和手法等,本人技术水平一般,有问题欢迎师傅们加我微信交流学习!

最后祝愿看了这篇文章的师傅们,天天有漏洞产出,天天有src赏金!

Read more

Spring Cloud与Dubbo架构哲学对决

Spring Cloud与Dubbo架构哲学对决

目录 摘要 🎯 开篇:别被"微服务"这个词忽悠了 🏗️ 架构哲学:两种完全不同的"世界观" 🎨 Spring Cloud:生态为王的全家桶 ⚡ Dubbo:专精RPC的特种兵 📊 性能对决:数据不说谎 🔧 核心原理:扒开看看里面啥样 🎯 Spring Cloud 2025.1.0的"虚拟线程革命" ⚡ Dubbo 3.0的Triple协议:对标gRPC 🚀 实战:从零搭建混合微服务架构 🏢 场景:电商平台(日均订单千万级) 📝 分步骤实现 步骤1:搭建Spring Cloud Gateway 步骤2:Dubbo核心服务实现 步骤3:Spring Cloud外围服务 步骤4:

By Ne0inhk
【OpenClaw从入门到精通】第03篇:吃透Gateway/Skills/ClawHub核心概念(2026实测+避坑)

【OpenClaw从入门到精通】第03篇:吃透Gateway/Skills/ClawHub核心概念(2026实测+避坑)

摘要:本文针对OpenClaw新手易混淆的核心概念痛点,以通俗类比+实操演示拆解OpenClaw核心、Gateway、Skills、ClawHub四大组件。通过“数字员工团队”类比明确各组件定位:OpenClaw核心是“老板”(调度中心)、Gateway是“前台+后勤”(后台进程)、Skills是“专业员工”(功能插件)、ClawHub是“人才市场”(技能商店)。补充版本更名史、技能加载优先级、ClawHub与GitHub区别等关键细节,结合“AI融资新闻查询并邮件推送”虚拟案例演示组件协同流程,梳理5个高频认知误区及解决方案。所有内容基于2026年官方文档实测,案例为虚拟构建,代码仅作示例未上传GitHub,兼顾新手理解与进阶实操参考,帮助读者建立清晰的OpenClaw架构认知。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】

By Ne0inhk
一、消息队列理论基础与Kafka架构价值解析

一、消息队列理论基础与Kafka架构价值解析

一、传统架构面临的致命痛点与问题引入 1.1 灾难性的系统强耦合 假设我们正在开发一个核心的电商交易平台。在最原始的单体架构或早期的微服务架构中,订单微服务创建完一条新订单后,需要通过网络接口直接调用库存系统扣减商品、调用积分系统增加用户成长值,并且调用物流系统生成运单。 这种模式下,订单系统被严重绑架。一旦物流系统因为内部网络抖动出现超时故障,整个订单提交流程就会报错回滚。随着公司业务的不断膨胀,营销团队可能要求新增发券逻辑,风控团队要求新增审查逻辑。上下游系统交织成一张极其复杂的网,任何一个节点的细微变动都会导致全局代码的重构与联合测试。这种牵一发而动全身的设计,就是系统强耦合带来的恶果,它彻底违背了软件工程中开闭原则的基本理念。 1.2 漫长的同步阻塞等待 在上述直连调用的场景中,程序代码往往采用同步串行的执行逻辑。我们可以计算一下一笔订单产生后的时间开销。 订单核心库写入耗时 20ms 扣减后台库存耗时 50ms 增加用户积分耗时 50ms 推送物流与短信信息耗时 200ms 这就意味着,用户在前端点击支付按钮后,服务器线程必须傻傻等待至少 320ms 才能向客户

By Ne0inhk
Spring Cloud+AI :实现分布式智能推荐系统

Spring Cloud+AI :实现分布式智能推荐系统

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” 引言 * 在当今数字化时代,推荐系统已成为电商平台、内容分发平台、社交网络等互联网产品的核心竞争力之一。从淘宝的"猜你喜欢"、抖音的精准内容推送,到 Netflix 的影视推荐,优秀的推荐系统不仅能显著提升用户留存率和转化率,更能为企业带来可观的商业价值。据统计,亚马逊约 35% 的销售额来自推荐系统,Netflix 则通过推荐算法为用户节省了每年约 10 亿美元的搜索成本。 * 然而,随着业务规模的增长和推荐算法的复杂化,传统的单体架构逐渐暴露出诸多瓶颈。首先,推荐系统涉及用户画像构建、实时行为收集、特征工程、模型推理等多个环节,单体应用难以应对日益复杂的业务逻辑;其次,推荐服务需要处理海量并发请求,单机部署无法满足弹性伸缩的需求;再者,AI 模型的迭代更新日益频繁,单体架构下模型部署往往需要重启整个应用,严重影响线上服务稳定性;最后,企业需要支持 A/B

By Ne0inhk