某查查headers参数加密分析逆向

一,前言

网站:aHR0cHM6Ly93d3cucWNjLmNvbS9tYXA/a2V5Tm89MmQ3NjUyOWY0ZDk5ODdiZjdiNDk2NzcwYWE5ZGRlZmM=

分析的加密接口:aHR0cHM6Ly93d3cucWNjLmNvbS9hcGkvY29tcGFueS9nZXRMb2NhdGlvbj9rZXlObz0yZDc2NTI5ZjRkOTk4N2JmN2I0OTY3NzBhYTlkZGVmYwo=

二,网站分析

使用chrome浏览器打开指定网站,打开检查,选择网络,搜索加密接口关键词getLocation可看到对应的接口信息,我们可以可以发现随着请求而变化的数据仅有 headers 里的一对键值,且后台也仅对该变动键值做了二次校验。由于其看起来很像 Hash,索性就叫 hashKey:hashValue。

通过网络请求调用堆栈并没有发现相关的赋值代码,于是便想从代码搜索入手。例如此场景在 js 中的赋值语句通常为 headers[key] = value,搜索 headers[ 即可。

遂查看其网页源代码,发现 JavaScript 脚本文件都集中在路径 //xxxx-static.xxxx.com/qcc/pc-web/prod-25.03.47/ 中

搜索后发现此处最为可疑:在此断点调试看一下:

很明显可以发现,其临时变量 i 就是 hashKey,u则是 hashValue:

// 源代码
var i = (0,a.default)(t, e.data),
    u = (0,r.default)(t, e.data, (0,s.default)());
e.headers[i] = u;

// 其中
t = '/api/company/getLocation?keyNo=xxxxxxxxxxxxxxxxxxx';
e.data = null
(0,s.default)() = window.tid;

由此,我们只需要查看 a.default 与 r.default 的函数即可知道其哈希值的生成方法。

首先是生成 hashKey 的函数 a.default,通过多次断点,发现其调用堆栈如下:

// 第一层 a.default
function() {
    // t=请求URL,e=请求对象,n=请求对象json
    var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
      , t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase()
      , n = JSON.stringify(e).toLowerCase();
    // o.default 加密函数在最后提到
    return (0, o.default)(t + n, (0, a.default)(t))
    .toLowerCase().substr(8, 20)
};

// 第二层 a.default
function() {
    for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), t = e + e, n = "", i = 0; i < t.length; ++i) {
        var a = t[i].charCodeAt() % o.default.n;
        // 并非最后的加密函数 o.default
        n += o.default.codes[a]
    }
    return n
};

// 第二层 a.default 中的 o.default
o.default = {
    "n": 20,
    "codes": {
        "0": "W",
        "1": "l",
        "2": "k",
        "3": "B",
        "4": "Q",
        "5": "g",
        "6": "f",
        "7": "i",
        "8": "i",
        "9": "r",
        "10": "v",
        "11": "6",
        "12": "A",
        "13": "K",
        "14": "N",
        "15": "k",
        "16": "4",
        "17": "L",
        "18": "1",
        "19": "8"
    }
};

其次是 r.default:

function() {
    // n=请求URL,e=请求对象,t=tid,i=请求对象json
    var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
      , t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : ""
      , n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase()
      , i = JSON.stringify(e).toLowerCase();
    // o.default 加密函数在最后提到
    // a.default 即为刚提到的第二层函数
    return (0, o.default)(n + "pathString" + i + t, (0, a.default)(n))
};

其中,两个函数都调用了同一个 o.default,其堆栈如下:

// 第一层 o.default
function(e, t) {
    return (0, o.default)(e, t).toString()
};

// 第二层 o.default
return function(e, n) {
    // h 对象就是一个库,使用的 HMAC SHA512 加密算法
    // input:[e],key:[n]
    // 在线加密:https://www.idcd.com/tool/encrypt/hmac
    return new h.HMAC.init(t,n).finalize(e)
}

三,Ruby爬虫代码实现

使用代码成功获取正确IP信息

通过以上步骤,您可以顺利完成网站的测试过程。如果您在操作过程中遇到任何问题,或需要进一步的帮助,欢迎您在平台私信我,我会尽快为您解答。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟才能学的更多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值