18、猿人学第三题:访问逻辑 - 推心置腹【Post/Js逆向笔记】

目标网址

https://match.yuanrenxue.com/match/3

逆向题目

抓取下列5页商标的数据,并将出现频率最高的申请号填入答案中


开始分析

打开chrome浏览器 的开发工具,清理浏览器的cookie缓存

然后重新刷新网页

 

然后发现开始出现一个弹窗信息,显示数据加载失败

确认后,又出现一个弹窗,显示加群

 

 

然后网页重载到 https://match.yuanrenxue.com/list


然后在通过 list 列表中的题目 点击进入后 却没有出现弹窗信息

直接显示了数据,这个说明 在清空了之前的cookie 从而产生了这样的一个问题

那么在 cookie中 应该是保存了一个 验证的数据

因为清空了cookie 导致了 验证数据失败,服务器无法返回正常的数据

那么这个时候我们可以看一下cookie中有什么数据存在 

 

通过network 上面的输出的 数据,我们可以很清楚的看到数据的api

https://match.yuanrenxue.com/api/match/3

通过的post请求协议

并且没有传参

然后我们看数据的cookie 

可以看到 cookie中有一个 sessionid 值 

通过多次抓取 可以发现 这个sessionid 是变化的

 


那么 首先我们先不考虑这个 sessionid的随机值是什么生成的

我们先通过 这个api 接口  首先写一下采集的脚本 

看看这个sessionid 值 是否可以固定  如果可以 就不需要分析了

依旧还是可以用 第一题使用的python脚本 只需要修改一下请求的URL即可
# coding:utf-8
import requests
import time
import execjs


def yuanrenxue_sprider(page):
    url = 'https://match.yuanrenxue.com/api/match/3?page={page}'.format(page=page)
    print(url)
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 Safari/537.36',
        'cookie': 'Hm_lvt_0362c7a08a9a04ccf3a8463c590e1e2f=1632991231; vaptchaNetway=cn; Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1632991226,1633063557; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1632991248,1633063559; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1633063559; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1633063623'
    }

    if page == 4 or page == 5:
        headers['user-agent'] = 'yuanrenxue.project'
    response = requests.get(url,headers=headers,verify=False)
    # res = response.json()
    print(response.text)
    # for i in res['data']:
    #     data = i['value']
    #     print(data)
        

if __name__ == '__main__':

    for i in range(1,6):
        yuanrenxue_sprider(i) 

 

通过脚本的运行的,可以看到 请求返回的值 是一大串的JS 有点像fuckjs 

我们可以拿其中的一条 去做一下解密试试看

推荐的解密的网址:http://codertab.com/JsUnFuck

 

解密后 输出的内容 为  undefined  未定义???

我顿时懵逼了。。。

难道是漏加了一些请求时的参数吗?

接着继续把请求头加满 但是 返回的依旧是undefined

那如果不是我问题,就只能是这个协议的问题了

重新的考虑一下这个题目 叫做罗生门  

那么可能这个协议接口返回本身就是这个错误的信息

很可能在之前就返回了数据 并且返回了 seeionid的值 做了校验

继续重新的抓几次包 分析一下

这个时候 发现  每次请求数据的时候,在 https://match.yuanrenxue.com/api/match/3

之前都会有一个https://match.yuanrenxue.com/jssm  请求一次

并且这个请求会返回cookie  cookie中带有sessionid 的值

 

 

然后把这个网页的请求 放入精易调试工具里面去调试 

首先把 这个cookie 清除进行请求  发现 返回的cookie中没有值

然后继续尝试 加上 空的sessionid 值 发现咦!!!可以了

并且每次请求 sessionid 的值都是不一样的


获取sessionid脚本

那么 这个时候我们就可以自己编写获取 sessionid的脚本了

# coding:utf-8
import requests
from requests import sessions
from requests.models import Response

def get_cookie():
    url = 'https://match.yuanrenxue.com/jssm'

    headers = {
        'Host': 'match.yuanrenxue.com',
        'Connection': 'keep-alive',
        'Content-Length': '0',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 Safari/537.36',
        'sec-ch-ua-platform': '"Windows"',
        'Accept': '*/*',
        'Origin': 'https://match.yuanrenxue.com',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Dest': 'empty',
        'Referer': 'https://match.yuanrenxue.com/match/3',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
    }

    res = requests.post(url,headers=headers,verify=False)
    cookie = requests.utils.dict_from_cookiejar(res.cookies)
    print(cookie)

get_cookie()
!!!!又发现了一个大问题  返回的cookie sessionid 值 竟然为空。。。

没道理啊,精易调试工具里面是可以的啊,为什么python就不行。。。

随后 我有用另外的一种请求的方式 进行修改处理 把 header 和 cookie 单独放入session中

 

# coding:utf-8
import requests
from requests import sessions
from requests.models import Response

def get_cookie():
    url = 'https://match.yuanrenxue.com/jssm'

    headers = {
        'Host': 'match.yuanrenxue.com',
        'Connection': 'keep-alive',
        'Content-Length': '0',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 Safari/537.36',
        'sec-ch-ua-platform': '"Windows"',
        'Accept': '*/*',
        'Origin': 'https://match.yuanrenxue.com',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Dest': 'empty',
        'Referer': 'https://match.yuanrenxue.com/match/3',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
    }


    session = requests.Session()
    # response = session.post(url,headers=headers,verify=False)
    session.headers = headers
    cookies = {'Cookie':'sessionid=;'}
    response = session.post(url,verify=False,cookies=cookies)
    print('=============')
    cookie = requests.utils.dict_from_cookiejar(response.cookies)
    print(cookie)
    print('=============')

get_cookie()

 

nice !!! 

这次就可以出现cookie了

那这个是为啥嘞。。。。。

然后开始面向百度编程了,开始查询问题所在

=========================

然后花了十几分钟找到了问题的所在

Header 排序

在某些特殊情况下你也许需要按照次序来提供 header,如果你向 headers 关键字参数传入一个 OrderedDict,就可以向提供一个带排序的 header。然而,Requests 使用的默认 header 的次序会被优先选择,这意味着如果你在 headers 关键字参数中覆盖了默认 header,和关键字参数中别的 header 相比,它们也许看上去会是次序错误的。

如果这个对你来说是个问题,那么用户应该考虑在 Session 对象上面设置默认 header,只要将 Session 设为一个定制的 OrderedDict 即可。这样就会让它成为优选的次序。

============================

requests 库 的header排序是会被优先选择的

而 Session对象中不会

编写数据请求脚本

# coding:utf-8
import requests
from requests import sessions
from requests.models import Response

def get_cookie(page):
    url = 'https://match.yuanrenxue.com/jssm'

    headers = {
        'Host': 'match.yuanrenxue.com',
        'Connection': 'keep-alive',
        'Content-Length': '0',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 Safari/537.36',
        'sec-ch-ua-platform': '"Windows"',
        'Accept': '*/*',
        'Origin': 'https://match.yuanrenxue.com',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Dest': 'empty',
        'Referer': 'https://match.yuanrenxue.com/match/3',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
    }


    session = requests.Session()
    # response = session.post(url,headers=headers,verify=False)
    session.headers = headers
    cookies = {'Cookie':'sessionid=;'}
    response = session.post(url,verify=False,cookies=cookies)
    print('=============')
    cookie = requests.utils.dict_from_cookiejar(response.cookies)
    print(cookie)
    print('=============')
    if page == 4 or page == 5:
        headers['user-agent'] = 'yuanrenxue.project'
    url_api = 'http://match.yuanrenxue.com/api/match/3?page={page}'.format(page=page)
    res = session.get(url=url_api).json()
    for i in res['data']:
        data = i['value']
        # print(data)
        data_list.append(data)



if __name__ == '__main__':
    data_list = []
    for i in range(1,6):
        get_cookie(i)
    print('======================')
    print('出現最多的值:',max(data_list, key=data_list.count))
    print('======================')
最终的得出 出現最多的值: 8717  

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值