写Python爬虫,服务器返回数据加密了,套路解决法~,出版社,出版社 Y13

举报
梦想橡皮擦 发表于 2022/04/24 11:02:24 2022/04/24
【摘要】 📢📢📢📢📢📢💗 你正在阅读 【梦想橡皮擦】 的博客👍 阅读完毕,可以点点小手赞一下🌻 发现错误,直接评论区中指正吧📆 橡皮擦的第 623 篇原创博客 ⛳️ 实战场景本次要采集的是一个出版社相关的站点,目标站点相关信息如下所示:站点域名:aHR0cHM6Ly9wZGMuY2FwdWIuY24v (Base64 编码)站点中文名称:图书出版社,出版社查询,出版机构数据库,出版...

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 623 篇原创博客

⛳️ 实战场景

本次要采集的是一个出版社相关的站点,目标站点相关信息如下所示:

  • 站点域名:aHR0cHM6Ly9wZGMuY2FwdWIuY24v (Base64 编码)
  • 站点中文名称:图书出版社,出版社查询,出版机构数据库,出版物数据中心

点击其检索页面,随机选择一个分类,进行请求逻辑分析。

开发者工具得到的数据如下所示:

在请求头中,有一个特殊的参数,即 userSessionId,该参数是用户登录之后的一个关键参数,通过 POSTMAN 进行测试发现无需该参数也可以调用到服务器数据。

其中请求表单参数说明如下:

  • pageNum: 页码
  • pageSize: 每页数据
  • keyword: 搜索关键词
  • city1: 城市
  • type: 类型
  • group: 所属集团
  • t: pdc,ele,未知参数,保持默认值即可。

请求中没有加密参数,但是通过上图大家会发现响应中包含了一个加密参数,根据经验可以初步判断是 BASE64 加密形式,后期可以尝试从其入手。

⛳️ 解析参数

接下来添加 api/publisher/publisherVagueStatList 断点,刷新页面进入该断点。

跟随断点进入下述代码段,其中比较重要的函数是 i(e,u,o) 部分,而这个代码段又似曾相识,在前几篇博客 都是限制,都是秘密,JS 逆向某建筑市场数据 ,应该是看到过类似的结构。

var n = "getAllResponseHeaders" in f ? s(f.getAllResponseHeaders()) : null,
  r = t.responseType && "text" !== t.responseType ? f.response : f.responseText,
  o = {
    data: r,
    status: f.status,
    statusText: f.statusText,
    headers: n,
    config: t,
    request: f,
  };
i(e, u, o), (f = null);

但是翻阅 i 函数内部之后,并未发现加密逻辑,难道经验出错了?

继续点击下述按钮,进入函数内部,查看函数体内的调用。

通过代码的反复调试,获取下图所示代码区域截图。

此时发现 function(t) 中的参数 t 已经被序列化,那前面的 e.responseHandle(t,!0) 就是我们唯一的突破点了,下图是被结构化的数据。

进入到 resoonseHandle 函数内部之后,发现了 e.result 逻辑,其中 result 属于关键参数。

选中前面的代码块之后,查看调用的 JS 文件,其中 chunk-common 显得至关重要。

当点击 JS 文件之后,直接就发现了下图所示代码。

加密参数都暴露在了我们面前。

 o = function(t) {
 var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "z66qa18l0w9o521k"
   , i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "16-Bytes--String"
   , a = s["enc"].Utf8.parse(e)
   , n = s["enc"].Utf8.parse(i)
   , o = s["AES"].decrypt(t, a, {
     iv: n,
     mode: s["mode"].CBC,
     padding: s["pad"].Pkcs7
 });
 return o.toString(s["enc"].Utf8)

总结一下得到的结论,本案例采用的是 AEC-CBC 加密,iv16-Bytes–String,密钥是 z66qa18l0w9o521k,其中 paddingPkcs7

基于这些内容,我们已经可以将其逻辑 Python 话了,这一步你可以参考我们之前的博客,有很多落地方案。

📣📣📣📣📣📣
🌻 本文如果发现错误,欢迎在评论区中指正哦 💗

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。