這次被我們盯上的平台是【SMZDM】。
本次目標站點為:aHR0cHM6Ly93d3cuc216ZG0uY29tLw==
。
正式開始前,先註冊一個帳號,然後模擬一下登錄,看看有哪些參數被偷偷的藏起來了~
當看到登錄之後的所有請求參數時,我們還是默默的把站點關閉,撤吧。
從上圖可以看到username
,password
是重要加密區,geetest_
開頭的參數是下述點選驗證碼涉及的內容,本階段不做拆解,可以持續關注後續驗證碼部分邏輯。
登入的點選驗證碼可以先忽略,這個階段搞定它不是很容易。
介面請求參數是:
請求網址: zhiyou.smzdm.com/ user/login/ajax_normal_check
請求方法: POST
common_submit函數,其所在的檔案是
window.js,可以重點關注。
login/ajax_normal_check。
#在斷點打住之後,可以直接進入目標函數:
#結果直接找到了相關加密邏輯,如下圖所示:
核心程式碼進行擷取,然後進一步進行分析。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 進行相同的加密。
import base64 wtext = "12345" # 编码 a = base64.b64encode(wtext.encode()) print(a.decode()) # 输出 MTIzNDU=
username參數解決。
password參數,
密碼加密的流程是:
pub_key ;
pub_key進行
#atob編碼;
## JSEncryptRSAKey
測試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也被取得到。 多次測試介面之後,發現錯誤,觸發了帳戶限制,在大家編碼的時候,建議多準備幾個不同的帳號,防止被封鎖。 進一步調試發現JS 加密使用的是插件,直接下載對應JS 如下:
https://res.Python混淆.com/resources/public/user/zhiyou/js/jsencrypt.min.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>
以上是python+JS怎麼實現逆向SMZDM登入加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!