JS逆向 - volaris航司(注册表单加密)

发布于:2025-08-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

逆向:JS逆向 - volaris航司(注册表单加密)

URL:aHR0cHM6Ly93d3cudm9sYXJpcy5jb20vYWdlbmN5L3JlZ2lzdGVy

在这里插入图片描述

整体架构流程

提示:分析位置

1、首先进行XHR断点:createaccount

在这里插入图片描述

2、往上跟栈你会发现,生成的地方在:const hi = lt.serializeBody();

在这里插入图片描述

3、跟栈进去发现没头绪了,里面是一个class定义的序列化对象,实例化进去的body是一个JSON对象明文

在这里插入图片描述

4、到这里,发现往后面跟也比较难跟到加密的地方,那么我们可以想想什么是序列化操作,它是不是得把JSON格式的对象转换成字符串,然后进行加密呢,所以直接hook

parse1 = JSON.stringify;
JSON.stringify = function(){
    console.log('stringify:',arguments[0]);
    debugger;
    return parse1(arguments[0]);
};

在这里插入图片描述

5、当我们hook到json.stringify里面传入的是刚刚那个this.body发现它后面就是加密了

  • AES标准加密:key、iv随机
  • RSA加密:key 接口返回
    提示:publickey返回接口:volarisAppConfig.json
const CryptoJS = require('crypto-js');
const forge = require('node-forge');


publicKey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvAtc+ZqEbkSH1cRpTEe/w5vA70gn1CgVEEQYkkwIfpZrLAb5/S3bMLTuCZd46nSeK6GU49fZiEPESg1Z1+zrD3FZkHtOgQUFzB+9cifBrMYT1sdCZ5YLkP+U1F4B7/ItdAipsSyJFRP7Y8vlyJTRGTCgmE4wTZJf2G4U0FKfpbSZ2BQuAEqb4xEQsJoTsuRaF7uH85+hvr/hIfssgVJO1VZ6zC8qPY7VKCKmA6GHed9UdNOPfl/GNm+xYeE/FKMw0H1AfPa4JjM5pvMdTcpKYmJVE09zSzPZilSqu5ya1IvzRCURvT8Xh6bIQY53BVoyMQZJSuEFvn8gkL/nMc92/wIDAQAB-----END PUBLIC KEY-----"
encrypt = function (R) {
    var _ = CryptoJS,keySize = 128,iterations = 100;
    const $ = _.lib.WordArray.random(keySize / 8)
      , V = _.lib.WordArray.random(keySize / 8)
      , X = _.PBKDF2(V, $, {
        keySize: keySize / 32,
        iterations: iterations
    })
      , Y = _.lib.WordArray.random(keySize / 8)
      , se = _.AES.encrypt(R, X, {
        iv: Y,
        padding: _.pad.Pkcs7,
        mode: _.mode.CBC
    })
      , J = forge.pki.publicKeyFromPem(publicKey)
    , ke = [];
    debugger;
    return ke.push(btoa(J.encrypt(_.enc.Base64.stringify(Y.concat(X))))),
    ke.push(_.enc.Base64.stringify(se.ciphertext)),
    ke.toString()
}

function get_bdoy() {

    body = {自己填}

    const $ = JSON.stringify(body);
    let V = [];
    for (let Y in $)
        $.hasOwnProperty(Y) && "string" == typeof $[Y] && V.push(String.fromCharCode($.charCodeAt(Y) + 1));
    const X = encrypt(JSON.stringify(V.join("")));
    return JSON.stringify(X)
}
console.log(get_bdoy())

提示:这里注意node版本得使用20版本以下的(最好18.18.0),不然加密不对

技术名词解释

提示:请求头authorization:jwt

session接口返回(无加密):存在请求链强校验,不然就406

createaccount接口(表单加密):存在请求链校验,加密错误返回500,reCaptcha失效或者错误返回400

captchaResponse:recaptchaV2验证返回

在这里插入图片描述

小结

提示:学习交流主页,星球持续更新中:(+星球主页+v)


网站公告

今日签到

点亮在社区的每一天
去签到