当前位置:首页 » 《随便一记》 » 正文

web逆向实战(二)-学习通-登录过程

13 人参与  2024年02月21日 18:51  分类 : 《随便一记》  评论

点击全文阅读


目录

目的过程找请求接口明确请求参数找函数入口抠代码 源码总结

目的

通过python模拟登录学习通。目标网址:aHR0cHM6Ly9wYXNzcG9ydDIuY2hhb3hpbmcuY29tL2xvZ2lu

过程

找请求接口

既然我们是登录过程,在一开始就可以找下有没有带着login字眼的请求,再结合payload中,请求所携带的参数uname和password,这应该就是用户登录的第一个请求。在这里插入图片描述

明确请求参数

在明确了要请求哪个接口后,复制其cURL(bash)到postman或者reqable中进行请求重放。根据返回的结果,对不必要的请求参数进行删减。然后剩下图中所示的请求参数。

在这里插入图片描述

然后再把cURL(bash)复制到在线网站,一键生成python代码,最后看下请求返回值是否跟刚刚的一致。如果不一致可能是你的tls指纹问题,也有可能是你把请求参数压缩了,然后给检测到。

cURL转Python代码的在线网站:https://spidertools.cn/#/curl2Request

通过上边的步骤,剔除掉无关的请求参数后,发现就uname和password是需要加密的。

找函数入口

直接全局搜索变量名password,也可以password : ,password =,或者直接搜encrypt。觉得可疑的也可以都打上断点。下面是看到了ajax所以就八九不离十了,接着就是往上找含有pwd和phone,可疑就打断点,然后不断往上看,直到整个函数loginByPhoneAndPwdSubmit的头部,函数传参也要看(如果有的话)。

在这里插入图片描述

打完断点就登录一下试试,登录的时候,最好用固定的账号密码,以便以后遇到一些加密字符串你能够靠经验猜测出来。

在这里插入图片描述

函数加密入口:在这里插入图片描述

抠代码

反手先把加密函数扣下来,然后补齐需要的环境。然后就得到结果了。我直接把源码都放出来了,因为就导个加密库就可以了。

源码

import requestsimport execjsimport timedef main(username, password, isProxy, Port):    """    目的:学习通登录过程    """    headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}    cookies = {}    data = {      'uname': '',      'password': '',      'refer': 'https%3A%2F%2Fi.chaoxing.com',      't': 'true',    }    # 代理    proxies = {} if not isProxy else {        'http': f'http://127.0.0.1:{Port}',        'https': f'http://127.0.0.1:{Port}',    }    # 该秘钥在加密函数入口处上方    aeskey = "u2oh6Vu^HWe4_AES"                          # arg1   aes加密秘钥写死,后面可能要改    # 导入加密函数文件    with open('./xxt.js', 'r', encoding="utf-8") as f:        js_code = f.read()    # 编译js代码    code = execjs.compile(js_code)    # js代码执行    encoded_username = code.call("encryptByAES", username, aeskey)    encoded_password = code.call("encryptByAES", password, aeskey)    # 修改payload中的值    data["uname"] = encoded_username    data["password"] = encoded_password    print(f"加密后的账户名 ------->>>  {encoded_username}")    print(f" 加密后的密码  ------->>>  {encoded_password}")    # 建立session会话    session = requests.Session()    # 第一次请求返回固定值:  'https%3A%2F%2Fi.chaoxing.com%2F'  ,其实就是经过了uri编码,encodeURIComponent("https://i.chaoxing.com/")    first_response = session.post('https://passport2.chaoxing.com/fanyalogin', headers=headers, cookies=cookies, data=data, proxies=proxies)    # 第二次请求重定向可加可不加    # second_response = session.get("https://i.chaoxing.com/", headers=headers, cookies=cookies, data=data, proxies=proxies)    # 第三次请求返回数据仅可获取个人空间少部分数据,课程数据在另一个ajax请求返回    timestamp = int(time.time()*1000)    third_response = session.get(f"https://i.chaoxing.com/base?t={timestamp}", headers=headers, cookies=cookies, data=data, proxies=proxies)    # print(third_response.text)if __name__ == "__main__":    # 输入你的用户名和密码    username = "12345678910"    password = "123456"    # isProxy标识是否使用代理,Port为代理端口,默认不使用。若要使用代理访问网页,请设置为True,代理默认使用7890端口    isProxy = False    Port = 7890    main(username, password, isProxy, Port)
const CryptoJS = require("crypto-js");function encryptByAES(message, key){let CBCOptions = {iv: CryptoJS.enc.Utf8.parse(key),mode:CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7};let aeskey = CryptoJS.enc.Utf8.parse(key);let secretData = CryptoJS.enc.Utf8.parse(message);let encrypted = CryptoJS.AES.encrypt(secretData,aeskey,CBCOptions);return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);}// console.log(encryptByAES("12345678910", "u2oh6Vu^HWe4_AES"));

总结

这一章节只能算是练练python语法,下次弄下学习通个人空间的课程列表页。

免责声明:本文仅供学习和研究目的,禁止用于任何商业用途。读者在使用爬虫技术时需遵守相关法律法规,本文作者不对读者在使用爬虫技术时可能产生的任何法律风险负责。如有任何侵权或违法行为,请及时联系作者删除相关内容。


点击全文阅读


本文链接:http://zhangshiyu.com/post/69386.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1