写点什么

今天爬,明天没,天津市 XX 网 详情页加密逻辑拆解,文中关键字已经加密

作者:梦想橡皮擦
  • 2022 年 5 月 28 日
  • 本文字数:1599 字

    阅读完需:约 5 分钟

⛳️ 实战场景

本篇博客为大家展示的是一个 URL 加密案例,其中涉及到了 URL 地址变更。


  • 目标站点:5aSp5rSl5biC5YWs5YWx6LWE5rqQ5Lqk5piT572R(本次加密使用的是 Base64 加密)

  • 数据地址:http%3A%2F%2Fggzy.zwfwb.tj.gov.cn%2Fjyxx%2Findex_1.jhtml (URL 编码)


可以参考界面查阅该博客是否与你要采集的站点一致。



本案例反爬场景如下所示,直接读取源码获取网站链接之后,在浏览器打开,会出现 403 进行访问。


手动点击交易数据,得到的是正确的路径地址。



此时梳理一下反爬逻辑:


  1. 列表页响应数据中的源码,包含详情页地址

  2. 点击详情页链接,加密之后,跳转到新的地址

  3. 原地址无法直接访问。


这样看,点击链接之后的操作就是我们解决该反爬的突破点了。

⛳️ 反爬求解

接下来我们就按照上述思路去寻找【解题方法】,因为是跳转加密逻辑,不是请求逻辑,所以它的加密逻辑一定是在前端 JS 文件中实现的(经验问题),此时我们可以基于网页元素事件绑定,跟踪加密逻辑。


在开发者工具中,直接检查 DOM 元素的所有事件,其中重点关注的是单击操作(因为基于上文分析,是单击之后跳转地址发生了变化。)



点击 VM881:1 之后,直接跳转到 JS 代码页面,将源码格式化之后,发现非常短小。



而且可以直接找到加密逻辑,上图红框区域内容。


var srcs = CryptoJS.enc.Utf8.parse(ccc);var k = CryptoJS.enc.Utf8.parse(s);var en = CryptoJS.AES.encrypt(srcs, k, {  mode: CryptoJS.mode.ECB,  padding: CryptoJS.pad.Pkcs7,});
复制代码


在开发者工具中编写 JS 代码片段,直接拿固定值进行测试,得到的结果如下所示:


hh = "http://这个网址,你需要去浏览器里面复制一下/jyxxcggg/982990.jhtml";var aa = hh.split("/");var aaa = aa.length;var bbb = aa[aaa - 1].split(".");var ccc = bbb[0];var cccc = bbb[1];var r = /^\+?[1-9][0-9]*$/;var ee = $(this).attr("target");
var srcs = CryptoJS.enc.Utf8.parse(ccc);var k = CryptoJS.enc.Utf8.parse(s);var en = CryptoJS.AES.encrypt(srcs, k, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7,});var ddd = en.toString();ddd = ddd.replace(/\//g, "^");ddd = ddd.substring(0, ddd.length - 2);var bbbb = ddd + "." + bbb[1];aa[aaa - 1] = bbbb;var uuu = "";for (i = 0; i < aaa; i++) { uuu += aa[i] + "/";}uuu = uuu.substring(0, uuu.length - 1);console.log(uuu);
复制代码


运行代码,会在控制台输入一个编码之后的地址,放到浏览器发现可以访问,此时可以直接拿这个 JS 文件和 CryptoJS 文件,在 Python 中执行 JS 即可。


也可以用 Python 进行代码复盘。在编写代码前,还需要通过打断点的方式,将 Key 值获取到,具体如下所示。



加密形式是 AES_ECB ,其需要参数如下所示:


  • key:秘钥,8 的倍数,就是刚才获取到的 qnbyzzwmdgghmcnm

  • 待加密字符串:本案例中是文章详情 ID。


from Crypto.Cipher import AESfrom Crypto.Util.Padding import pad
import base64
def encrypt_text(text, key): aes = AES.new(key.encode('utf-8'), AES.MODE_ECB) encrypt_str = aes.encrypt(pad(text.encode('utf-8'), AES.block_size, style='pkcs7')) encrypt_str = str(base64.encodebytes(encrypt_str), encoding='utf-8') return encrypt_str
if __name__ == '__main__': key = 'qnbyzzwmdgghmcnm'
es = encrypt_text("982990", key) print(es)
复制代码


接下来在翻译 JS 加密之后的剩余代码


if __name__ == '__main__':    key = 'qnbyzzwmdgghmcnm'
es = encrypt_text("982990", key) es = es.replace("\n", "") # 去掉后面的换行 es = es.replace('/', '^')[:-2] # 去掉最后的 == print(es) # A7be7quQ^oQeeaGMXNfArg
复制代码


此时,你已经将最终的结果计算出来了,希望本文又带给你一个新的反爬技巧。


📣📣📣📣📣📣右下角有个大拇指,点赞的漂亮加倍

发布于: 刚刚阅读数: 3
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
今天爬,明天没,天津市XX网 详情页加密逻辑拆解,文中关键字已经加密_5月月更_梦想橡皮擦_InfoQ写作社区