吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 674|回复: 12
收起左侧

[求助] 在逆向某个网址获取里面的资源的时候,加密参数报错

[复制链接]
xiaoWangLearn 发表于 2024-6-12 17:09
本帖最后由 xiaoWangLearn 于 2024-6-13 09:53 编辑

这里是找到了加密的签名算法,我通过jsrpc注入l.a.HmacSHA1
图片.png
获取到了他的请求头构造,但是我将他的环境注入之后调用python还是会报错
图片.png
请求的请求头,里面的加密参数我都对应测试过,注入环境之后的函数调用出来的结果和这上面的是一样的。
图片.png
图片.png
图片.png
这是这个api的请求头

补充:网址:https://miaobi.xinhuaskl.com/,请求的是https://miaobi.xinhuaskl.com/api/smartWriting/materiaDetail,POST请求方式,获取里面的数据
js逆向的是这个网址里面的数据请求

图片.png
PixPin_2024-06-13_09-51-17.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

FitContent 发表于 2024-6-13 15:13
本帖最后由 FitContent 于 2024-6-13 15:31 编辑

先给楼主提一个建议!虽然楼主给出了网站、请求的 API 接口,但是没说怎么触发这个接口呀……

image-20240613132629901.png


从楼主的描述来看,我也不清楚楼主到底做了什么工作,如果是通过 JSRPC 调用 l.a.HmacSHA1 是不够的,下面我完整的说明流程。

POST 需要的参数有请求头参数和提交的 payload 两个部分。

请求头的参数

可以确定的请求头参数有以下几个:

Apisign-Appid
Apisign-Nonce
Apisign-Sign
Apisign-Timestamp
App-Terminal-Type
Auth-Token

它的生成位置就是在 l.a.HmacSHA1  的位置,如下是图片对比:

image-20240613140449154.png

各参数的生成逻辑如下:

// 该变量 w 对应上图中的 timestamp 参数,它是时间戳
var w = (new Date).getTime();

// 该变量 y 对应上图中的 nonce 参数,它是随机字符串
var y = Math.random().toString(36).substr(3);

// 该变量 f 就是 l.a.HmacSHA1 函数的第一个参数,注意它的形式:
// 这是 f 的值:/smartWriting/materiaDetail{"id":"q9D35YYBqqkzjz0QbJFN"}1718258710216yfg1bl7v2e
// 从结果来看,它的组成是如下:
var f = '/smartWriting/materiaDetail' + '{"id":"id值,这个 ID 值就是 POST 提交的 ID 值"}' + w + y

// 然后可以调用 l.a.HmacSHA1 生成 Q,从而生成 L,最后生成上图中的 signature 参数

所以,如果想要 JSRPC 调用 l.a.HmacSHA1,需要的就是 POST 提交的那个 id 值!

POST 提交的数据

这个提交的数据其实就是要生成范文的 ID,它是在第一次打开范文面板时加载的,用于唯一标识某一篇范文!图片展示:

image-20240613142041552.png

JSRPC 实现的过程

image-20240613142938900.png

测试结果

为了测试整个流程,我并没有搭建 jsrpc 环境,反而从 l.a.HmacSHA1 这个名称出发,在本地实现了。

image-20240613144507233.png

使用 python 的标准库 hmac 进行 HmacShA1 加密。

import hmac
import hashlib
import base64

def get_signature(f: str, key: str):
    # 创建一个新的 HMAC 对象
    h = hmac.new(key.encode(), f.encode(), hashlib.sha1)
    result = base64.b64encode(h.digest()).decode()
    return result

# 经过测试,与网站加密结果一致
signature = get_signature(
    '/smartWriting/materiaDetail{"id":"q9D35YYBqqkzjz0QbJFN"}1718260842263jm2r884t6e',
    "wqKOwI3iZ46vVarlZhljNy8H9WPwmK61",
)

最后是完整的代码,注意,范文 ID 被固定了哈。

import requests
import json
import time
import hmac
import hashlib
import base64
import random
import string
from urllib.parse import quote

def get_w():
    return str(int(time.time() * 1000))

def get_y():
    # y 是随机的字符串,如果短时间内发出的请求中, y 是相同的,则会判定为重复请求
    # 感谢 GPT 生成代码
    result = "".join(random.choices(string.ascii_letters + string.digits, k=10))
    return result

def get_f(url: str, id: str, w: str, y: str):
    # 生成规律如:/smartWriting/materiaDetail{"id":"q9D35YYBqqkzjz0QbJFN"}1718258710216yfg1bl7v2e
    return f'{url}{{"id":"{id}"}}{w}{y}'

def get_signature(f: str, key: str):
    # 感谢 GPT 生成代码
    # 创建一个新的 HMAC 对象
    h = hmac.new(key.encode(), f.encode(), hashlib.sha1)
    result = base64.b64encode(h.digest()).decode()
    print(result)
    return quote(result)

# 范文的 id 已经被固定了哈
materia_id = "q9D35YYBqqkzjz0QbJFN"

w = get_w()
y = get_y()
f = get_f(
    url="/smartWriting/materiaDetail",
    id=materia_id,
    w=w,
    y=y,
)
signature = get_signature(
    f=f,
    key="wqKOwI3iZ46vVarlZhljNy8H9WPwmK61",
)
headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7",
    # 从 cookie 获取
    "Auth-Token": ". . .",
    "Cache-Control": "no-cache",
    "Channel-Customization-Id": "2",
    "Connection": "keep-alive",
    "Content-Type": "application/json;charset=UTF-8",
    "Origin": "https://miaobi.xinhuaskl.com",
    "Pragma": "no-cache",
    "Referer": "https://miaobi.xinhuaskl.com/ai-writing?mode=writing",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
    "apiSign-appId": "96aF61WQ",  # 固定
    "apiSign-nonce": y,
    "apiSign-sign": signature,
    "apiSign-timestamp": w,
    "app-terminal-type": "pc",
    "sec-ch-ua": '"Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Windows"',
}
cookies = {
    "Hm_lvt_bbacc385fc90fe61e409cc9099275f8a": "1718255506",
    "Hm_lpvt_bbacc385fc90fe61e409cc9099275f8a": "1718255612",
    "Auth-Token-Btmb": ". . .", 
}
url = "https://miaobi.xinhuaskl.com/api/smartWriting/materiaDetail"
# 范文的 id 被固定了
data = {"id": materia_id}
data = json.dumps(data, separators=(",", ":"))
response = requests.post(url, headers=headers, cookies=cookies, data=data)

print(response.text)
print(response)

image-20240613151117556.png

DJxiaojun 发表于 2024-6-12 18:36
你有点高估各位老铁了吧    没网址你以为大家能凭意念解吗 哈哈啊
991547436 发表于 2024-6-12 18:12
48325619 发表于 2024-6-12 18:26
看图猜网站吗?
star0angel 发表于 2024-6-12 21:01
大神 眼睛都看瞎了 图也这么小哈哈
FitContent 发表于 2024-6-12 22:17

额,既然 JSRPC 的结果和实际请求中的参数值相同,说明 JSRPC 没有问题,出问题极大可能是其它的地方。

如果网站不方便发出来的话,至少也要将相关的 JS 代码等复制过来 —— 至少也要尽可能给大家一个可以进行测试、调试的东西,不然只能依靠经验来猜测了。

而我做出如下大胆的猜测:楼主是忽略了其它的参数。也许楼主肯定自己没有漏掉什么……这个就不好说了,我自己写程序时,偶尔简单的 bug 也看不出来,需要调试才能发现。

Jin_bao 发表于 2024-6-12 23:28
hmacsha1加密 然后base64 url编码
ljl727ljl 发表于 2024-6-12 23:59

老大推荐的,必是精品。
 楼主| xiaoWangLearn 发表于 2024-6-13 09:44

我还以为这上面不能发网址!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表