自学内容网 自学内容网

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

破解结果

在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_43845191/article/details/142524108

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!