已遷移平臺:segmentfault搔谴,搜索 erma0
換平臺了,簡書發(fā)什么都鎖定驶沼,廣告一堆炮沐,趁早倒閉吧。
JavaScript逆向練習4
0x01 目標網址
0x02 定位JS
1. 隨便輸入賬號密碼(經紀人賬號登錄)商乎,點擊登錄央拖,查看提交的參數
可以看到,在登錄包http://j.esf.leju.com/ucenter/login
里有加密過 的password
參數鹉戚。這個就是下面要找的加密鲜戒。
這個包還有一個參數ckey
,是在網頁源碼里生成的抹凳,每次請求都會更新這個值遏餐,做登錄的話,每次都去取一下就行了赢底。
2. Ctrl+Shift+F調出搜索面板失都,搜索password
,結果中稍作分析幸冻,發(fā)現有前面幾個結果都不是目標域名下的js文件粹庞,剩下兩個打開看看。
在所有可疑的地方都下斷點洽损,當然庞溜,自信一點可以直接定位到圖中這個地方,畢竟一眼可以看到$("#password")
碑定,找到這是用來取明文密碼的值流码,而且還有RSA這樣的關鍵字又官。
3. 直接在可疑的地方都下斷點,重新輸入賬號密碼驗證碼漫试,點擊登錄六敬,JS被斷了下來(就是上圖中的位置)。
var t = $("#password")
, i = $.trim(t.val());
if (i.length < 100) {
(0,
l.setMaxDigits)(129);
var n = new c.RSAKeyPair("10001", "", $("#pubkey").val())
, s = (0,
c.encryptedString)(n, i);
$("input[name='password']").val(s)
加密函數就是encryptedString
驾荣,兩個參數外构,第一個是RSAKeyPair
返回的對象,第二個是明文密碼秘车。
而前一行的RSAKeyPair
參數$("#pubkey").val()
就是公鑰了典勇,直接console里輸出一下,復制出來叮趴。
F11跟進,再或者鼠標懸停在斷點處函數名RSAKeyPair
上权烧,點擊彈出的內容眯亦,也能跳轉進去。
加密函數的核心就是在這里般码,把這段整個290函數全部拿走妻率。
4. 上一步進去之后,發(fā)現同時調用了291
板祝、217
兩個函數宫静,直接在這里搜數字+冒號,就能定位到這兩個函數定義處券时,全部拿走就完事兒了孤里。
0x03 改寫JS
1. 仿照圖2的位置,寫一個調用函數橘洞。
function test() {
setMaxDigits(129);
var n = RSAKeyPair("10001", "", "BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97")
//第三個參數就是上文提的公鑰捌袜,console里輸出復制來的,直接替換在這了炸枣。
var enPass = encryptedString(n, pass);
return enPass
}
2. 把扣出來的290虏等、291、217
三個函數放到調試工具里适肠,再開始改寫霍衫。
先把三個函數改成標準的函數定義的格式。
function i_217(e, t, i) {
***
代碼
***
}
function i_291(e, t, i) {
***
代碼
***
}
function i_290(e, t, i) {
***
代碼
***
}
同時把每個函數內部的
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
}),
這段代碼刪掉侯养。
其中290
里有217 291
的調用敦跌、291
里有217
的調用,改成正常格式沸毁。
//290里的
var m = i_217(e, t, i)
, s = i_291(e, t, i)
//291里的
var c = i_217(e, t, i);
3. 此時加載運算峰髓,會出現各種未定義和對象不存在傻寂,因為現在的代碼里并沒有調用加密代碼,而且摳下來的3個函數都沒有返回值携兵。
所以先給每個函數加一個返回值:在函數尾部加上return t
(因為函數都是在操作t
)
再在一開始寫的調用函數里疾掰,調用290
,因為沒有參數可以傳徐紧,所以順手把290
的參數給刪掉静檬。
function i_290() {
t = this
e = ""
i = ""
//其他代碼
}
function test(pass) {
t=i_290()//調用加密核心:290
//往下的所有函數、對象的調用并级,都是對象`t`里面的了
t.setMaxDigits(129);
var n = t.RSAKeyPair("10001", "", "BC087C7C00848CE8A349C9072C3229E0D595F817EDDE9ABF6FC72B41942A759E97956CE9CB7D1F2E99399EADBACC0531F16EAE8EFCB68553DE0E125B2231ED955ADBF5208E65DC804237C93EB23C83E7ECDA0B586ECF31839038EE6B640E0EEC5FF17D219FDEA33E730F287F0D384C74A53DFE1F91ACC63C7C92039A43AC6E97")
var enPass = t.encryptedString(t, pass);//這里如果傳入n的話拂檩,會提示'chunkSize' 為 null 或不是對象
//傳入t的話就OK了,因為所有函數嘲碧、屬性都在`t`里面稻励,同時上面的`var n =`也可以刪掉了,因為沒有調用愈涩,當然不刪也沒有影響望抽,慢慢熟悉JS語法。
return enPass
}
此時就能正常運行了履婉。
0x04 Python代碼
PS. 其實可以嘗試直接調用Python的RSA加密庫煤篙,如果這個JS沒改過,結果應該是能用的(也就是另一個思路:JS功能可以通過所使用的語言直接實現)毁腿。
# -*- encoding: utf-8 -*-
'''
@File : 0x04-j.esf.leju.com.py
@Time : 2019/12/10 20:19:22
@Author : 獨孤孤獨嘟咕嚕犢子
@Version : 1.0
@Link : http://www.reibang.com/u/6a4c6ef97be7
@Desc : 新浪二手房登錄rsa
'''
# start
import execjs
import requests
# 初始化參數
HEADERS = {
'User-Agent':
'Mozilla/5.0 (Linux; Android 8.0; DUK-AL20 Build/HUAWEIDUK-AL20; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044353 Mobile Safari/537.36 MicroMessenger/6.7.3.1360(0x26070333) NetType/WIFI Language/zh_CN Process/tools'
}
s = requests.Session()
s.headers.update(HEADERS)
loginURL = 'http://j.esf.leju.com/ucenter/login'
# 登錄參數
username = '15555555555'
password = 'ermao6@qq.com'
# 加載js
with open('js/0x04-j.esf.leju.com.js') as f: # 坑0x01 相對路徑前面不帶/辑奈,帶/不報錯但讀不出數據
jscode = f.read()
ctx = execjs.compile(jscode) # execjs載入js代碼
def get_ckey():
url = 'http://j.esf.leju.com/ucenter/login'
res = s.get(url).text
ckey = res.split('name="ckey" value="')[1].split('" />')[0]
return ckey
def login(user, password):
enPass = ctx.call('test', password) # 通過call調用js代碼里的函數
ckey = get_ckey()
data = {
'username': username,
'password': enPass,
'imgcode': '',
'ckey': ckey
}
result = s.post(loginURL, data=data).json()
print(result)
return result
if __name__ == "__main__":
login(username, password)