(超简单)破解文泉学堂的登陆验证

(超简单)破解文泉学堂的登陆验证

2020-02-06 19:55:29发布 浏览数:6612
概述:(超简单)破解文泉学堂的登陆验证


破解文泉学堂的登陆验证

写在开头声明应用程序&依赖思路检查登陆是否影响资源的访问权限解析登陆请求,尝试模拟登陆获得请求链接获得请求参数解析登陆思路使用Python进行模拟登陆总结

写在开头

说起来挺尴尬的

昨天上午刚刚分享了文泉学堂的Jwt-HS256加解密详解,下午服务器就被恶意爬虫攻击了。

console.log('真的不是我干的')

文泉学堂爬虫:Jwt-HS256加解密详解
https://blog.csdn.net/m0_46261074/article/details/104162067

于是文泉暂时关闭服务器,更新了反爬机制后重新上线。

说实话人家服务器都被玩崩了也挺惨的,于是火急火燎上线了登陆验证,不登号的一律不许学习。

声明

  1. 本文尽仅涉及到获取 文泉学堂登陆状态 的可用Cookie ,不涉及书籍的下载与爬取; 本文仅限学习交流使用,不得用于商业非法用途,否则,一切后果请用户自负。 如有侵权请邮件与我联系处理。

应用程序&依赖

Chrome

python 3.8

PyCharm

PostMan Canary

pip install requests

思路

跳过登陆或模拟登陆,访问我们需要的资源。

  1. 检查登陆是否影响资源的访问权限; 解析登陆请求,尝试模拟登陆;

检查登陆是否影响资源的访问权限

从网站中随意拿一个api出来尝试请求:

api_initRead = 'https://www.wqxuetang.com/v1/read/initread'
1
import requests

session = requests.session()
api_initRead = 'https://www.wqxuetang.com/v1/read/initread'
response = session.get(api_initRead)
print(response.text)

{“data”:[],“errcode”:3001,“errmsg”:“请先登录”}

哦豁完蛋,以前能请求到的资源现在要登陆才能看到了。

解析登陆请求,尝试模拟登陆

进入文泉学堂官网,发现要求进行登陆:

https://www.wqxuetang.com/#/

点击去登陆跳转进登陆界面,选择用密码登陆并进入控制台,查看登陆按钮所对应的JS函数:

看到登陆按钮响应 post_login函数。

全局搜索post_login函数,并点击进入函数体:


通过分析函数体,我们可以了解到:post_login函数执行了ajax请求,我们在函数结尾打断点并登陆,查看具体的链接和参数信息。

获得请求链接

网页在断点暂停,可以看到请求链接和请求参数,发现请求链接是由/checklogin?和u[1]拼接,在控制台输出u[1] :

response_type=code&client_id=wqxuetang&redirect_uri=https%3A%2F%2Fwww.wqxuetang.com%2Fv1%2Flogin%2Fcallbackwq&scope=userinfo&state=https%3A%2F%2Flib-nuanxin.wqxuetang.com%2F%23%2F

与baseUrl和/checklogin?拼接:

http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https%3A%2F%2Fwww.wqxuetang.com%2Fv1%2Flogin%2Fcallbackwq&scope=userinfo&state=https%3A%2F%2Flib-nuanxin.wqxuetang.com%2F%23%2F

发现Url中有通过UrlEncode编码的文字,进行UrlEncode解码后:

http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https://www.wqxuetang.com/v1/login/callbackwq&scope=userinfo&state=https://lib-nuanxin.wqxuetang.com/#/
api_checklogin = 'http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https://www.wqxuetang.com/v1/login/callbackwq&scope=userinfo&state=https://lib-nuanxin.wqxuetang.com/#/'

至此成功生成登陆请求链接,在这里命名为api_checklogin。

获得请求参数

请求参数就是data中的内容,包含accout和password两个部分,毫无疑问就是账号和密码。不过这里的登陆参数居然是用明文传输的真的是震撼狗妈,清华总是给我们惊喜。

data = 'account=XXXXXXXXXXX&password=XXXXXXXXXXX'

解析登陆思路

在获得请求链接和请求参数之后我们使用Postman进行Post请求尝试登陆:

Tips:注意POST请求需要设置对应的Content-Type,否则可能导致请求失败!


可以看到请求成功,返回值是一串JSON,包含code,message和data三个字段,可以看到唯一有效的字段就是data,同样是一段通过UrlEncode编码后的网址信息:

尝试使用UrlEncode解码后:

https://www.wqxuetang.com/v1/login/callbackwq?code=f3e9b5931b53764aeebd529a3d03fc5ed9ce9f33&state=https://lib-nuanxin.wqxuetang.com/#/

Tips: 该网址在一次解码后仍有urlencode编码的文字,进行第二次解码后才可以得出以上内容。

至此成功生成Callback链接,在这里命名为api_callback。

api_callback = 'https://www.wqxuetang.com/v1/login/callbackwq?code=f3e9b5931b53764aeebd529a3d03fc5ed9ce9f33&state=https://lib-nuanxin.wqxuetang.com/#/'

之后继续分析JS,发现在第一次请求成功后,会调用windows.location.href函数请求该网址:


由此得出结论,登陆时会先请求checklogin链接,认证成功后返回callback链接,再由浏览器请求callback链接并将callback返回的Cookie信息设置给浏览器。

使用Python进行模拟登陆

直接上代码,注释写的很清楚:

import urllib.parse
import requests


def login(account, password):
    api_checklogin = 'http://open.izhixue.cn/checklogin?response_type=code&client_id=wqxuetang&redirect_uri=https://www.wqxuetang.com/v1/login/callbackwq&scope=userinfo&state=https://lib-nuanxin.wqxuetang.com/#/'

    # 创建了一个请求Session
    session = requests.session()
    # 生成登陆参数
    headers = {"Content-Type": 'application/x-www-form-urlencoded;charset=UTF-8'}
    data = 'account={}&password={}'.format(account, password)
    # 进行请求
    response_checklogin = session.post(api_checklogin, data=data, headers=headers)
    # 解码回调链接
    api_callback = urllib.parse.unquote(response_checklogin.json()['data'])
    # 请求回调链接,并返回需要调Cooike
    response_callback = session.get(api_callback, allow_redirects=False)
    return response_callback.cookies


def get_user(cookies):
    session = requests.session()
    api_login = 'https://www.wqxuetang.com/v1/login/checklogin'
    response = session.get(api_login, cookies=cookies)
    return response.text


if __name__ == '__main__':
    account = 'XXXXXXXX'
    password = 'XXXXXXXX'
    cookies = login(account, password)
    userInfo = get_user(cookies)
    print(userInfo)

可以看到成功返回了登陆的用户信息。

总结

挺简单的。

编辑于 Tues Feb 4 19:20:46 2020

左素

请先
登录
后评论
0 条评论
暂时没有评论
最新文章
更多