手把手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

VsCode 远程连接后,Github Copilot 代码提示消失?排查流程分享

VS Code 远程连接后 GitHub Copilot 失效排查流程 当使用 VS Code 远程开发时遇到 Copilot 代码提示消失,可按以下步骤排查: 1. 验证远程环境插件状态 * 在远程连接的 VS Code 中打开扩展面板 (Ctrl+Shift+X) * 确认 GitHub Copilot 和 GitHub Copilot Chat 扩展已安装且启用 * 检查扩展图标状态: * 正常状态:状态栏右下角显示 Copilot 图标 * 异常状态:图标灰显或出现警告三角 2. 检查网络连接 # 在远程终端测试 Copilot 服务连通性 ping copilot-proxy.githubusercontent.com curl -v https://api.

Llama 与 PyTorch:大模型开发的黄金组合

Llama 与 PyTorch:大模型开发的黄金组合

Llama 与 PyTorch:大模型开发的黄金组合 近年来,大型语言模型(LLM)迅速成为人工智能领域的核心驱动力。Meta 开源的 Llama 系列模型(包括 Llama、Llama2、Llama3)凭借其卓越的性能和开放策略,成为学术界与工业界广泛采用的基础模型。而 PyTorch 作为当前最主流的深度学习框架之一,以其动态计算图、易用性和强大的社区生态,成为训练和部署 LLM 的首选工具。 本文将深入探讨 Llama 模型与 PyTorch 之间的紧密关系,解析为何 PyTorch 成为 Llama 开发与优化的“天然搭档”,并介绍如何基于 PyTorch 构建、微调和部署 Llama 模型。 一、Llama 模型简介 Llama(Large Language Model

VsCode 远程 Copilot 调用 Claude Agent 提示 “无效请求”?参数配置错误的修正

解决 VsCode 远程 Copilot 调用 Claude Agent 提示“无效请求”问题 当在 VsCode 中通过远程 Copilot 调用 Claude Agent 时,若出现“无效请求”错误提示,通常与参数配置错误有关。以下方法可帮助排查和修正问题。 检查 API 密钥配置 确保 Claude Agent 的 API 密钥已正确配置在 VsCode 设置中。打开 VsCode 的设置文件(settings.json),验证以下参数是否完整: "claude.apiKey": "your_api_key_here"

国内如何升级GitHub Copilot到专业版

国内如何升级GitHub Copilot到专业版

国内外的AI编程工具我用过很多,用的时间比较长的是Cursor,后来Cursor在国内不能用了,就又回去试了一下GitHub Copilot,结果被惊艳到了,在VS Code里用起来很丝滑,体验很好,感觉VS Code团队在AI编程这块上真是下功夫了,现在其体验已经不输Cursor。 我一直是VS Code的粉丝,感觉还是原生的VS Code用起来最舒服,现在VS Code里的Copilot体验已经做的很好,就没有理由再用其他替代编辑器了。 VS Code里的Copilot每月有一定的免费额度,用完之后就需要开通专业版才能继续使用。我用完免费额度之后,已经被其良好的体验所打动,就想升级到专业版,但是如何付费成了问题。在网上搜了一下,说是国内的信用卡不能用,而之前好用的wildcard虚拟信用卡服务现在也停了,试了一下网友推荐的胡桃卡,试了好几次也没有支付成功,还被扣了很多手续费。 现在还有什么方式能支付升级到copilot专业版呢? 后来发现GitHub Copilot升级页面上的支付方式那里也支持paypal,就在Payment method那里,credit card旁边有