Die Plattform, die wir dieses Mal im Auge behalten, ist [SMZDM].
Die Zielseite ist dieses Mal: aHR0cHM6Ly93d3cuc216ZG0uY29tLw==
. aHR0cHM6Ly93d3cuc216ZG0uY29tLw==
。
正式开始前,先注册一个账号,然后模拟一下登录,看一下有哪些参数被偷偷的藏起来了~
当看到登录之后的所有请求参数时,我们还是默默的把站点关闭,撤吧。
从上图可以看到username
,password
是重要加密区,geetest_
开头的参数是下述点选验证码涉及的内容,本阶段不做拆解,可以持续关注后续验证码部分逻辑。
登录的点选验证码可以先忽略,这个阶段搞定它不是很容易。
接口请求参数是:
请求网址: zhiyou.smzdm.com/user/login/ajax_normal_check
请求方法: POST
本次我们先不添加断点,先通过请求启动器进行分析,打开该链接的请求调用堆栈,然后依次分析相关地址。
根据经验可以发现有一个common_submit
函数,其所在的文件是window.js
,可以重点关注。
接下来添加一个 XHR 断点,关键字是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
参数,密码加密的流程是:
通过一个 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
Wenn wir nach der Anmeldung alle Anforderungsparameter sehen, schließen wir stillschweigend die Site und brechen sie ab.
From oben Wie in der Abbildung zu sehen ist, sind username
und password
wichtige Verschlüsselungsbereiche. Die Parameter, die mit geetest_
beginnen, sind der Inhalt, um den es im Folgenden geht Klicken Sie auf den Bestätigungscode. In dieser Phase können Sie weiterhin auf die Logik des nachfolgenden Bestätigungscodes achten, ohne ihn zu demontieren.
Schnittstelle Die Anforderungsparameter sind:
zhiyou.smzdm.com/user/login/ajax_normal_check
common_submit
-Funktion finden, die Datei, in der sie sich befindet, ist window.js
, Sie können sich darauf konzentrieren. 🎜🎜Fügen Sie als Nächstes einen XHR-Haltepunkt hinzu. Das Schlüsselwort lautet login/ajax_normal_check
. 🎜🎜🎜Nachdem der Haltepunkt abgelaufen ist, können Sie direkt die Zielfunktion eingeben: 🎜🎜🎜🎜🎜🎜Das Ergebnis ist, dass die relevante Verschlüsselungslogik direkt gefunden wird, wie in der folgenden Abbildung dargestellt: 🎜🎜🎜🎜🎜Der Kerncode wird extrahiert und dann weiter analysiert. 🎜https://res.Python混淆.com/resources/public/user/zhiyou/js/jsencrypt.min.js
login_obj.encryptPassword
tatsächlich eine neue Schnittstelle aufrief. 🎜<!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>
btoa
-Verschlüsselung 12345
und dann die gleiche Verschlüsselung über Python durchführen. 🎜🎜🎜rrreee 🎜二Die Ergebnisse sind konsistent und der Parameter username
wurde aufgelöst. 🎜🎜Schauen wir uns weiterhin den Parameter password
an. 🎜Der Prozess der Passwortverschlüsselung ist: 🎜🎜pub_key; 🎜
pub_key
; /code> SCHLÜSSEL verschlüsseln; 🎜pub_key
abgerufen wird. 🎜🎜🎜🎜🎜 Nach mehrmaligem Testen der Schnittstelle wurde ein Fehler gefunden, der Kontobeschränkungen auslöste. Beim Codieren wird empfohlen, mehrere verschiedene Konten vorzubereiten, um eine Sperrung zu verhindern. 🎜🎜🎜🎜🎜🎜 Beim weiteren Debuggen wurde festgestellt, dass die JS-Verschlüsselung ein Plug-in verwendet. Laden Sie das entsprechende JS wie folgt herunter: 🎜🎜rrreee🎜🎜Erstellen Sie eine Umgebung, in der JS-Code lokal ausgeführt werden kann.🎜 Schreiben Sie den folgenden Code, der die Dateien umfasst oben erwähnt. 🎜rrreee🎜 Dann können Sie es mit Selenium aufrufen, indem Sie pub_key über den URL-Parameter übergeben. 🎜🎜🎜🎜🎜Die Logik ist auch sehr einfach. Python ruft die Schnittstelle auf, um den SCHLÜSSEL zu generieren, und übergibt den SCHLÜSSEL dann an die JS-Umgebung, die wir selbst erstellt haben Python, um den verschlüsselten Wert abzurufen und ihn dann weiterzugeben. 🎜Das obige ist der detaillierte Inhalt vonSo implementieren Sie die umgekehrte SMZDM-Anmeldeverschlüsselung mit Python+JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!