python+JS 实现逆向 SMZDM 的登录加密

作者:??梦想橡皮擦???? 时间:2023-09-22 05:38:55 

实战场景

这次被我们盯上的平台是【SMZDM】。

本次目标站点是:aHR0cHM6Ly93d3cuc216ZG0uY29tLw==

正式开始前,先注册一个账号,然后模拟一下登录,看一下有哪些参数被偷偷的藏起来了~

当看到登录之后的所有请求参数时,我们还是默默的把站点关闭,撤吧。

python+JS 实现逆向 SMZDM 的登录加密

从上图可以看到usernamepassword是重要加密区,geetest_开头的参数是下述点选验证码涉及的内容,本阶段不做拆解,可以持续关注后续验证码部分逻辑。

登录的点选验证码可以先忽略,这个阶段搞定它不是很容易。

python+JS 实现逆向 SMZDM 的登录加密

接口请求参数是:

  • 请求网址: zhiyou.smzdm.com/user/login/ajax_normal_check

  • 请求方法: POST

参数分析

本次我们先不添加断点,先通过请求启动器进行分析,打开该链接的请求调用堆栈,然后依次分析相关地址。

python+JS 实现逆向 SMZDM 的登录加密

 根据经验可以发现有一个common_submit函数,其所在的文件是window.js,可以重点关注。

接下来添加一个 XHR 断点,关键字是login/ajax_normal_check

断点打住之后,可以直接进入目标函数:

python+JS 实现逆向 SMZDM 的登录加密

结果直接找到了相关加密逻辑,如下图所示:

python+JS 实现逆向 SMZDM 的登录加密

核心代码进行提取,然后进一步进行分析。

var _ = login_obj.encryptPassword(i);
(i = _), (r = btoa(r));

结果发现login_obj.encryptPassword函数竟然调用了一个新的接口。

encryptPassword: function(r) {
       var t = null;
       return $.ajax({
           url: "//zhiyou.smzdm.com/user/login/pre",
           type: "get",
           async: !1,
           dataType: "json"
       }).done(function(e) {
           var o;
           t = e && 0 != e.error_code ? null : ((o = new JSEncrypt).setPublicKey(atob(e.data.pub_key)),
           o.encrypt(r))
       }),
       t
   },

关于账号使用的是 js btoa,这个没有什么特别的,就是简单的 base64 加密

通过开发者控制台,测试使用 btoa加密 12345,然后在通过 Python 进行相同的加密。

python+JS 实现逆向 SMZDM 的登录加密

import base64
wtext = "12345"
# 编码
a = base64.b64encode(wtext.encode())
print(a.decode()) # 输出 MTIzNDU=

二者结果一致,username参数解决。

下面继续看password参数,密码加密的流程是:

  • 通过一个 API 获取 pub_key

  • 对 pub_key进行atob编码;

  • 设置JSEncryptRSAKey加密 KEY;

  • 对用户密码进行加密。

测试 pub_key 加密接口是否可以直接调用

import requests
headers = {
   "Host": "zhiyou.smzdm.com",
   "Accept": "application/json, text/javascript, */*; q=0.01",
   "Referer": "https://zhiyou.Python加密混淆.com/user/login/",
   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 自己的 UA"
}
res = requests.get('https://zhiyou.Python加密混淆.com/user/login/pre', headers=headers, timeout=3)
print(res.text)

运行代码得到如下响应,其中pub_key也被获取到。 

python+JS 实现逆向 SMZDM 的登录加密

 多次测试接口之后,发现错误,触发了账户限制,在大家编码的时候,建议多准备几个不同的账号,防止被封禁。

python+JS 实现逆向 SMZDM 的登录加密

 进一步调试发现 JS 加密使用的是一个插件,直接下载对应 JS 如下:

https://res.Python混淆.com/resources/public/user/zhiyou/js/jsencrypt.min.js

在本地搭建一个 JS 代码可以运行的环境 编写如下代码,其中涉及上述提及的文件。

<!DOCTYPE html>
<html>
 <head>
   <meta charset="UTF-8" />
   <meta http-equiv="X-UA-Compatible" content="IE=edge" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <title>测试环境</title>
   <script src="jsencrypt.min.js"></script>
   <script>
     function getQueryVariable(variable) {
       var query = window.location.search.substring(1);
       var vars = query.split("&");
       for (var i = 0; i < vars.length; i++) {
         var pair = vars[i].split("=");
         if (pair[0] == variable) {
           return pair[1];
         }
       }
       return false;
     }
     pk = getQueryVariable("pk");

b64 = atob(pk);
     (o = new JSEncrypt()).setPublicKey(b64);

aaa = o.encrypt("123456");
     document.write(aaa);
   </script>
 </head>
 <body></body>
</html>

然后可以用 Selenium 进行调用,通过 URL 参数传递 pub_key 即可。

python+JS 实现逆向 SMZDM 的登录加密

逻辑也非常简单,Python 调用接口生成 KEY,然后将 KEY 传递到我们自己构建的 JS 环境中,最后通过 Python 调用目标站点(自己搭建)的地址,获取加密值,然后进行传递。

来源:https://juejin.cn/post/7089236455167361031

标签:python,JS,逆向,SMZDM,登录,加密
0
投稿

猜你喜欢

  • Python中collections.Counter()的具体使用

    2023-04-22 23:26:35
  • mysql 5.7.13 安装配置方法图文教程(linux)

    2024-01-27 20:46:37
  • python matplotlib实现将图例放在图外

    2021-11-19 06:55:45
  • Python运维自动化之nginx配置文件对比操作示例

    2023-08-04 16:54:29
  • Python函数中的作用域规则详解

    2023-02-14 04:32:28
  • 简单实现SQLServer转MYSQL的方法

    2024-01-21 20:12:13
  • python数值基础知识浅析

    2021-12-10 07:07:49
  • MySQL中对于not in和minus使用的优化

    2024-01-17 04:17:20
  • first-letter的一个小妙用

    2010-03-20 21:47:00
  • 关于CSS中字号控制的兼容性研究[译]

    2009-02-24 16:35:00
  • python 时间戳与格式化时间的转化实现代码

    2021-07-06 10:14:47
  • 如何控制弹出一个NTLM验证窗口?

    2009-12-16 19:01:00
  • pygame游戏之旅 调用按钮实现游戏开始功能

    2023-04-19 06:36:44
  • 在Django的模型中执行原始SQL查询的方法

    2022-12-21 17:24:40
  • ES6入门教程之Array.from()方法

    2024-04-18 09:51:51
  • MySQL的之表结构修改

    2012-01-05 19:16:17
  • pytorch 实现cross entropy损失函数计算方式

    2022-03-18 00:45:50
  • Mysql InnoDB引擎中的数据页结构详解

    2024-01-16 20:51:29
  • python 两个一样的字符串用==结果为false问题的解决

    2023-01-24 08:30:59
  • 三个520专属Python表白代码分享

    2023-09-19 21:20:06
  • asp之家 网络编程 m.aspxhome.com