当前位置: 首页 > news >正文

爬虫逆向学习(九):记录一个集cookie、请求参数、请求体、响应文本加密的站点反爬

此分享只用于学习用途,不作商业用途,若有冒犯,请联系处理

反爬前置信息

站点:aHR0cHM6Ly96d2Z3LmNxLmdvdi5jbi9pY2l0eS9pY2l0eS9lbmdpbmVlcmluZy9uYXZpZ2F0aW9u
接口:/icity/api-v2/cq.app.icity.engineering.EngineeringCmd/getBusinessList
加密点:
在这里插入图片描述
在这里插入图片描述

逆向研究

老样子,看调用堆栈,直接进去红框的代码处
在这里插入图片描述

从这些代码我们可以拿到请求体原文,肯定是用它进行加密的,然后锁定cmd.setData(data);,大胆猜测加密就是在这里处理的
在这里插入图片描述

打上断点然后跟进去:cmd.setData(data);->$.extend(this.paramsObj, obj);
发现其实只是对请求体原文做一个处理,都没进行加密,不用说那就是cmd.executeAsync("getBusinessList")这个位置了

cmd.executeAsync("getBusinessList")打上断点跟进去,再进入红框代码
在这里插入图片描述

这里就能看到所有加解密操作了
在这里插入图片描述

addUrlAuth方法没啥难点,可以直接算法破解,其中__signature其实是在首页返回的,在整个破解过程中,我们需要从首页拿到XSRF-TOKENcookie和__signature
在这里插入图片描述

接下来看下加解密
在这里插入图片描述

使用文本解码就可以看到实际的文本代码了
在这里插入图片描述

其实就是原生的AES加密,这个也可以直接使用算法破解,注意加解密的key值是XSRF-TOKENcookie取十六位

算法破解

依赖包

import base64
import json
import random
import time
from binascii import hexlify
from binascii import unhexlify
from hashlib import md5import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad

addUrlAuth

def get_auth_params():sig = '__signature'chars = "0123456789abcdef"key = ''key_index = -1for i in range(6):c = sig[key_index + 1]key += ckey_index = chars.index(c)if key_index < 0 or key_index >= len(sig):key_index = itimestamp = str(int(random.random() * (9999 - 1000 + 1) + 1000)) + "_" + key + "_" + str(int(time.time() * 1000))tkey = md5((timestamp + base64.b64decode('eWVVUkx5VFpvdW00SzI3ZA==').decode()).encode()).hexdigest()return {'s': sig,'t': timestamp,'o': tkey,}

encrypt_a

def encrypt_a(plaintext, xsrf_token_prefix):key = xsrf_token_prefix.encode('utf-8')[:16]cipher = AES.new(key, AES.MODE_ECB)padded_data = pad(plaintext.encode('utf-8'), AES.block_size)encrypted_data = cipher.encrypt(padded_data)hex_encrypted_data = hexlify(encrypted_data).decode('utf-8')return hex_encrypted_data

decrypt_a

def decrypt_a(hex_encrypted_data, xsrf_token_prefix):encrypted_data = unhexlify(hex_encrypted_data)key = xsrf_token_prefix.encode('utf-8')cipher = AES.new(key, AES.MODE_ECB)decrypted_padded = cipher.decrypt(encrypted_data)return unpad(decrypted_padded, AES.block_size).decode('utf-8')

破解结果

在这里插入图片描述

相关文章:

  • Cpp内存管理(7)
  • 海信智能电视的使用心得
  • Elasticsearch 启动后在浏览器输入http://localhost:9200 访问失败
  • 企微SOP:构建标准化运营流程,驱动企业高效增长
  • 【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题
  • PHP 函数
  • BeautifulSoup4在爬虫中的使用
  • Oracle DB运维常用的视图及数据字典
  • linux命令之docker用法
  • Linux·进程概念(上)
  • OJ在线评测系统 后端基础部分开发 完善CRUD相关接口
  • 算法分享——《滑动窗口》
  • 海尔嵌入式硬件校招面试题及参考答案
  • 如何在Excel中快速找出前 N 名,后 N 名
  • Spring面试题——第二篇
  • es6--symbol
  • express + mock 让前后台并行开发
  • gf框架之分页模块(五) - 自定义分页
  • HTTP请求重发
  • javascript面向对象之创建对象
  • jquery ajax学习笔记
  • JS+CSS实现数字滚动
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React+TypeScript入门
  • ReactNativeweexDeviceOne对比
  • STAR法则
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 后端_MYSQL
  • 前端之React实战:创建跨平台的项目架构
  • 前嗅ForeSpider教程:创建模板
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序 setData 学问多
  • k8s使用glusterfs实现动态持久化存储
  • ​插件化DPI在商用WIFI中的价值
  • #define与typedef区别
  • (003)SlickEdit Unity的补全
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (计算机网络)物理层
  • (七)Knockout 创建自定义绑定
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一一四)第九章编程练习
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)fock函数详解
  • (转载)OpenStack Hacker养成指南
  • .a文件和.so文件
  • .NET Core 中的路径问题
  • .Net Core 中间件验签
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net反编译的九款神器
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面