已遷移平臺:segmentfault,搜索 erma0
換平臺了铸题,簡書發(fā)什么都鎖定抢呆,廣告一堆,趁早倒閉吧。
JavaScript逆向練習(xí)2
0x01 目標(biāo)網(wǎng)址
抓包或者右鍵查看框架源代碼可以看到碗暗,彈出的登錄框URL為:
0x02 定位JS
1. 隨便輸入賬號密碼驗證碼颈将,,有驗證碼要輸入正確的驗證碼言疗,點擊登錄晴圾,查看提交的參數(shù)
可以看到,發(fā)出了兩個請求噪奄,第一個是獲取key死姚,第二個是登錄,在登錄包里有加密過 的參數(shù)勤篮,密碼enpassword
都毒、偽指紋fingerPrint
、fingerPrintDetail
碰缔。
2. Ctrl+Shift+F調(diào)出搜索面板账劲,搜索enpassword
,看到只要一個結(jié)果金抡,而且是網(wǎng)頁源碼瀑焦。
乍一看沒有頭緒,其實這里是通過Class來定位取值的梗肝,也就是說榛瓮,這里可以試試再搜索一次Class的值:J_RsaPsd
,可以看到有兩條結(jié)果巫击,第二個是我們上一次搜索的結(jié)果榆芦,肯定不是加密點,所以應(yīng)該是在第一個結(jié)果里喘鸟。
點進(jìn)第一個結(jié)果匆绣,點花括號格式化一下,Ctrl+F搜索J_RsaPsd
什黑,發(fā)現(xiàn)有三個結(jié)果崎淳,稍作分析,在每一個可疑的地方都下斷點愕把。
3. 重新輸入賬號密碼驗證碼拣凹,點擊登錄,JS被斷了下來恨豁,我們要的加密點是在328-338行的位置嚣镜,代碼扣下來備用。
success: function(a) {
if (a.status = g.ajax.SUCCESS) {
c.each(function() {
var b = $(this),
c = new j.RSAKey;
c.setPublic(a.result.modulus, a.result.publicExponent);
var d = c.encrypt(b.val());
b.siblings(".J_RsaPsd").val(d)
});
var b = i.page.rsaFingerprint(a.result.modulus, a.result.publicExponent);
d.filter(".J_FingerPrint").val(b.result).end().filter(".J_FingerPrintDetail").val(b.details)
}
這段代碼就是當(dāng)異步請求Key(就是1中抓包看到的兩條請求中的第一個)成功后橘蜜,根據(jù)Key進(jìn)行加密操作菊匿。
其中b.val()
是明文密碼付呕,a.result.modulus, a.result.publicExponent
是第一條請求得到的Key,直接固定跌捆,i.page.rsaFingerprint
是計算另外兩個加密參數(shù)徽职。
鼠標(biāo)懸停在j.RSAKey
上(這里是new出來的對象,先要找到來源)佩厚,點擊彈出的內(nèi)容姆钉,直接跳轉(zhuǎn)進(jìn)去。
4. 進(jìn)入對象的定義函數(shù)中抄瓦,發(fā)現(xiàn)全是this潮瓶,那就直接把整個上一層全拿走,一直翻钙姊,找出的上層代碼是3916行開始毯辅,到4521行結(jié)束。
define("lib/rsa/rsa", [], function(a, b, c) {
function d(a, b, c) {
null != a && ("number" == typeof a ? this.fromNumber(a, b, c) : null == b && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))
}
***
省略
***
ab.prototype.nextBytes = _,
db.prototype.doPublic = fb,
db.prototype.setPublic = eb,
db.prototype.encrypt = gb,
c.exports = {
RSAKey: db
}
}),
5. 到這里已經(jīng)可以開始改寫密碼加密部分的內(nèi)容了摸恍,但是還有兩個參數(shù)也有加密悉罕,我還是一起扣出來再改寫。
同上立镶,在337行下個斷點壁袄,再運行到這里。鼠標(biāo)懸停在rsaFingerprint
上媚媒,點擊彈出的內(nèi)容嗜逻,直接跳轉(zhuǎn)進(jìn)去。
直接把定義函數(shù)扣出來就可以缭召。
rsaFingerprint: function(a, b) {
if (!$.fingerprint)
return {
details: "",
result: ""
};
var c = $.fingerprint.details
, d = $.fingerprint.result
, e = c.length
, f = ""
, g = new l.RSAKey;
g.setPublic(a, b);
for (var h = g.encrypt(d), i = 0; e > i; i += 117)
f += g.encrypt(c.substr(i, 117));
return {
details: f,
result: h
}
}
這其中參數(shù)a,b是第一條請求的Key栈顷,可以直接固定;$.fingerprint
可以到console輸出看一下嵌巷,是瀏覽器萄凤、請求頭相關(guān)的信息,可以說是偽指紋搪哪,暫且固定靡努,最后return的是個對象,正好是登錄包里的另外兩個參數(shù)晓折。
0x03 改寫JS
1. 先寫一個調(diào)用函數(shù)惑朦。
var p1 = "00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817",
p2 = "010001";//因為另一個加密也要調(diào)用這兩個值,所以定義在函數(shù)外面漓概,作為全局變量用漾月。
function getP(pass) {//密碼加密計算函數(shù),仿照加密點代碼寫的胃珍。
var c = new RSAKey;
c.setPublic(p1, p2);
var d = c.encrypt(pass);
return d;
}
2. 改寫RSAKey對象定義處
window = this;
navigator = {}; //把需要用到的值先定義空對象
//把第一行刪掉梁肿,把內(nèi)部的函數(shù)暴露出來(對應(yīng)的結(jié)尾部分的括號也刪掉)
//define("lib/rsa/rsa", [], function(a, b, c) {
function d(a, b, c) {
null != a && ("number" == typeof a ? this.fromNumber(a, b, c) : null == b && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))
}
***
省略
***
ab.prototype.nextBytes = _,
db.prototype.doPublic = fb,
db.prototype.setPublic = eb,
db.prototype.encrypt = gb;
//把原來的逗號換成分號結(jié)束掉語句蜓陌。
//,
//c.exports = {
// RSAKey: db
//}
//本來是用exports來對外導(dǎo)出,現(xiàn)在直接定義對象就可以栈雳。
var RSAKey = db;
//}),
現(xiàn)在就可以通過getP(pass)
來加密明文密碼了护奈。
3. 改寫rsaFingerprint
定義
先把之前console里輸出的瀏覽器信息定義成變量缔莲,再把函數(shù)部分改成正常的定義就可以了哥纫。
把開始的if判斷給刪除,另外這里還要把對應(yīng)的值都給換一下痴奏,如*.RSAKey換成RSAKey蛀骇。
var details = '{"user_agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safa","language":"zh-CN","color_depth":"24","pixel_ratio":"1.25","hardware_concurrency":"4","resolution":"1536,864","available_resolution":"1536,824","timezone_offset":"-480","session_storage":"1","local_storage":"1","indexed_db":"1","open_database":"1","cpu_class":"unknown","navigator_platform":"Win32","do_not_track":"unknown","regular_plugins":"Chromium PDF Plugin::Portable Document Format::application/x-google-chrome-pdf~pdf,Chromium PDF View","webgl_vendor":"Google Inc.~ANGLE (Intel(R) HD Graphics 530 Direct3D9Ex vs_3_0 ps_3_0)","adblock":"true","has_lied_languages":"false","has_lied_resolution":"false","has_lied_os":"false","has_lied_browser":"false","touch_support":"0,false,false","js_fonts":"Arial,Arial Black,Arial Narrow,Book Antiqua,Bookman Old Style,Calibri,Cambria,Cambria Math,Century,C"}',
result = "2754353484e6bed2ec7cf41dddba8bce"
rsaFingerprint = function() {
var c = details,
d = result,
e = c.length,
f = "",
g = new RSAKey;
g.setPublic(aaaa, "010001");
for (var h = g.encrypt(d), i = 0; e > i; i += 117)
f += g.encrypt(c.substr(i, 117));
return {
details: f,
result: h
}
}
此時就可以運行了。
0x04 代碼
省略
PS
如果在加密后的登陸過程中出現(xiàn)異常读拆,那可能是瀏覽器信息的問題擅憔,仔細(xì)對照看看哪里不一樣就知道了。