模拟登陆广西科技大学正方教务系统
?
一、首先對(duì)登錄過程進(jìn)行抓包,看看需要什么數(shù)據(jù)??
登錄地址:教學(xué)管理信息服務(wù)平臺(tái)
?我們可以看到登錄采用POST對(duì)http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html發(fā)送請(qǐng)求
那么接下來我們要一步一步解析數(shù)據(jù)由來
二、解析Data字典
time很明顯是一個(gè)時(shí)間戳,用以下代碼就可以實(shí)現(xiàn)
import time ts = round(time.time()*1000)?csrftoken 我猜測(cè)應(yīng)該是一個(gè)md5密文
首先對(duì)Elements查詢
?都沒有找到csrftoken這個(gè)鍵
回到登錄界面再次嘗試查找
?很好!原來這個(gè)csrftoken在進(jìn)入登錄界面的時(shí)候就自動(dòng)生成了呀!
使用xpath爬取這個(gè)value值當(dāng)然是最快的啦!
import requests from lxml import html client = requests.session() url = 'http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html' response = client.get(url).text tree = html.fromstring(response) csrftoken = tree.xpath('//*[@id="csrftoken"]/@value')[0]?運(yùn)行效果如圖所示
?yhm 也就是“用戶名”,就是你的學(xué)號(hào)
重點(diǎn)來了,mm這個(gè)參數(shù)很明顯是加密過的,接下來重點(diǎn)逐步解密mm
破解mm
再次對(duì)登錄界面進(jìn)行抓包
這里有modulus和exponent兩個(gè)參數(shù),檢索這兩個(gè)參數(shù)看看
?
?OK! 似乎發(fā)現(xiàn)了登錄的入口!
認(rèn)真閱讀這三行代碼
先將modulus和exponent轉(zhuǎn)為hex,也就是十六進(jìn)制
再存入setPublic得到公鑰
用公鑰對(duì)輸入的密碼進(jìn)行加密(RSA加密算法)
加密完后又將密文轉(zhuǎn)為base64字符串
加密流程大致是這樣,接下來將上述流程轉(zhuǎn)為代碼實(shí)現(xiàn)
直接利用crypto/rsa下的這些js文件吧!因?yàn)閷s語言轉(zhuǎn)換為python語言還是有困難的,直接利用原汁原味的js文件不香嗎?
這里直接將這5個(gè)文件的代碼復(fù)制到同一個(gè)js文件上
然后在末尾添加那三行登錄入口的代碼就可以了
function start(e, m, mm){var rsaKey = new RSAKey();rsaKey.setPublic(b64tohex(m), b64tohex(e));var enPassword = hex2b64(rsaKey.encrypt(mm));return enPassword; }(由于合并后的js代碼過長,我已將它上傳到GitHub,鏈接crypto_rsa.js)?
?在python里調(diào)用一下(使用execjs庫調(diào)用js文件)
看到這一幕是不是很震撼!
到這里,mm參數(shù)也拿下了
(注:獲取mm參數(shù)需要exponent和modulus這兩個(gè)參數(shù))
獲取exponent和modulus
import time import requests ts = round(time.time()*1000) url = f'http://jwxt.gxust.edu.cn:9600/xtgl/login_getPublicKey.html?time={ts}&_={ts-50}' modExp = requests.get(url).json()三、模擬瀏覽器登錄
所有參數(shù)都獲取完了,模擬瀏覽器登錄也就容易多了,只要將data里的參數(shù)全部發(fā)送到請(qǐng)求鏈接就可以了。
值得注意的是,請(qǐng)求頭的data里有兩個(gè)相同的鍵mm,?python無法創(chuàng)建包含兩個(gè)相同的鍵的字典,所以這里我使用URL_encoded格式發(fā)送字典,使用urllib.parse.quote()將字符串轉(zhuǎn)為URL_encoded
以下代碼模擬登錄(僅供參考)
#!/usr/bin/python # -*- coding:utf-8 -*-import requests import time from lxml import html import execjs import urllib.parse from texttable import Texttabledef getCsrfToken(loginurl):# csrftokenbodyByGet = client.get(loginurl)tree = html.fromstring(bodyByGet.text)csrftoken = tree.xpath('//*[@id="csrftoken"]/@value')[0]return csrftoken def getModExp(key):# exponent,modulusntime = round(time.time()*1000)modExpurl = f'http://jwxt.gxust.edu.cn:9600/xtgl/login_getPublicKey.html?time={ntime}&_={ntime-50}'modExp = client.get(modExpurl).json()# mmJS = open('crypto_rsa.js').read()mm = execjs.compile(JS).call('start', modExp['exponent'], modExp['modulus'], key)return mm def login(user, mm):# loginmm = getModExp(mm)csrftoken = getCsrfToken('http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html')headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded','Host': 'jwxt.gxust.edu.cn:9600','Origin': 'http://jwxt.gxust.edu.cn:9600','Referer': 'http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html','Upgrade-Insecure-Requests': '1','User-Agent': ''}data = f'csrftoken={urllib.parse.quote(csrftoken)}&language=zh_CN&yhm={user}&mm={urllib.parse.quote(mm)}&mm={urllib.parse.quote(mm)}'status = client.post(loginurl, headers=headers, data=data) # print(status.text)if '用戶名或密碼不正確,請(qǐng)重新輸入!' in status.text:print("用戶名或密碼不正確,請(qǐng)重新輸入!")else:print('登錄成功!歡迎您!') if __name__ == '__main__':client = requests.session()loginurl = 'http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html'user = input("賬號(hào):")password = input("密碼:")login(user, password)?結(jié)尾:既然都實(shí)現(xiàn)登錄了,那可玩的東西就多了
爬取課表
查看更多:GitHub - waykom/zhengfang: 模擬登錄廣西科技大學(xué)正方教務(wù)系統(tǒng)
參考:
GitHub - zmaplex/openSwunEduCrawler
https://www.v2ex.com/t/433971#reply11
總結(jié)
以上是生活随笔為你收集整理的模拟登陆广西科技大学正方教务系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于属性的访问控制(ABAC)定义与思考
- 下一篇: 【附源码】Python计算机毕业设计时事