xiaoWangLearn 发表于 2024-6-12 17:09

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

本帖最后由 xiaoWangLearn 于 2024-6-13 09:53 编辑

这里是找到了加密的签名算法,我通过jsrpc注入l.a.HmacSHA1

获取到了他的请求头构造,但是我将他的环境注入之后调用python还是会报错

请求的请求头,里面的加密参数我都对应测试过,注入环境之后的函数调用出来的结果和这上面的是一样的。



这是这个api的请求头

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

FitContent 发表于 2024-6-13 15:13

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

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




---



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

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

# 请求头的参数

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

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



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




各参数的生成逻辑如下:

```js
// 该变量 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`,它是在第一次打开范文面板时加载的,用于唯一标识某一篇范文!图片展示:






# JSRPC 实现的过程






# 测试结果

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




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

```python
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 被固定了哈。

```python
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)

```


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

991547436 发表于 2024-6-12 18:12
网站发出来看看

我还以为这上面不能发网址!
页: [1] 2
查看完整版本: 在逆向某个网址获取里面的资源的时候,加密参数报错