前置知识
1、作用域:(本地&全局)
简单来说就是运行后相关的数据值
2、调用堆栈:(由下到上)
简单来说就是代码的执行逻辑顺序
3、常见分析调试:
-代码全局搜索
-文件流程断点
-代码标签断点
-XHR提交断点
4、为什么要学这个?
-针对JS开发应用
-密码登录枚举爆破
-参数提交漏洞检测
-泄漏URL有更多测试
小知识点
JS逆向-流程&全局搜索-登录算法
流程断点:审查元素抓网络请求包发起程序
全局搜索:通过抓包参数名进行代码全局搜索
JS逆向-标签&XHR断点-登录算法
标签断点:审查元素对应标签按钮加入断点
XHR断点:审查元素源代码加入XHR断点配置
JS逆向-结合BurpSuite-插件引用
1、下载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并设置环境变量
复制这个路径
到系统环境里配置一下
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插件=》选择我们用到的插件=》开始攻击
加密成功