模拟登陆广西科技大学正方教务系统
?
一、首先對登錄過程進行抓包,看看需要什么數據??
登錄地址:教學管理信息服務平臺
?我們可以看到登錄采用POST對http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html發送請求
那么接下來我們要一步一步解析數據由來
二、解析Data字典
time很明顯是一個時間戳,用以下代碼就可以實現
import time ts = round(time.time()*1000)?csrftoken 我猜測應該是一個md5密文
首先對Elements查詢
?都沒有找到csrftoken這個鍵
回到登錄界面再次嘗試查找
?很好!原來這個csrftoken在進入登錄界面的時候就自動生成了呀!
使用xpath爬取這個value值當然是最快的啦!
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]?運行效果如圖所示
?yhm 也就是“用戶名”,就是你的學號
重點來了,mm這個參數很明顯是加密過的,接下來重點逐步解密mm
破解mm
再次對登錄界面進行抓包
這里有modulus和exponent兩個參數,檢索這兩個參數看看
?
?OK! 似乎發現了登錄的入口!
認真閱讀這三行代碼
先將modulus和exponent轉為hex,也就是十六進制
再存入setPublic得到公鑰
用公鑰對輸入的密碼進行加密(RSA加密算法)
加密完后又將密文轉為base64字符串
加密流程大致是這樣,接下來將上述流程轉為代碼實現
直接利用crypto/rsa下的這些js文件吧!因為將js語言轉換為python語言還是有困難的,直接利用原汁原味的js文件不香嗎?
這里直接將這5個文件的代碼復制到同一個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里調用一下(使用execjs庫調用js文件)
看到這一幕是不是很震撼!
到這里,mm參數也拿下了
(注:獲取mm參數需要exponent和modulus這兩個參數)
獲取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()三、模擬瀏覽器登錄
所有參數都獲取完了,模擬瀏覽器登錄也就容易多了,只要將data里的參數全部發送到請求鏈接就可以了。
值得注意的是,請求頭的data里有兩個相同的鍵mm,?python無法創建包含兩個相同的鍵的字典,所以這里我使用URL_encoded格式發送字典,使用urllib.parse.quote()將字符串轉為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 '用戶名或密碼不正確,請重新輸入!' in status.text:print("用戶名或密碼不正確,請重新輸入!")else:print('登錄成功!歡迎您!') if __name__ == '__main__':client = requests.session()loginurl = 'http://jwxt.gxust.edu.cn:9600/xtgl/login_slogin.html'user = input("賬號:")password = input("密碼:")login(user, password)?結尾:既然都實現登錄了,那可玩的東西就多了
爬取課表
查看更多:GitHub - waykom/zhengfang: 模擬登錄廣西科技大學正方教務系統
參考:
GitHub - zmaplex/openSwunEduCrawler
https://www.v2ex.com/t/433971#reply11
總結
以上是生活随笔為你收集整理的模拟登陆广西科技大学正方教务系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于属性的访问控制(ABAC)定义与思考
- 下一篇: Android 存储设备管理 -- St