问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【JS逆向篇上】算法逆向&断点调试&BP插件

创作时间:
作者:
@小白创作中心

【JS逆向篇上】算法逆向&断点调试&BP插件

引用
CSDN
1.
https://blog.csdn.net/qq_64095740/article/details/141093492

JavaScript逆向工程是Web安全领域的重要技术之一,通过分析和调试JavaScript代码,可以揭示网站的加密算法、数据传输方式等关键信息。本文将从基础知识入手,结合具体案例,详细介绍如何使用断点调试、Burp Suite插件等工具对JavaScript加密算法进行逆向分析。

前置知识

在开始JavaScript逆向工程之前,需要了解一些基础知识:

  1. 作用域:(本地&全局)
    简单来说就是运行后相关的数据值

  2. 调用堆栈:(由下到上)
    简单来说就是代码的执行逻辑顺序

  3. 常见分析调试:

  • 代码全局搜索
  • 文件流程断点
  • 代码标签断点
  • XHR提交断点
  1. 为什么要学这个?
  • 针对JS开发应用
  • 密码登录枚举爆破
  • 参数提交漏洞检测
  • 泄漏URL有更多测试

小知识点

JS逆向-流程&全局搜索-登录算法

流程断点:审查元素抓网络请求包发起程序
全局搜索:通过抓包参数名进行代码全局搜索

JS逆向-标签&XHR断点-登录算法

标签断点:审查元素对应标签按钮加入断点
XHR断点:审查元素源代码加入XHR断点配置

JS逆向-结合BurpSuite-插件引用

  1. 下载phantomjs并设置环境变量
    Download PhantomJS
  2. BurpSuite加载jsEncrypter插件
    Releases · c0ny1/jsEncrypter · GitHub
  3. 对逆向的加密算法提取JS文件及代码
    JSEncrypt.js
    var r = new JSEncrypt,
    o = "xxxxxxxxx";
    r.setPublicKey(o);
    var s = r.encrypt(password)
    return s
  4. 将代码写入到模版中(引用JS和调用加密)
    var wasSuccessful = phantom.injectJs('JSEncrypt.js');
    function encrypt(password){
    var r = new JSEncrypt,
    o = "xxxxxxxxx";
    r.setPublicKey(o);
    var s = r.encrypt(password)
    return s
    }
    // 处理函数
    function js_encrypt(payload){
    var newpayload;
    /**在这里编写调用加密函数进行加密的代码****/
    var newpayload=encrypt(payload)
    /**************/
    return newpayload;
    }
  5. 运行刚写入的模版文件后插件连接测试
    phantomjs xxxxx.js
  6. 正常设置发包后选择引用插件选项

实战分析

JS逆向-流程&全局搜索-登录算法

  1. 在这里进行的加密算法
  2. 找到他的路径
  3. 这里的路径为/Vip/LoginResult,接着我们拿去全局搜索一下,ctrl+shift+F(我们可以去搜索关键词,也可以去搜索路径)
  4. 找到了这个地方
  5. 接着去追溯一下代码

logindata.UserName = encodeURI(encrypt.encrypt(numMobile));

可以看到是这地方加密的
6. 我们先找下encrypt的声明函数
7. 找到后我们去控制台调试一下
先创建对象,在调试值
发现这里是加密成功了的

JS逆向-标签&XHR断点-登录算法

1. 文件流程断点

就是执行代码加载了哪些文件,就是请求发送的时候看哪些js参与过发包
这里的调用堆栈是从下到上的一个流程
一般我们都是看中间,这里的ajax是用来发送的,login是用来登陆的,所以我们重点去看login
1.1、点击js
1.2、他来到了这里
1.3、接着我们下断点去调试(先下断点在点击登陆)
1.4、我们发现到这里其实是以进加密好的了,所以我们去前面追溯
1.5、我们在看这边,看调用堆栈Login的时候是以进加密好的了,所以我们去找他前面的
1.6、点击ctrl和单机提交数据,接着我们还是像前面一样分析追溯代码
看(匿名这里)和Login之间的代码(主要是找密文出现和密文没出现之间的代码)
1.7、我们找到这里后点击js看一下
这就是加密算法的来源文件
找到之后就和之前一样去控制台调试一下
这适用于网站文件加载较少的情况

2. 代码标签断点

2.1、右键登陆后点检查
2.2、在到登陆这段代码右键,点击发送中断的条件在把子树修改和属性修改给选上
2.3、接着点击登陆之后,发现这里就密码做了加密
2.4、一般来说这里只到数据提取,还没有到数据加密我们向下执行
2.5、我们需要一步一步的找到加密的地方,所以不推荐使用标签断点

3. XHR提交断点(xml、http、request)

3.1、(前提)首先抓到包了,判断这里是不是xhr类型的
3.2、然后选择这里代表性的,不能选随机的,要选固定的。
3.3、接着去源代码下断点
3.4、在点击登陆,找到加密算法这一部分
接着和之前一样,找到加密之前的加密算法,进行后续的操作。

JS逆向-结合BurpSuite-插件引用

1. 在线网站调试

1.1、我们通过流程断点找到这里,发现在这已经做好了加密,所以我们去上面查代码


//这行代码创建了一个 JSEncrypt 对象实例 r。JSEncrypt 是一个 JavaScript 库,用于 RSA 加密。o 变量被赋值为 C.RSACODE,这里的 C.RSACODE 是一个存储 RSA 公钥的常量。
var r = new JSEncrypt, o = C.RSACODE;
//这行代码将之前定义的 RSA 公钥 (o) 设置到 JSEncrypt 实例 r 中,以便后续使用这个公钥进行加密操作。
r.setPublicKey(o);
//s 变量被赋值为加密后的结果。r.encrypt(a) 使用 JSEncrypt 实例 r 的公钥加密变量 a 的值。
//l 变量被赋值为 this.props.actions,它通常指代组件的 props 中的 actions 属性,用于访问组件的操作或方法。
var s = r.encrypt(a), l = this.props.actions;

1.2、我们把r.encrypt('labi')这个值拿出来调试一下发现加密成功,验证我们前面的逻辑并没有错
1.3、我们找到加密js这里,进去保存到桌面
1.4、可以先找一个在线运行js,这里发现是运行成功的

2. burpsuit插件引用

2.1下载phantomjs并设置环境变量
Download PhantomJS
复制这个路径
到系统环境里配置一下
2.2、BurpSuite加载jsEncrypter插件
Releases · c0ny1/jsEncrypter · GitHub
把这个插件导进burpsuit
2.3、把刚刚保存的js放到这个目录
2.4、打开phantomjs_server.js
2.5、主要修改这两部分,之后进行保存
2.6、在jsEncrypter.0.3.2目录上cmd后输入:


phantomjs phantomjs_server.js

2.7、可以看到这里开启成功
2.8、点击连接后在点击Test,发现执行成功
2.9、配置好了接着我们进行实战演示一下
先输入账号密码抓登陆包
放入intruder模块中=》选中要加密的地方=》添加payload
点击payload加载要爆破的字典
点击payload处理添加=》选择调用burp插件=》选择我们用到的插件=》开始攻击
加密成功

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号