文章主要介绍了扣算法解决RSA加密,其实可以利用jsencrypt库进行加密,读者可以自行尝试,代码量很少,大概五六十行。 本次爬取地址:ec.minmetals.com.cn/open/home/p…
第一步 F12
点击底下翻页按钮 能看到返回两个接口
第一个 public 点进去看
MIG 能猜测大概是 非对称加密 public 里面储存的就是公钥文件
我们看响应接口,数据是透明的。
这种网站的逻辑大概是:参数加密-发送加密参数-服务器响应-私钥解密参数-比对-比对成功-返回正确数据。
查看请求接口 和 载荷 发现 载荷中的 param 好像是加密的,请求接口没有加密,响应没有加密,也就是说只有发送请求加密了,接下来就破解param参数
去全局搜索 param
太多,看的头疼,搜不到。
换种方法。
设置加密肯定会用到 public 这个的地址,我们可以通过搜索这个地址找到加密入口。
点进去
我们在a这里打断点,断一下,发现可以断住。
在控制台输入 r 看一下 r 的值
发现它就是public的值,这就是加密口,s就是param的加密数据。
s = t.encryptLong(JSON.stringify(a))
接下来分析数据
分成以下几个步骤: 1、找a 2、找t 3、 看t有没有encryptLong这个方法,没有就补 4. 求s
我们可以在最下边打断点,点击翻页,成功断住。 我们看a
a = b(b({}, e), {}, {
sign: u()(JSON.stringify(e)),
timeStamp: +new Date
}),
s = t.encryptLong(JSON.stringify(a)),
A.abrupt("return", s);
里边b方法和e是未知的,我们先看e,在控制台输入e,就能看到e是什么
e =
{
"inviteMethod": "",
"businessClassfication": "",
"mc": "",
"lx": "ZBGG",
"dwmc": "",
"pageIndex": 2
}
我们再看a
{
"inviteMethod": "",
"businessClassfication": "",
"mc": "",
"lx": "ZBGG",
"dwmc": "",
"pageIndex": 2,
"sign": "cc3ad69e118a9e7a2def803e50cd3a73",
"timeStamp": 1679651280291
}
对比发现,a就是e对象多了两个属性
"sign": "cc3ad69e118a9e7a2def803e50cd3a73",
"timeStamp": 1679651280291
a和e的关系如下:
e[sign] = "cc3ad69e118a9e7a2def803e50cd3a73"
e["timeStamp"] = 1679651280291
a = e
我们看到e[sign] 是个加密参数,但是这个长度,有点熟悉,来看看e[sign]的长度: e[sign].length = 32 和md5算法长度一致。我们在控制台做个测试
c4c开头,基本确定就是md5算法。因为对固定值的加密值是固定的,所以u()不用扣。
e["timeStamp"]是一个时间戳,所以现在a有了
a = e
来找t
t = new v["a"],
再向上找v
v = t("9816")
看到这,可以确定是用webpack打包的,t是加载器,9816是调用的模块,现在扣这个t("9816")
在这下断点
刷新界面
点这个进去
搜索9816
这个就是我们要的模块
代码折叠,复制一下,篇幅限制,不贴代码了
模块找到了,下一步要找加载器。返回到这里
鼠标放在t上
点进去这个
看到停在这
这个g()就是我们要的加载器。
向上看,找到这个大函数,复制到pycharm里。
在函数外定义一个变量
在加载器最底部引用这个变量,注意注释掉浏览器原本的t(),让hx = g
复制你刚才找到的模块,键值对的格式如下: ({ 模块a,模块b })
按照浏览器方式调用
v = hs(9816)
t = new v["a"]
设置秘钥
可以试着跑一下,会报缺模块
试着在加载器打印一下缺哪个模块
打印出来是a524 直接全局搜索这个模块,复制到pycharm里
我们再执行一下,会报t没有encryptLong这个方法,同理下断点,进入方法内部
结果如下
发现它是t里另外加的一个方法,所以我们直接在下边给t加上这个方法好了
接下来还会报错,原因是encryptLong缺一个w方法
点进去补w方法
补环境不用说了吧,缺哪个补哪个,接下来可以跑通了。