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.mfbz.cn/a/188213.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符串转换成十进制整数

编程要求 输入一个以#结束的字符串&#xff0c;本题要求滤去所有的非十六进制字符&#xff08;不分大小写&#xff09;&#xff0c;组成一个新的表示十六进制数字的字符串&#xff0c;然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”&#xff0c;则…

【阿里云】图像识别 智能分类识别 增加网络控制功能点(三)

一、增加网络控制功能 实现需求TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。 查看当前系统的TCP KeepAlive参数修改TCP KeepAlive参数 三、C语言实现TCP KeepAlive功能 四、setsockopt用于设置套接字选项的系…

王者荣耀——Java

代码如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\Desk…

linux账户管理实例二

要求&#xff1a;我的 用户pro1&#xff0c;pro2&#xff0c;pro3是同一个项目开发人员&#xff0c;想让这三个人用户在同一个目录下工作&#xff0c;但这三个人拥有自己的主文件夹和基本的私有用户组&#xff0c;工作目录为/srv/projecta&#xff0c;如何实现&#xff1f; 分…

吴恩达《机器学习》10-1-10-3:决定下一步做什么、评估一个假设、模型选择和交叉验证集

一、决定下一步做什么 在机器学习的学习过程中&#xff0c;我们已经接触了许多不同的学习算法&#xff0c;逐渐深入了解了先进的机器学习技术。然而&#xff0c;即使在了解了这些算法的情况下&#xff0c;仍然存在一些差距&#xff0c;有些人能够高效而有力地运用这些算法&…

浅析智能电能表远程费控的推广及应用

安科瑞 华楠 摘 要: 电力资源是我国社会发展中一种必不可少的资源,随着我国经济的不断发展和人们生活水平的不断提升,对电力行业的要求也不断提升。因此,电力企业应该不断提升自身的服务水平和服务质量,强智能电能表远程费控的推广与应用,提升电力计量和收费工作的效率,提高电…

Java基础(第九期):Java中的集合 ArrayList 集合的增删改查 Java实现学生信息管理系统

⚠️Java基础专栏 文章目录 ⚠ Java基础最后一期&#xff08;第九期&#xff09;到此结束 Java中的集合一、什么是集合二、ArrayList2.1 ArrayList介绍2.2ArrayList使用2.3 ArrayList添加add&#xff08;&#xff09;方法add&#xff08;index&#xff0c;E element&#xff0…

4.28每日一题(二重积分比较大小:被积函数的大小、正负性、积分区间奇偶性)

一般比较大小的题目我们不需要把结果全部计算出来 &#xff0c;而是通过奇偶性或者被积函数的大小或大于0、等于0、小于0等方法判断比较

PostgreSQL 分区表插入数据及报错:子表明明存在却报不存在以及column “xxx“ does not exist 解决方法

PostgreSQL 分区表插入数据及报错&#xff1a;子表明明存在却报不存在以及column “xxx“ does not exist 解决方法 问题1. 分区表需要先创建子表在插入&#xff0c;创建子表立马插入后可能会报错子表不存在&#xff1b;解决&#xff1a; 创建子表及索引后&#xff0c;sleep10毫…

Linux的基本指令 ( 一 )

目录 前言 Linux基本指令 快速认识五个指令 ls指令 补充内容 pwd指令 补充内容 cd指令 补充内容 重新认识指令 指令的本质 which指令 alias指令 最后 一个文件的三种时间 tree指令及安装 tree指令 前言 关于Linux操作系统的桌面&#xff0c;在学校教学中我们…

【蓝桥杯】刷题

刷题网站 记录总结刷题过程中遇到的一些问题 1、最大公约数与最小公倍数 a,bmap(int,input().split())sa*bwhile a%b:a,bb,a%bprint(b,s//b)2.迭代法求平方根(题号1021) #include<stdio.h> #include<math.h> int main() {double x11.0,x2;int a;scanf("%d&…

FFmpeg零基础学习(一)——初步介绍与环境搭建

目录 前言正文一、开发环境二、搭建环境三、测试代码四、调用库的介绍End、遇到的问题2、Qt 在线安装容易报错&#xff0c;断开问题1、在线安装QMaintainTool很慢2、Qt5.15 无法调试FFmpeg 参考 前言 FFmpeg是一个开源的跨平台多媒体处理框架&#xff0c;它包含了一组用于处理…

MIPI 打怪升级之DSI篇

MIPI 打怪升级之DSI篇 目录 1 Overview2 DSI Mode 2.1 Video 模式2.2 Command 模式3 DSI Physical Layer 3.1 数据流控3.2 双向性3.3 Video Mode Interfaces3.4 Command Mode Interfaces3.5 Clock4 多通道管理 4.1 通道数匹配4.2 线上数据分布5 DSI 协议 5.1 包格式 5.1.1 短包…

上新!2023年汉字小达人市级比赛在线模拟题增加2个刷题试卷

各位小学三年级到五年级的上海学霸孩子们&#xff0c;刚刚结束了上海小学生古诗文大会的复赛&#xff0c;就紧锣密鼓地全身心投入到上海小学生汉字小达人的市级比赛的备赛中了。 为了助各位孩子一臂之力&#xff0c;我把在线模拟题进行了更新&#xff0c;新增了两个可以刷题的试…

SparkSQL之Optimized LogicalPlan生成过程

经过Analyzer的处理&#xff0c;Unresolved LogicalPlan已经解析成为Analyzed LogicalPlan。Analyzed LogicalPlan中自底向上节点分别对应Relation、Subquery、Filter和Project算子。   Analyzed LogicalPlan基本上是根据Unresolved LogicalPlan一对一转换过来的&#xff0c;…

细胞级浮游藻类智能检测系统

产品信息 新一代浮游藻类智能检测系统问世&#xff01;英视江河首次将藻类检测精度提升到细胞级&#xff01;英视江河致力于新一代浮游生物的识别、计数。特征是群体藻类和群体种个体均精准检测&#xff01;目前设备已在山东、宁夏、内蒙多地实际应用。 郑州英视江河生态环境科…

SpringBoot——配置及原理

优质博文&#xff1a;IT-BLOG-CN 一、Spring Boot全局配置文件 application.properties与application.yml配置文件的作用&#xff1a;可以覆盖SpringBoot配置的默认值。 ◀ YML&#xff08;is not a Markup Language&#xff1a;不仅仅是一个标记语言&#xff09;&#xff1…

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

论文阅读——Prophet(cvpr2023)

一、Framework 这个模型分为两阶段&#xff1a;一是答案启发生成阶段&#xff08;answer heuristics generation stage&#xff09;&#xff0c;即在一个基于知识的VQA数据集上训练一个普通的VQA模型&#xff0c;产生两种类型的答案启发&#xff0c;答案候选列表和答案例子&am…

强化学习,快速入门与基于python实现一个简单例子(可直接运行)

文章目录 一、什么是“强化学习”二、强化学习包括的组成部分二、Q-Learning算法三、迷宫-强化学习-Q-Learning算法的实现全部代码&#xff08;复制可用&#xff09;可用状态空间检查是否超出边界epsilon 的含义更新方程 总结 一、什么是“强化学习” 本文要记录的大概内容&am…
最新文章