某看准网站爬虫,js逆向

文章描述了如何分析一个网站的加密机制,使用CBC模式的AES加密以及PKCS7padding,并提供了Python实现的加密和解密代码,以解析和获取隐藏在异步请求中的数据。
摘要由CSDN通过智能技术生成

这里是它的网址,使用了base64,有兴趣自行解密

aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vcmFua19jLw==

找到它的搜索部分,我们查看一下搜索的内容,这些就是我们需要的数据,然后我点击第二页看看,发现了一个奇怪的接口,我们尝试阻止这个xhr请求,果然,页面无法加载数据了。

基本上定位到,这个部分就是我们需要的数据。它的b是加密的,kiv不知道是什么,返回内容也是加密的,我们加入一个xhr断点,然后继续进行操作。

看到了原始的数据,然后一步步向上找,最后发现了它的一个位置情况。

它是异步传入参数的,然后再下面的u.request打上断点,一步步往上,最后看到了生成的位置

这里的是
t = (0,
                M.mA)(n, {
                    iv: s
                }).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~")));
然后下断点,进去M.mA函数找到了关键的加密位置

非常典型的加密,然后我们前往u函数一看

是cbc加密,pad是pkcs7,key是上面的那个,它是一个固定的内容,其中e就是这一坨

G$$QawckGfaLB97r

iv是自己的一个随机函数,生成一个16字符的随机数,还是比较简单的。

我们开始写代码,复制这个去curl,然后转换成为python,然后进行加密,就成功了。

它的内容也是加密的,我们可以使用JSON.parse,来进行解密,但是它初始化的时候有检验,并且把json.parse给覆盖掉了,我们可以重新打开的时候来看这个JSON.parse,然后植入js hook代码去hook json.parse,定位到相关位置以后,我们发现它也是cbc解密,最后成功得到项目内容。

给出加密解密的代码

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import json
import random
import base64


def getBAndIv(data):
    text = json.dumps(data)

    # 生成与JavaScript相同方式的IV
    def get_iv(e=16):
        chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
        return ''.join(random.choice(chars) for _ in range(e))

    iv = get_iv()
    key = "G$$QawckGfaLB97r"

    # 将IV转换为字节串,用于加密
    iv_bytes = iv.encode()

    # 使用CBC模式进行AES加密
    cipher = AES.new(key.encode(), AES.MODE_CBC, iv_bytes)
    encrypted_bytes = cipher.encrypt(pad(text.encode(), AES.block_size))

    # 加密后的文本,按照JavaScript的格式化规则进行替换
    encrypted_text = base64.b64encode(encrypted_bytes).decode()
    encrypted_text = encrypted_text.replace('/', '_').replace('+', '-').replace('=', '~')
    return {
        "b": encrypted_text,
        "kiv": iv
    }


def getEncryptedText(text, iv):
    text = text.replace('_', '/').replace('-', '+').replace('~', '=')
    return getResponse(text, iv)


def getResponse(text, iv: str):
    # 你的加密密文,假设它是Base64编码的
    encrypted_text_base64 = text
    # 转换成bytes
    encrypted_text = base64.b64decode(encrypted_text_base64)

    key = "G$$QawckGfaLB97r"

    # 创建一个AES对象
    cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())

    # 解密并去除PKCS7填充
    decrypted_text = unpad(cipher.decrypt(encrypted_text), AES.block_size)

    # 转换成字符串形式
    decrypted_text_str = decrypted_text.decode('utf-8')
    return json.loads(decrypted_text_str)


# print(getEncryptedText(base["b"], base["kiv"]))

至此就成功了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值