首頁  >  文章  >  後端開發  >  python+JS怎麼實現逆向SMZDM登入加密

python+JS怎麼實現逆向SMZDM登入加密

王林
王林轉載
2023-06-03 19:13:02815瀏覽

實戰場景

這次被我們盯上的平台是【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 呼叫目標站點(自己建構)的位址,取得加密值,然後進行傳遞。 ###

以上是python+JS怎麼實現逆向SMZDM登入加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除