扣算法爬取中国五矿集团采购信息

424 阅读4分钟

文章主要介绍了扣算法解决RSA加密,其实可以利用jsencrypt库进行加密,读者可以自行尝试,代码量很少,大概五六十行。 本次爬取地址:ec.minmetals.com.cn/open/home/p…

第一步 F12

image.png

点击底下翻页按钮 能看到返回两个接口

第一个 public 点进去看

image.png

MIG 能猜测大概是 非对称加密 public 里面储存的就是公钥文件

我们看响应接口,数据是透明的。

这种网站的逻辑大概是:参数加密-发送加密参数-服务器响应-私钥解密参数-比对-比对成功-返回正确数据。

image.png

查看请求接口 和 载荷 发现 载荷中的 param 好像是加密的,请求接口没有加密,响应没有加密,也就是说只有发送请求加密了,接下来就破解param参数

去全局搜索 param

image.png

太多,看的头疼,搜不到。

换种方法。

设置加密肯定会用到 public 这个的地址,我们可以通过搜索这个地址找到加密入口。

image.png

image.png

点进去

image.png

我们在a这里打断点,断一下,发现可以断住。

image.png

在控制台输入 r 看一下 r 的值

image.png

发现它就是public的值,这就是加密口,s就是param的加密数据。

image.png

s = t.encryptLong(JSON.stringify(a))

接下来分析数据

分成以下几个步骤: 1、找a 2、找t 3、 看t有没有encryptLong这个方法,没有就补 4. 求s

image.png

我们可以在最下边打断点,点击翻页,成功断住。 我们看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算法长度一致。我们在控制台做个测试

image.png

c4c开头,基本确定就是md5算法。因为对固定值的加密值是固定的,所以u()不用扣。

e["timeStamp"]是一个时间戳,所以现在a有了 a = e

来找t

image.png

t = new v["a"],

再向上找v

 v = t("9816")

看到这,可以确定是用webpack打包的,t是加载器,9816是调用的模块,现在扣这个t("9816")

在这下断点

image.png

刷新界面

image.png

点这个进去

image.png

搜索9816

image.png

这个就是我们要的模块

image.png

代码折叠,复制一下,篇幅限制,不贴代码了

模块找到了,下一步要找加载器。返回到这里

image.png

鼠标放在t上

点进去这个

image.png

看到停在这

image.png

这个g()就是我们要的加载器。

向上看,找到这个大函数,复制到pycharm里。 image.png

在函数外定义一个变量

image.png

在加载器最底部引用这个变量,注意注释掉浏览器原本的t(),让hx = g

image.png

复制你刚才找到的模块,键值对的格式如下: ({ 模块a,模块b })

image.png

按照浏览器方式调用

image.png

v = hs(9816)

t = new v["a"]

设置秘钥

image.png 可以试着跑一下,会报缺模块

image.png 试着在加载器打印一下缺哪个模块

image.png

打印出来是a524 直接全局搜索这个模块,复制到pycharm里

我们再执行一下,会报t没有encryptLong这个方法,同理下断点,进入方法内部

image.png

结果如下

image.png 发现它是t里另外加的一个方法,所以我们直接在下边给t加上这个方法好了

image.png

接下来还会报错,原因是encryptLong缺一个w方法

image.png

点进去补w方法

补环境不用说了吧,缺哪个补哪个,接下来可以跑通了。

image.png