文章总结: 本文通过三个JS逆向实战案例详细解析了密码加密破解方法:示例1通过搜索crypto关键词定位SHA1加密代码并成功复现;示例2通过调用堆栈跟踪找到MD5加密函数并本地解密;示例3分析DES对称加密流程,获取sessionid后成功复现加密。文章提供了具体的调试技巧和代码实现,对WEB安全渗透测试具有实操指导价值。 综合评分: 85 文章分类: WEB安全,渗透测试,代码审计,逆向分析,漏洞分析
那些年之我不会js逆向
原创
cmrex cmrex
Gamma实验室
2023年12月26日 23:05 福建
在小说阅读器读本章
去阅读
0x01 示例1-bc野站(md5)
(直接搜索关键词法)
在日某个网站的时候,想要爆破账号密码,解密密码加密的时候遇见的问题
这里的password被加密了,尝试找到加密方式
通过抓取js发现了:
/jdb-gamehallv3/pool_247/_nuxt/entry.ee524e21.js
代码
数据很多,搜索关键字,然后搜索了很久,搜索到了crypto关键字,发现这么一段代码:
var nodeWrap = function(method) { // 使用 require 导入 crypto 和 Buffer 模块 const crypto = eval("require('crypto')"); const Buffer = eval("require('buffer').Buffer"); // 定义封装后的哈希方法 var nodeMethod = function(t) { if (typeof t == "string") { // 如果输入是字符串,使用 crypto 模块的 createHash 方法生成 SHA-1 哈希值 return crypto.createHash("sha1").update(t, "utf8").digest("hex"); } if (t.constructor === ArrayBuffer) { // 如果输入是 ArrayBuffer,转换为 Uint8Array,并使用 createHash 方法生成哈希值 t = new Uint8Array(t); } else if (t.length === void 0) { // 如果输入是其他类型数据,则使用外部传入的 method 函数处理 return method(t); } // 使用 crypto 模块的 createHash 方法生成 SHA-1 哈希值 return crypto.createHash("sha1").update(new Buffer(t)).digest("hex"); }; return nodeMethod;};
- 如果输入是字符串,使用
crypto.createHash方法生成输入字符串的 SHA-1 哈希值,并以十六进制格式返回。 - 如果输入是 ArrayBuffer,将其转换为 Uint8Array,并使用
crypto.createHash方法生成哈希值。 - 如果输入是其他类型的数据,则使用外部传入的
method函数来处理。
其实核心代码就是:
crypto.createHash("sha1").update(t, "utf8").digest("hex");
解密
const x = "test";const nodeWrap = (method) => { const crypto = require('crypto'); const nodeMethod = (t) => { if (typeof t === "string") { return crypto.createHash("sha1").update(t, "utf8").digest("hex"); } return method(t); }; return nodeMethod;};const myHashFunction = nodeWrap();const result = myHashFunction(x);console.log(result);
而后续当我使用前段输入账号密码后发现结果一致,解密成功
小DLC
后续通过逻辑漏洞到了后台
0x02 示例2-某公众号登录加解密(调试md5)
跟踪分析
这里可以看到加密是md5,但是我们还是按照不知道如何加密的节奏来看如何加密的
这里登录后,查看调用堆栈
然后追踪到了v函数
在这里之前,密码没有加密,然后在此之后,密码进行了加密。
然后这里,我们进入v函数,在控制台也可以看见v的定义
于是下断点,还是admin,那就跟踪D(t)
然后再去追踪这些,太多了,应该这些都是加密的代码了
随着这个不断的循环,加密的内容r从短变长,逐渐加密结束
当退出这个循环的时候,发现就已经加密完成,也就是md5的加密结束了
解密过程
既然已经知道如何加密了,我们这里就需要对其进行解密,我们尝试复制出来他的代码,然后解密尝试
成功解密
0x03 示例3-某企业登录(对称加密)
分析
首先抓包看一下加密了什么:
这里是加密了密码,但是这里不像是常见url或者base64,md5之类的,所以继续进行分析
全局搜索这个密码字段,发现了若干,然后一个个去看,去下断点调试即可
通过分析,我们定位到了desEncrypt函数,然后在函数里发现了:keyObj = SECURITYKEY.get();
首先可以看见传入的值,我们可以看见走入的是aes加密这个逻辑里,下一步就是找到kobj,这里我们就要进入SECURITYKEY.get()
在get函数里,又掉用了_2函数,在这里可以看见是获取到了一些东西进行了拼接,我们继续跟进
这里就是访问了一个请求,然后通过ajax获取到了页面上的sessionid,这个时候抓包也可以抓到sessionid
走过了获取sessionid和抓到的数据包一样的id,随后返回了key
tostring结束后一并返回,加密结束。
解密
把他的加密函数复制下来,然后分别把下列js也一并复制到本地,然后包含即可。
Com_RegisterFile("security.js");Com_IncludeFile("aes.js");Com_IncludeFile("base64.js");
使用npm引入库
const CryptoJS = require('crypto-js');
然后把获取sessionid的部分抓包或者f12把sessionid复制进去,定义变量,然后即可加密
解密结果:
这里看见本地加密的结果和浏览器端加密的一致,解密完成。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Gamma实验室 cmrex cmrex《那些年之我不会js逆向》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论