点击上方“咸鱼学Python”,选择“加为星标”
第一时间关注Python技术干货!
抓包分析
先抓包分析一下登录的请求【图1-1】
按照加密的参数,我们一个个分析。
首先是 _csrf
,这个参数比较简单,一般是用来防止跨域攻击的,感兴趣的朋友可以借助搜索引擎了解一下,不是重点我们就不详聊了。
直接检索 _csrf
关键字,可以看到如图的结果,_csrf
在页面中传递过来的。【图1-2】
接着再分析 password
, 直接检索 password
就可以找到关键的加密文件。【图1-3】
点进文件就可以看到密码的加密了【图1-4】,很明显是一个 RSA 和 AES 加密的结合。
我们简单扣取一下逻辑,运行一下结果。【图1-5】
既然能够生成密码值了就拿到了所有的加密参数了,现在整合到 Python 中看看。
Python 实现 Openlaw 登陆
之前没有学过 JS 逆向遇到登陆只会用 Selenium 模拟登陆,现在我们可以试试用 Python 直接搞起。
首先我们先生成加密后的密码:
def get_password():
with open(r"login.js", encoding="utf-8")as f:
js = f.read()
ctx = execjs.compile(js)
pwd = ctx.call("keyEncrypt", "密码")
return pwd
再看看整体的登陆逻辑是什么样的【图2-1】
可以看到先发起了请求1,提交了加密好的密码与账户名,并且携带上了csrf
之后是一个重定向请求【图2-2】
请求完上面的两个请求后,之后经过跳转就访问了我们的个人中心。
所以这里需要使用上session
获取cookie
并且禁止重定向
login_r = session.post("http://openlaw.cn/login", data=data, headers=headers,allow_redirects=False)
其他的部分只要使用session
传递好cookie
,在提交完数据后就可以访问个人中心了。【图2-3】
难点总结
本篇文章其实想写很久了,但是遇到下面两个问题,我觉得有必要总结一下,方便大家避坑。
第一个问题,遇到一个报错ASN1 is not define
这是在JSEncrypt
这个加密库中报的错。
我一直以为是这个加密库的问题,因为在其他环境运行都没有问题,但是使用nodejs
运行就会报错,之后通过定义window = global
解决了这个报错,之前我都是定义window = {}
。
感谢 @汪唔 老哥的帮助。
第二个问题,这个网站的账号很容易就被封了,所以在你运行代码时,最好先手动登陆一下看看账号是否被封禁,我就是拿了一个被封禁的账号测试了很久,一直以为是代码的问题。
以上就是本次文章的全部内容了,如果上面的文章对你有帮助,希望可以点个好看支持一下,谢谢~