js逆向-某敏感网站登录参数分析

声明

本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负!

如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦!

前言

目标网站:aHR0cHM6Ly9tZGZnaGcuNXhwb2lqaHRmLmNvbS9kZWZhdWx0Lmh0bWwjLw==

接口:auth.login

参数分析

进入网站后点击登录,会有一个简单的验证码,输入之后才会提交登录参数。
在这里插入图片描述
可以看到这个参数很长,肉眼也看不懂不知道是什么东西,毫无疑问是进行了加密。

由于之前我已经分析过了网站,所以直接搜索json=即可定位到加密位置。

ps:最近发现在更新了新版本的谷歌后使用F12的搜索很多内容都搜索不到,上网查了查资料。
在这里插入图片描述

然后重启就可以了。

继续回归正题,通过关键字定位后:
在这里插入图片描述

观察代码后分别打上断点,重新触发。

单步调试,执行u函数。
在这里插入图片描述

一个JSON.stringify的功能,console中输出的参数信息密码是进行了加密,还获取了输入的验证码及验证码id,肯定是要拿到后端进行校验。
通过反复调试发现saltedPassword是动态变化的,截图中的盐值也能够看到这一点。

那么现在的需求就比较明确了,首先将输入的明文密码加密,然后再组装成一个对象,进行一堆乱七八糟的计算当做参数提交由后端验证。

首先查看密码的加密算法,搜索一下关键字。
在这里插入图片描述

在这里插入图片描述
盐就是当前时间戳,token是密文密码,进行了sha1加盐的双重哈希。(算法见下文)
搞清楚了密码的算法后,就到了登陆提交的表单参数了,其中id值为:
在这里插入图片描述

比较简单,没什么说的。
跟了一遍u函数发现还是一个JSON.stringify的操作。
继续就到了加密表单数据的位置:

E = "json=" + Object(m.a)(l.a.stringify(_).slice(5)) + "|" + t.id;

剩下的就是单步然后把代码抠出来,直接放在最下面了。

算法还原

直接把代码拉下来就可以使用

var r = "=", i = 8;function a(t, e) {t[e >> 5] |= 128 << 24 - e % 32,t[15 + (e + 64 >> 9 << 4)] = e;for (var n = Array(80), r = 1732584193, i = -271733879, a = -1732584194, c = 271733878, _ = -1009589776, l = 0; l < t.length; l += 16) {for (var h = r, f = i, g = a, p = c, m = _, y = 0; y < 80; y++) {n[y] = y < 16 ? t[l + y] : d(n[y - 3] ^ n[y - 8] ^ n[y - 14] ^ n[y - 16], 1);var E = u(u(d(r, 5), o(y, i, a, c)), u(u(_, n[y]), s(y)));_ = c,c = a,a = d(i, 30),i = r,r = E}r = u(r, h),i = u(i, f),a = u(a, g),c = u(c, p),_ = u(_, m)}return Array(r, i, a, c, _)
}function o(t, e, n, r) {return t < 20 ? e & n | ~e & r : t < 40 ? e ^ n ^ r : t < 60 ? e & n | e & r | n & r : e ^ n ^ r
}function s(t) {return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514
}function u(t, e) {var n = (65535 & t) + (65535 & e);return (t >> 16) + (e >> 16) + (n >> 16) << 16 | 65535 & n
}function d(t, e) {return t << e | t >>> 32 - e
}function c(t) {for (var e = Array(), n = (1 << i) - 1, r = 0; r < t.length * i; r += i)e[r >> 5] |= (t.charCodeAt(r / i) & n) << 32 - i - r % 32;return e
}function _(t) {for (var e = "", n = 0; n < 4 * t.length; n += 3)for (var i = (t[n >> 2] >> 8 * (3 - n % 4) & 255) << 16 | (t[n + 1 >> 2] >> 8 * (3 - (n + 1) % 4) & 255) << 8 | t[n + 2 >> 2] >> 8 * (3 - (n + 2) % 4) & 255, a = 0; a < 4; a++)8 * n + 6 * a > 32 * t.length ? e += r : e += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(i >> 6 * (3 - a) & 63);return e
}var encode = {Encode: function () {var t = this, e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";this.encodeBase64 = function (t) {var n, r, i, a, o, s, u, d = "", c = 0;for (t = function (t) {t = t.replace(/\r\n/g, "\n");for (var e = "", n = 0; n < t.length; n++) {var r = t.charCodeAt(n);r < 128 ? e += String.fromCharCode(r) : r > 127 && r < 2048 ? (e += String.fromCharCode(r >> 6 | 192),e += String.fromCharCode(63 & r | 128)) : (e += String.fromCharCode(r >> 12 | 224),e += String.fromCharCode(r >> 6 & 63 | 128),e += String.fromCharCode(63 & r | 128))}return e}(t); c < t.length;)a = (n = t.charCodeAt(c++)) >> 2,o = (3 & n) << 4 | (r = t.charCodeAt(c++)) >> 4,s = (15 & r) << 2 | (i = t.charCodeAt(c++)) >> 6,u = 63 & i,isNaN(r) ? s = u = 64 : isNaN(i) && (u = 64),d = d + e.charAt(a) + e.charAt(o) + e.charAt(s) + e.charAt(u);return d},this.encodeSha1 = function (t) {return _(a(c(e = t), e.length * i));var e},this.encodePsw = function (e) {var n = (new Date).getTime();return {salt: n,token: t.encodeSha1(t.encodeSha1(e) + n)}}}
};var myA = new encode.Encode()
result = myA.encodePsw('明文密码')
console.log(result)

生成id代码:

function getIdentity() {return (new Date).getTime().toString().slice(2) + "" + Math.floor(900 * Math.random() + 100) + __WEBPACK_IMPORTED_MODULE_13__store__.a.getters.uid // __WEBPACK_IMPORTED_MODULE_13__store__.a.getters.uid = ''
}

l.a.stringify(_)代码:

function u_ (e, n, i, o, a, u, c, f, l, d, h, p) {var v = e;var s = {"delimiter": "&","encode": true,"encodeValuesOnly": false,"skipNulls": false,"strictNullHandling": false,encoder:function(t) {if (0 === t.length)return t;for (var e = "string" == typeof t ? t : String(t), n = "", r = 0; r < e.length; ++r) {var o = e.charCodeAt(r);45 === o || 46 === o || 95 === o || 126 === o || o >= 48 && o <= 57 || o >= 65 && o <= 90 || o >= 97 && o <= 122 ? n += e.charAt(r) : o < 128 ? n += i[o] : o < 2048 ? n += i[192 | o >> 6] + i[128 | 63 & o] : o < 55296 || o >= 57344 ? n += i[224 | o >> 12] + i[128 | o >> 6 & 63] + i[128 | 63 & o] : (r += 1,o = 65536 + ((1023 & o) << 10 | 1023 & e.charCodeAt(r)),n += i[240 | o >> 18] + i[128 | o >> 12 & 63] + i[128 | o >> 6 & 63] + i[128 | 63 & o])}return n},serializeDate: function(t) {return a.call(t)}}if ("function" == typeof c)v = c(n, v);else if (v instanceof Date)v = d(v);else if (null === v) {if (o)return u && !p ? u(n, s.encoder) : n;v = ""}if ("string" == typeof v || "number" == typeof v || "boolean" == typeof v || r.isBuffer(v))return u ? [h(p ? n : u(n, s.encoder)) + "=" + h(u(v, s.encoder))] : [h(n) + "=" + h(String(v))];var m, g = [];if (void 0 === v)return g;if (Array.isArray(c))m = c;else {var y = Object.keys(v);m = f ? y.sort(f) : y}for (var w = 0; w < m.length; ++w) {var b = m[w];a && null === v[b] || (g = Array.isArray(v) ? g.concat(t(v[b], i(n, b), i, o, a, u, c, f, l, d, h, p)) : g.concat(t(v[b], n + (l ? "." + b : "[" + b + "]"), i, o, a, u, c, f, l, d, h, p)))}return g
};
array_i = function() {for (var t = [], e = 0; e < 256; ++e)t.push("%" + ((e < 16 ? "0" : "") + e.toString(16)).toUpperCase());return t
}();
function l_a_stringify(t, e) {var i = {default: "RFC3986",formatters: {RFC1738: function(t) {return r.call(t, i, "+")},RFC3986: function(t) {return t}},RFC1738: "RFC1738",RFC3986: "RFC3986"};var o ={brackets: function(t) {return t + "[]"},indices: function(t, e) {return t + "[" + e + "]"},repeat: function(t) {return t}}var a = Date.prototype.toISOString;var s = {"delimiter": "&","encode": true,"encodeValuesOnly": false,"skipNulls": false,"strictNullHandling": false,encoder:function(t) {if (0 === t.length)return t;for (var e = "string" == typeof t ? t : String(t), n = "", r = 0; r < e.length; ++r) {var o = e.charCodeAt(r);45 === o || 46 === o || 95 === o || 126 === o || o >= 48 && o <= 57 || o >= 65 && o <= 90 || o >= 97 && o <= 122 ? n += e.charAt(r) : o < 128 ? n += array_i[o] : o < 2048 ? n += array_i[192 | o >> 6] + array_i[128 | 63 & o] : o < 55296 || o >= 57344 ? n += array_i[224 | o >> 12] + array_i[128 | o >> 6 & 63] + array_i[128 | 63 & o] : (r += 1,o = 65536 + ((1023 & o) << 10 | 1023 & e.charCodeAt(r)),n += array_i[240 | o >> 18] + array_i[128 | o >> 12 & 63] + array_i[128 | o >> 6 & 63] + array_i[128 | 63 & o])}return n},serializeDate: function(t) {return a.call(t)}}var n = t, a = e ? r.assign({}, e) : {};if (null !== a.encoder && void 0 !== a.encoder && "function" != typeof a.encoder)throw new TypeError("Encoder has to be a function.");var c = void 0 === a.delimiter ? s.delimiter : a.delimiter, f = "boolean" == typeof a.strictNullHandling ? a.strictNullHandling : s.strictNullHandling, l = "boolean" == typeof a.skipNulls ? a.skipNulls : s.skipNulls, d = "boolean" == typeof a.encode ? a.encode : s.encode, h = "function" == typeof a.encoder ? a.encoder : s.encoder, p = "function" == typeof a.sort ? a.sort : null, v = void 0 !== a.allowDots && a.allowDots, m = "function" == typeof a.serializeDate ? a.serializeDate : s.serializeDate, g = "boolean" == typeof a.encodeValuesOnly ? a.encodeValuesOnly : s.encodeValuesOnly;if (void 0 === a.format)a.format = i.default;else if (!Object.prototype.hasOwnProperty.call(i.formatters, a.format))throw new TypeError("Unknown format option provided.");var y, w, b = i.formatters[a.format];"function" == typeof a.filter ? n = (w = a.filter)("", n) : Array.isArray(a.filter) && (y = w = a.filter);var _, D = [];if ("object" != typeof n || null === n)return "";_ = a.arrayFormat in o ? a.arrayFormat : "indices"in a ? a.indices ? "indices" : "repeat" : "indices";var S = o[_];y || (y = Object.keys(n)),p && y.sort(p);for (var M = 0; M < y.length; ++M) {var x = y[M];l && null === n[x] || (D = D.concat(u_(n[x], x, S, f, l, d ? h : null, w, p, v, m, b, g)))}var O = D.join(c), k = !0 === a.addQueryPrefix ? "?" : "";return O.length > 0 ? k + O : ""
}var _ = {"json": "{\"id\":\"00914528435406\",\"jsonrpc\":\"2.0\",\"method\":\"auth.login\",\"params\":{\"sn\":\"wy12\",\"loginId\":\"手机号\",\"saltedPassword\":\"密码\",\"salt\":盐值,\"captchaKey\":\"3763286221\",\"captchaCode\":\"5864\",\"withAuth\":\"1\",\"withProfile\":\"1\",\"withBalance\":\"1\",\"terminal\":1,\"host\":\"mdfghg.5xpoijhtf.com\",\"fingerOSModel\":\"Chrome 117.0.0.0 | Windows 10\",\"ztsLang\":\"zh\"}}"
}
console.log(l_a_stringify(_)) 

Object(m.a)代码:

function object_m_a(t) {var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function n(t, e) {return Math.floor(Math.random() * (e - t)) + t}var r = function(t) {for (var r = Array(t), i = e.slice(0, 52), a = 0; a < r.length; a++)r[a] = i[n(0, i.length)];return r.join("")}(24), i = function(t) {var n, r, i, a, o, s, u, d = "", c = 0;for (t = function(t) {t = t.replace(/\r\n/g, "\n");for (var e = "", n = 0; n < t.length; n++) {var r = t.charCodeAt(n);r < 128 ? e += String.fromCharCode(r) : r > 127 && r < 2048 ? (e += String.fromCharCode(r >> 6 | 192),e += String.fromCharCode(63 & r | 128)) : (e += String.fromCharCode(r >> 12 | 224),e += String.fromCharCode(r >> 6 & 63 | 128),e += String.fromCharCode(63 & r | 128))}return e}(t); c < t.length; )a = (n = t.charCodeAt(c++)) >> 2,o = (3 & n) << 4 | (r = t.charCodeAt(c++)) >> 4,s = (15 & r) << 2 | (i = t.charCodeAt(c++)) >> 6,u = 63 & i,isNaN(r) ? s = u = 64 : isNaN(i) && (u = 64),d = d + e.charAt(a) + e.charAt(o) + e.charAt(s) + e.charAt(u);return d}(t);return "pwv|13|" + function(t, e) {for (var n = "", r = 0, i = 0; i < e.length; i++) {var a = t.charCodeAt(r % t.length), o = e.charCodeAt(i), s = o;o >= 65 && o <= 90 && (a >= 65 && a <= 90 && (s = (a - 65 + (o - 65)) % 26 + 65),a >= 97 && a <= 122 && (s = (a - 97 + (o - 65)) % 26 + 65),r++),o >= 97 && o <= 122 && (a >= 65 && a <= 90 && (s = (a - 65 + (o - 97)) % 26 + 97),a >= 97 && a <= 122 && (s = (a - 97 + (o - 97)) % 26 + 97),r++),n += String.fromCharCode(s)}return n}(r + "wxfEZdkAYYyBqbnMN", i) + "|" + r}

总结

此网站内容还是比较简单,我这里分析的比较乱,自己分析的话可以参考一下。
另外,登陆的验证码可以使用python的ddddocr,然后把整个流程串通起来就可以实现登陆了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五种多目标优化算法(MSSA、MOAHA、MOPSO、NSGA3、NSGA2)求解微电网多目标优化调度(MATLAB)

一、多目标优化算法简介 &#xff08;1&#xff09;多目标鳟海鞘算法MSSA 多目标优化算法&#xff1a;多目标鳟海鞘算法&#xff08;Multi-objective Salp Swarm Algorithm &#xff0c;MSSA&#xff09;-CSDN博客 参考文献&#xff1a; S. Mirjalili, A.H. Gandomi, S.Z. M…

flex布局实战之自动填充剩余

案例目标 文字部分自适应并且居中 图中是一个弹窗&#xff0c;我现在使用flex的布局来实现&#xff0c;标题和关闭按钮。因为是uni-app,所以标签是view 。你可以自行替换为 代码 <view class"popup-box"><view class"title"><view class&…

线程的状态以及状态转移

一. 线程的状态 NEW: 线程刚被创建, 但是并未启动. 还没调用start方法.RUNNABLE: 这里没有区分就绪和运行状态. 因为对于Java对象来说, 只能标记为可运行, 至于什么时候运行, 不是JVM来控制的了, 是OS来进行调度的, 而且时间非常短暂, 因此对于Java对象的状态来说, 无法区分.T…

97、Text2NeRF: Text-Driven 3D Scene Generation with Neural Radiance Fields

简介 论文地址 使用扩散模型来推断文本相关图像作为内容先验&#xff0c;并使用单目深度估计方法来提供几何先验&#xff0c;并引入了一种渐进的场景绘制和更新策略&#xff0c;保证不同视图之间纹理和几何的一致性 实现流程 简单而言&#xff1a; 文本-图片扩散模型生成一…

STM32入门学习(一):STM32 简介与软件安装

参考引用 STM32 入门教程-江科协 1. STM32 简介 1.1 STM32 套件介绍 1.2 STM32 简介 STM32 是 ST 公司基于 ARM Cortex-M 内核开发的 32 位微控制器 应用&#xff1a;嵌入式领域&#xff0c;如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 1.3 ARM …

go对rabbitmq基本操作

一、安装rabbitmq 1、直接使用docker拉取镜像 docker pull rabbitmq:3.82、启动容器 docker run \-e RABBITMQ_DEFAULT_USERadmin \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name rabbit01 \--hostname rabbit01 --restartalways \-p 15672:15672 \-p 5672:…

《C++PrimePlus》第9章 内存模型和名称空间

9.1 单独编译 Visual Studio中新建头文件和源代码 通过解决方案资源管理器&#xff0c;如图所示&#xff1a; 分成三部分的程序&#xff08;直角坐标转换为极坐标&#xff09; 头文件coordin.h #ifndef __COORDIN_H__ // 如果没有被定义过 #define __COORDIN_H__struct pola…

【开源】基于Vue.js的城市桥梁道路管理系统的设计和实现

项目编号&#xff1a; S 025 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S025&#xff0c;文末获取源码。} 项目编号&#xff1a;S025&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…

学生信息管理系统程序Python

系统主界面 在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;有两种方法&#xff0c; 一种是输入1&#xff0c;另一种是按下键盘上的↑或↓方向键进行选择。这两种方法的结果是一样的&#xff0c;所以使用哪种方法都可以。 &#xff08;…

时间序列预测 — Informer实现多变量负荷预测(PyTorch)

目录 1 实验数据集 2 如何运行自己的数据集 3 报错分析 1 实验数据集 实验数据集采用数据集4&#xff1a;2016年电工数学建模竞赛负荷预测数据集&#xff08;下载链接&#xff09;&#xff0c;数据集包含日期、最高温度℃ 、最低温度℃、平均温度℃ 、相对湿度(平均) 、降雨…

什么是零拷贝 、零拷贝优化方案 - 真正的零拷贝,哪些地方会用到零拷贝技术

文章目录 什么是零拷贝3、零拷贝优化方案 - 真正的零拷贝哪些地方会用到零拷贝技术 现在来谈谈零拷贝&#xff0c;以及在开发中哪些地方使用到零拷贝。 开干… 什么是零拷贝 零拷贝指的是&#xff0c;从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底…

徕芬不是满分:自称超越戴森,用户称多次故障,品控仍是老大难?

撰稿|行星 来源|贝多财经 “双十一”购物节落下帷幕后&#xff0c;各大品牌纷纷公布“战报”。其中&#xff0c;高速吹风机品牌徕芬&#xff08;也称“徕芬科技”&#xff09;销售额超4.4亿元&#xff0c;全系产品销量超过80万台&#xff0c;高速吹风机系列单品(LF03、SE)销售…

来自Microsoft Teams的摄像头背景图片

原文件在&#x1f446;&#xff0c;下面是预览图 如果你安装了Microsoft Teams也可以搜索MSTeams&#xff0c;就在MSTeams/Backgrounds

【anaconda】numpy.dot 向量点乘小技巧

假设向量A[1,1], 向量B[2,3]。如果想知道他们的内积就可以输入如下代码: 当然&#xff0c;如果是两个列向量相乘&#xff0c;肯定是不对的 但是如果没有维度也一样可以求得内积&#xff0c;而且结果不会套在列表里

AI和人工智能与机器学习全景报告

今天分享的是AI系列深度研究报告&#xff1a;《AI和人工智能与机器学习全景报告》。 &#xff08;报告出品方&#xff1a;appen&#xff09; 报告共计&#xff1a;30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如&#xff0c;特定用例的数据可能不足…

Day02嵌入式---按键控灯

一、简单介绍 按键控制灯开关是一种常见的嵌入式系统示例项目&#xff0c;它通常用于演示嵌入式系统的基本控制能力。该项目由一个或多个LED和一个按键组成。通过按下按键&#xff0c;可以控制LED的开关状态&#xff0c;从而实现灯的亮灭控制。 二、查看功能手册 2.1 查看硬件…

基于单片机压力传感器MPX4115检测-报警系统proteus仿真+源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、MPX4115采集压力值、DS18B20采集温度值送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /*********************************…

鸿蒙开发之android开发人员指南《基础知识》

基于华为鸿蒙未来可能不再兼容android应用&#xff0c;推出鸿蒙开发系列文档&#xff0c;帮助android开发人员快速上手鸿蒙应用开发。 1. 鸿蒙使用什么基础语言开发&#xff1f; ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风…

【免费使用】基于PaddleSeg开源项目开发的人像抠图Web API接口

基于PaddleSeg开源项目开发的人像抠图API接口&#xff0c;服务器不存储照片大家可放心使用。 1、请求接口 请求地址&#xff1a;http://apiseg.hysys.cn/predict_img 请求方式&#xff1a;POST 请求参数&#xff1a;{"image":"/9j/4AAQ..."} 参数是jso…

与Windows 10更新大同小异!一步一步教你如何更新Windows 11

如果你想让你的Windows 11设备获得最佳性能&#xff0c;那么定期更新是至关重要的。即使是最好的电脑如果不更新也会受到影响&#xff0c;因为更新会应用软件调整&#xff0c;帮助你的设备更快、更平稳地运行。它还提高了安全性&#xff0c;意味着你可以从Microsoft的最新功能中…