简书图片无法加载,看图可以去原帖:

JavaScript逆向练习3
0x01 目标网址
https://passport.fang.com
0x02 定位JS
1. 随便输入账号密码,点击登录,查看提交的参数
可以看到,在登录包https://passport.fang.com/login.api
里有加密过 的pwd
参数。
2. Ctrl+Shift+F调出搜索面板,搜索pwd
,结果中稍作分析,发现有一个像encrypt样子字眼(看多了就能一眼看出哪些是无关结果了)。

3. 直接在这里下一个断点,重新输入账号密码验证码,点击登录,JS被断了下来。

加密函数就在这里了,两个参数,第一个暂时不知道,等下搜搜看,第二个是明文密码。
F11跟进,或者直接搜函数名encryptedString
,再或者鼠标悬停在断点处函数名上,点击弹出的内容,也能跳转进去。
加密函数的调用核心就是在这里。
4. 上一步进去之后,发现进入一个RSA.min.js
,明显是RSA算法了,代码不长,直接全部拿下。

5. 这里还差一个参数key_to_encode
,在console里搜一下看看。

一下就看到了,直接把script标签里的东西拿走就完事儿了。
0x03 改写JS
1. 仿照图2的位置,写一个调用函数。
function test(pass) {
setMaxDigits(129);
var key_to_encode = new RSAKeyPair("010001", "", "978C0A92D2173439707498F0944AA476B1B62595877DD6FA87F6E2AC6DCB3D0BF0B82857439C99B5091192BC134889DFF60C562EC54EFBA4FF2F9D55ADBCCEA4A2FBA80CB398ED501280A007C83AF30C3D1A142D6133C63012B90AB26AC60C898FB66EDC3192C3EC4FF66925A64003B72496099F4F09A9FB72A2CF9E4D770C41");
//上面是从script标签里扣的代码,也就是第一个参数的定义
var p = encryptedString(key_to_encode, pass)//传入明文密码pass
return p
}
2. 再把扣出来的RSA.js放到上面,完事儿了。
此时就能正常运行了。
0x04 Python代码
PS. 其实可以尝试直接调用Python的RSA加密库,如果这个JS没改过,结果应该是能用的(也就是另一个思路:JS功能可以通过所使用的语言直接实现)。
# -*- encoding: utf-8 -*-
'''
@File : 0x03-passport.fang.com.py
home.php?mod=space&uid=116177 : 2019/12/09 17:25:25
@Author : 独孤孤独嘟咕噜犊子
home.php?mod=space&uid=59980 : 1.0
home.php?mod=space&uid=95579 : https://www.jianshu.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',
'Referer': 'https://passport.fang.com/'
}
s = requests.Session()
s.headers.update(HEADERS)
loginURL = 'https://passport.fang.com/login.api'
# 登录参数
username = '15555555555'
password = 'ermao6@qq.com'
# 加载js
with open('js/0x03-passport.fang.com.js') as f: # 坑0x01 相对路径前面不带/,带/不报错但读不出数据
jscode = f.read()
ctx = execjs.compile(jscode) # execjs载入js代码
def login(user, password):
enPass = ctx.call('test', password) # 通过call调用js代码里的函数
data = {
'uid': username,
'pwd': enPass,
'Service': 'soufun-passport-web',
'AutoLogin': 1
}
result = s.post(loginURL, data=data).json()
print(result) # {'code': 10000} 登录成功
return result
if __name__ == "__main__":
login(username, password)