文章声明
本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与文章作者无关,若有侵权,请联系我立即删除!
概要
- 很久之前就研究过该网站,时间过去那么久之后都快忘记这个网站是怎么搞的了,特此记录一下
- 该篇文章是基于企业搜索接口的分析
- 用到的工具 360浏览器
逆向目标
请求参数 b, kiv
响应数据
开始整活
抓包
打开F12 选择XHR请求 定位到搜索数据包
参数定位
-
对于这种响应数据是密文的我做过很多个,其实大多数加密类型都是 AES/DES 这种对称加密,不然的话怎么展示解密后的数据呢?
-
直接搜索参数 kiv, 搜出来很多,但都是在一个js文件中,点击任意一个进入js中
-
进入到文件中后继续搜索kiv,这里搜索到了15个,把每一个都打上断点,然后页面中触发搜索操作
-
最终程序断在了这里,并且另外一个加密参数b也在旁边, 然后把其他没用的断点取消掉
-
往上找kiv是如何生成的,已知kiv是s赋值的,就找s是在哪里生成的,往上分析后定位到这里
-
这里有两处是赋值给s的但是你尝试几次后就会发现真正赋值的其实就是后面这个s=(0,M._A)(), 进入该函数就会发现该函数其实就是返回一个随机字符串,那么既然是随机的那我们就给他固定一个值
-
再来看看b是如何生成的,老样子b也是t赋值的,定位到该位置并打断点,分析后可以发现最终返回的值是**l(e, t.iv)**函数执行的结果,而传递的参数也是与搜索内容相关,进入到l函数中并打断点,可以发现其实就是一个标准的AES加密算法
-
既然知道是AES算法了, 那他的key(秘钥)和iv(偏移量)是什么呢, 继续调试往下走,然后控制台输出查看加密的明文和key是什么,而iv可以很明显的看到就是上面的kiv参数
-
由控制台可以看出加密的明文就是我们搜索相关的数据,可是key怎么有点看不懂呢?,怎么转成字符串呢?这里教你一招
- 使用当前AES前面的对象o下面的方法就可以实现 - o.enc.Utf8.stringify(n.key) --> 就会得到加密的秘钥,我这里就不显示了,小伙们可以自己实现 - 其实细心的小伙伴会发现 key是对象n的属性,并且加密模式和填充模式都是n的属性,我们直接定位到n的位置就可以看到明文了,这里我直接放图片了
-
既然key和iv还有明文我们都知道了,自然也要验证一个结果,当前测试加密网站
https://tool.lmeee.com/jiami/aes 经过验证之后发现结果能对上,但其实这还没结束,因为最终的b参数是加密过后又进行的replace操作
-
至此参数就分析结束了
响应数据解密
- 这一步更是简单,因为解密和加密是对立的,相关的加密参数都已了解,接下里就是解密操作了,同样是利用上面那个网站进行操作
- 复制密文,填入相关key,iv解密即可
JS实现
// 声明.我没有测试,大致模板就是这样,如果网站的加密结果和这个结果不一样,就在下面代码的基础上修改一下即可
// 安装插件
npm install crypto-js
const CryptoJS = require("crypto-js");
let key = CryptoJS.enc.Utf8.parse(key);
let iv = CryptoJS.enc.Utf8.parse(iv);
let info = {
mode: CryptoJS.mode.CBC,
iv: iv,
padding: CryptoJS.pad.Pkcs7
}
// 加密
let encrypt = CryptoJS.AES.encrypt('明文', key,info);
let Data = encrypt.toString(CryptoJS.enc.Utf8);
console.log(Data);
//解密
let decrypte = CryptoJS.AES.decrypt('密文数据', key, info);
let text = decrypte.toString(CryptoJS.enc.Utf8);
console.log(text);