目 录CONTENT

文章目录

JS逆向案例005:某宝cookie sign签名模拟

克林空间
2024-04-14 / 0 评论 / 0 点赞 / 568 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-04-14,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

📌免责声明:本文章涉及到的代码仅供学习交流使用,不得用于任何商业用途,数据来源于互联网公开内容,没有获取任何私有和非公开权限的信息(个人信息等)。由此引发的任何法律纠纷与本人无关。禁止将本文技术或者本文所关联的Github项目源码用于任何除学习外的目的。如本文有任何侵权,请联系删除。

地址:https://zc-paimai.taobao.com/wow/pm/default/pc/zichansearch?keyword=%E4%BA%8C%E6%89%8B%E6%88%BF&page=1

分析页面

打开页面后,在开发者工具中查看头信息、载荷和返回值。然后通过requests进行访问测试。

确定目标

发现请求载荷中的sign值为必需携带的签名,是这次模拟的目标。

w2u0a

定位代码位置

搜索sign:关键字,定位到下图位置,设置断点后,刷新页面可以正常拦截,可以确定代码位置。

pmiev

分析实现算法

代码中代码可简化成如下伪码:

p = function(e){}(text)
# 其中function(e){}为算法,text为待加密字符串,输出结果为32位16进制密文

# 拆分开两部分进行分别分析
_hadoken = function(e){}
text = o.token + "&" + a + "&" + s + "&" + n.data

函数分析

根据加密后字符特性,猜测算法为MD5。将函数赋值给_hadoken变量,测试字符“1”的加密值跟MD5标准算法相同,所以可以确认算法为MD5标准算法。
qahw5

参数分析

然后分析参数值o.token + "&" + a + "&" + s + "&" + n.data,实际值如下图:
vvs9q
观察得知:
o.token为cookie里面的_m_h5_tk参数,访问网站后会自动获得,且值短期内不变。
gdthy

a为时间戳,可以直接生成。
s为appKey,应该是标识应用id,固定不变为12574478。
n.data的值跟查询表单相同,可以直接构造。
aiw8o

至此, 模拟算法已分析完成,可用python实现代码如下:


import requests
import hashlib
import time
import re

headers = {
    "authority": "h5api.m.taobao.com",
    "accept": "application/json",
    "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
    "cache-control": "no-cache",
    "content-type": "application/x-www-form-urlencoded",
    "origin": "https://zc-paimai.taobao.com",
    "pragma": "no-cache",
    "referer": "https://zc-paimai.taobao.com/",
    "sec-ch-ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"macOS\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
cookies = {
    "cna": "WHVfHEC+s0gCAXFo75AtW31b",
    "cookie2": "2684da5df27f5ac5f9d7f3332dad27af",
    "t": "e643beab1e45cf6e24d842d88d81c2d1",
    "_tb_token_": "f08437ebe3eae",
    "xlly_s": "1",
    "_m_h5_tk": "44faf6e4294578f14c7f8662a602ec23_1679041878217",
    "_m_h5_tk_enc": "38b523e9efd3584ecdfa56c775e020f6",
    "isg": "BPb2ETm6jlJDr319Fxfsn6IkRyr4FzpRCPe4eGDH_Fl0o5M9yafSYaUSu3_PCzJp",
    "l": "fBTFDzPcTWQP8CT1BO5Zourza77O3EAfCsPzaNbMiIEGa6a5GFwugNCsnHK6PdtjgTfxBeKy58T6YdIow34NixDDBe45AzmfSc99-bpU-L5..",
    "tfstk": "cKt1Bw1oeIKEaXm0j1ME3pR4JTIdCze5hV1MCffI3djEH-nfTo1cQu57W7T0MiWAd"
}
url = "https://h5api.m.taobao.com/h5/mtop.taobao.datafront.invoke.auctionwalle/1.0/"
params = {
    "jsv": "2.6.1",
    "appKey": "12574478",
    "t": "",
    "sign": "",
    "bxPageId": "1910955",
    "api": "mtop.taobao.datafront.invoke.auctionwalle",
    "v": "1.0",
    "type": "originaljson",
    "dataType": "json",
    "requiredParams": "dfApiName,dfUniqueId"
}
data = {
    "data": "{\"dfApp\":\"auctionwalle\",\"dfApiName\":\"auctionwalle.datou.getPageModulesData\",\"dfVariables\":\"{\\\"pageId\\\":1910955,\\\"moduleIds\\\":\\\"4394607430,4489817680,4480874310,2004318340,4529967930,2708524060,global\\\",\\\"context\\\":{\\\"keyword\\\":\\\"二手房\\\",\\\"page\\\":\\\"1\\\",\\\"userInfo\\\":\\\"{}\\\",\\\"sceneCode\\\":\\\"20210823QCG72BUD\\\",\\\"firstScreen\\\":\\\"true\\\",\\\"device\\\":\\\"pc\\\"}}\",\"dfUniqueId\":\"1910955.4394607430,4489817680,4480874310,2004318340,4529967930,2708524060,global\",\"dfVariablesRecover\":\"{}\"}"
}


def make_t():
    """
    时间戳
    :return:
    """
    temp_time = int(time.time() * 1000)
    params['t'] = str(temp_time)


def make_sign():
    """
    请求主要根据sign进行验证
    (o.token + "&" + a + "&" + s + "&" + n.data)
    token:来自于cookie
    a:当前时间戳
    s:appKey 12574478
    n.data: 请求参数data
    """

    make_t()

    token = cookies['_m_h5_tk'].split('_')[0]
    str_data = f"{token}&{params['t']}&12574478&{data['data']}"
    return hashlib.md5(str_data.encode(encoding='utf-8')).hexdigest()


def get_page():
    response = requests.post(url, headers=headers, cookies=cookies,
                             params=params,
                             data=data)
    return response.text


if __name__ == '__main__':
    params['sign'] = make_sign()
    print(params)
    data_text = get_page()
    print(data_text)

0

评论区