看到一個網(wǎng)站的登錄環(huán)節(jié)做了密碼的加密驼侠,嘗試著做了破解笔时,權(quán)當(dāng)對js破解的一個練習(xí)急灭。
網(wǎng)站:http://www.haodou.com
開始破解
登錄url下面看到data如下:
?
其中password和sso_token明顯是加密后的數(shù)據(jù)孽尽。
搜索sso_token可以定位到j(luò)s文件:
?
看到這里的sso_token 其實(shí)是網(wǎng)頁 上id 為sso_token的一個值田巴,定位到這個頁面的url為:
http://login.haodou.com/
?
下面就可以追蹤password的加密了麸折,如圖一所示打斷點(diǎn)后可以看到:
最后密碼的獲得是通過這個表達(dá)式完成:
post_data.password = hd.secure.encrypt($('#timestamp').val() + '|' + post_data.password);
這里的$('#timestamp').val() 是個十位數(shù)的時間戳锡凝,在js中的實(shí)現(xiàn)是:new Date().getTime().toString().substr(0,10)
這里的 post_data.password 就是我們的原始密碼。
最后只需要考慮hd.secure.encrypt 這個方法即可磕谅。
通過剛才的斷點(diǎn)可以定位到這個函數(shù)所在位置:
?
?
這個函數(shù)是包含在一個對象當(dāng)中:
?
復(fù)制這個對象中的所有js代碼私爷,放到j(luò)s文件中雾棺,運(yùn)行js文件后會顯示缺少window對象和navigator對象,構(gòu)造這兩個對象即可:
var window = window ||{};
var navigator = navigator ||{};
另外衬浑,把這個對象的函數(shù)名和最后沒有用到的return都刪除掉捌浩,讓我們的js代碼看起來更簡潔。
最后把生成密碼的函數(shù)單獨(dú)拿出來構(gòu)造一個函數(shù)工秩,用來我們每次調(diào)用的時候進(jìn)行密碼返回尸饺。
function encrypt(plain){
? ? var? ? n= 'yevTQ5C8exDUo/c0y0Lrxp+quYD9vxjkKFAgdqV0PtLefJ4FEB4VeTTGDfqaWVgQXeQeyCp0yjCd8EGVUd/77z+Z/HlBpaavHwsE77Rjf3r9AC+aSN+ZZC4uoZL0bYDiDgYcG32CPLdVPP8zbKxa/BSbUb1PhxEot/fMTo+rLrU=';
? ? var? ? e='AQAB';
? ? var n = pidCryptUtil.decodeBase64(n)
? ? ? ? , e = pidCryptUtil.decodeBase64(e)
? ? ? ? , rsa = new pidCrypt.RSA();
? ? rsa.setPublic(pidCryptUtil.convertToHex(n), pidCryptUtil.convertToHex(e));
? ? return pidCryptUtil.encodeBase64(pidCryptUtil.convertFromHex(rsa.encrypt(plain)))
}
function get_pwd(pwd) {
? ? timestamp = new Date().getTime().toString().substr(0,10)
? ? new_pwd = encrypt(timestamp + '|' + pwd);
? ? return new_pwd
}
每次調(diào)用get_pwd函數(shù),傳入密碼助币,就可以獲得加密后的password浪听。
加密環(huán)節(jié)完成后,就可以編寫py腳本眉菱。都是基礎(chǔ)操作迹栓,代碼如下:
import execjs
import requests
from pyquery import PyQuery as pq
def get_pwd():
? ? with open('haodou_js.js', 'r', encoding='UTF-8') as f:
? ? ? ? js2 = f.read()
? ? ? ? ctx2 = execjs.compile(js2)
? ? ? ? pwd = ctx2.call("get_pwd", '123456') #這里放密碼
? ? return pwd
def get_sso_token():
? ? url = 'http://login.haodou.com/'
? ? headers = {
? ? ? ? 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
? ? ? ? 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive',
? ? ? ? 'Cookie': 'PHPSESSID=cg1sinvvc3lejkv3uvv3o61jj0; HDid=1561778611245; product=1; _uab_collina=156179025038866839820592; _wtip=0%7C%2B5; UM_distinctid=16ba1f63de6a2a-0fc5697c844879-e343166-1fa400-16ba1f63de7bae; _ga=GA1.2.626879575.1561790398; _gid=GA1.2.2045726504.1561790398; Hm_lvt_fbb4fdac678166fd7a6f7e50d6e5040c=1561790398; Hm_lpvt_fbb4fdac678166fd7a6f7e50d6e5040c=1561791766; _gat=1',
? ? ? ? 'Host': 'login.haodou.com', 'Referer': 'http://www.haodou.com/', 'Upgrade-Insecure-Requests': '1',
? ? ? ? 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
? ? res = requests.get(url, headers=headers)
? ? doc = pq(res.text)
? ? sso_token = doc('#sso_token').attr('value')
? ? print(sso_token)
? ? return sso_token
def login():
? ? url = 'http://login.haodou.com/index.php?do=check'
? ? headers = {'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate',
? ? ? ? ? ? ? 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Connection': 'keep-alive', 'Content-Length': '340',
? ? ? ? ? ? ? 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
? ? ? ? ? ? ? 'Cookie': 'PHPSESSID=cg1sinvvc3lejkv3uvv3o61jj0; HDid=1561778611245; product=1',
? ? ? ? ? ? ? 'Host': 'login.haodou.com', 'Origin': 'http://login.haodou.com', 'Referer': 'http://login.haodou.com/',
? ? ? ? ? ? ? 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
? ? ? ? ? ? ? 'X-Requested-With': 'XMLHttpRequest'}
? ? password = get_pwd()
? ? sso_token = get_sso_token()
? ? data = {
? ? ? ? 'account': '18811111111',
? ? ? ? 'type': '2',
? ? ? ? 'password': password,
? ? ? ? 'referer': 'http://www.haodou.com',
? ? ? ? 'auto_login': '0',
? ? ? ? 'valicode': '',
? ? ? ? 'sso_token': sso_token,
? ? }
? ? res = requests.post(url, headers=headers, data=data)
? ? print(res.status_code)
? ? print(res.text)
? ? print(res.cookies.get_dict())
if __name__ == '__main__':
? ? login()
以上,就完成了整個登錄的破解過程俭缓。
完整代碼傳送----------如果對你有所幫助克伊,歡迎點(diǎn)擊star:點(diǎn)擊查看GitHub