爬虫逆向学习(九):记录一个集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 md5

import 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 = -1
    for i in range(6):
        c = sig[key_index + 1]
        key += c
        key_index = chars.index(c)
        if key_index < 0 or key_index >= len(sig):
            key_index = i

    timestamp = 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')

破解结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月镇灵将

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值