网络爬虫js逆向解决网站登录RSA加密问题+session维护登录状态(cookie-响应头)请求爬取+手动添加cookie(js中)


零、初步分析

首先对网站进行登录分析:
在这里插入图片描述
根据这个Preview预览发现登录请求,请求类型为Post,参数为:
在这里插入图片描述
参数类型对应的参数处理方式:
在这里插入图片描述
可以发现:
userName为账号。
imageCaptchaCode为验证码。
password为加密后的密码。
所以要想登录这个网站就要搞懂该网站对password的加密逻辑,来发送加密后的Password参数.


一、JS分析


观察请求调用栈,进入到window.zdAjax看看:
在这里插入图片描述
观察分析ajax请求中的大部分参数由e来给定,且在打上断点后运行第一次中断时,观察到e中url的值为/common/getTime,ajax中url的值即为:/apis/common/getTime
有点眼熟哈:
在这里插入图片描述
预览响应结果(记住这个返回结果):
在这里插入图片描述
不过window.zdAjax应该更有可能会发送url带有login/passwordLogin的请求,所以试着释放一次断点,再观察观察。
在console(控制台)输入e.data可以看到释放一次断点后e.data的值发生了变化:
在这里插入图片描述
可以判断释放断点后发送了登录的请求,因为使用了对应的参数,但也可以发现password已经被加密好了,所以还得往别处看看。

二、加密逻辑探索和实现

在这里插入图片描述
根据调用栈往回看看,进入anonymous:
在这里插入图片描述
发现关键:
paramss的值作为参数(/common/getTime)发送了zdAjax请求,请求成功后通过ress为接下来的login请求设定好参数data和url,
注意:encryptFn(pwd+‘’+ress.data)就是在这里对密码和ress.data进行加密了!!!
pwd是密码。
那ress.data是什么?(像是时间戳),反正/common/getTime请求会返回它
然后这个请求结束后得到的param参数就会给zdAjax(param,res)去请求登录,登录成功后设置cookie.

那么encryptFn(pwd+‘’+ress.data)是怎么加密的?
进入到这个encryptFn函数中看看:
在这里插入图片描述
看到setPublicKey整上base64字符串形式的密钥,那多半是用RSA(最常用的非对称加密方式)加密了。
复制公钥后
那就可以开整了。

三、开整

首先要想登录就必须搞定这几个参数

data={
  "userName": "账号", //自己肯定知道
  "password": encryptFn(pwd+''+ress.data)//密码和时间戳加密后的密文
  "imageCaptchaCode": 验证码的值
}

先来搞定验证码:
这里要先想明白一个事,我在登录前要输入验证码,网站服务器是怎么知道我输入的验证码是它发给我的那个呢?那么多用户在登录网站向服务器发送验证码,是怎么根据用户身份来核实对应的验证码是否输入正确呢?

答案很简单:用cookie来表明特定用户的身份信息

所以要获取验证码,我们就要先登录网站的登录界面获取代表我们身份的cookie信息。

session = requests.session()
session.headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
}
dl_url="https://user.wangxiao.cn/login"
session.get(url=dl_url)

这里为什么要用session,因为通过session自动来维护响应头中的信息,便与我们后续对验证码请求的发送。

发起验证码获取的请求(浏览器抓包):
注意请求参数和返回内容的数据格式转换
在这里插入图片描述
在这里插入图片描述
返回的是base64格式加密后的字符串要用b64decode解码为字节供超级鹰识别

rzm_url="https://user.wangxiao.cn/apis//common/getImageCaptcha"
rzm_resp=session.post(url=rzm_url,headers={"Content-Type":"application/json;charset=UTF-8"})
# print(rzm_resp.text)
k=rzm_resp.json()["data"].split(",")[1]

导入超级鹰对图片进行验证码识别:

chaojiying = Chaojiying_Client('18614075987', 'q6035945', '	955182')	#(超级鹰平台)用户中心>>软件ID 生成一个后替换第三个参数
rrm = chaojiying.PostPic(base64.b64decode(k), 1902)  #1902 证码类型 函数返回的是一个字典
print(rrm)
zdrrm = rrm['pic_str']    #验证码的值

搞定了验证码后接着搞定加密后的password:

data={
  "userName": "账号", //自己肯定知道
  "password": encryptFn(pwd+''+ress.data)//密码和时间戳加密后的密文
  "imageCaptchaCode": zdrrm
}

pwd是密码,ress.data是时间戳,通过getTime请求访问可得到。
在这里插入图片描述
在这里插入图片描述

#先进行gettime请求
Time_url="https://user.wangxiao.cn/apis//common/getTime"
time_resp=session.post(url=Time_url,headers={"Content-Type":"application/json;charset=UTF-8"})
time_data=time_resp.json()['data']
password="12345"
jmq_str=password+time_data

最后根据
在这里插入图片描述
开始加密并登录:

#公钥Base64加密的字符串形式
gy_str="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA5Zq6ZdH/RMSvC8WKhp5gj6Ue4Lqjo0Q2PnyGbSkTlYku0HtVzbh3S9F9oHbxeO55E8tEEQ5wj/+52VMLavcuwkDypG66N6c1z0Fo2HgxV3e0tqt1wyNtmbwg7ruIYmFM+dErIpTiLRDvOy+0vgPcBVDfSUHwUSgUtIkyC47UNQIDAQAB"

#字符串解码为字节形式
gy_key_bytes=base64.b64decode(gy_str)

#生成公钥
pub_key=RSA.import_key(gy_key_bytes)

#搞个加密器
rsa_=PKCS1_v1_5.new(key=pub_key)

#进行加密
jmh_byte=rsa_.encrypt(jmq_str.encode("utf-8"))

#base64加密
jmh_str=base64.b64encode(jmh_byte).decode()
login_url="https://user.wangxiao.cn/apis//login/passwordLogin"
data={
  "userName": "17607330125",
  "password": jmh_str,
  "imageCaptchaCode": zdrrm
}
#发送请求
resp=session.post(url=login_url,data=json.dumps(data),headers={"Content-Type":"application/json;charset=UTF-8"})

补充:

再登录成功后,是否能进入网站登录后才能看到的页面呢?
回答是不一定。
因为session中一直维护的是响应头中的cookie,Js代码中生成的cookie它是需要手动添加的,缺失了这部分cookie可能就会导致访问登录后才能访问的网页时又要求你进行登录(跳转到登录页的请求返回登录页信息)

在JS代码中生成的cookie:
在这里插入图片描述
登录成功应该是看这里:
在这里插入图片描述
在这里插入图片描述
总共是

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋刀鱼_(:з」∠)_别急

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值