入门反爬攻坚考试

第一题

打开页面 https://www.aqistudy.cn/

实现接口 https://www.aqistudy.cn/apinew/aqistudyapi.php 的正常请求并获取明文响应

分析

  1. 开着 F12 进页面
  2. 遇到无限debugger 一个 never pause here 下去
  3. 关闭所有断点 Activate breakpoint(Ctrl + F8),随便逛逛网站找找目标接口
  4. image-20240613200856817
  5. 找到了如上图,简单分析一下接口
  6. image-20240613201159969
  7. response 内容同样为一长串加密字符
  8. image-20240613201340275
  9. 重放请求,发现 payloadresponse 都不变
  10. image-20240613202145237
  11. 请求类型为 XHR/fetch ,直接打断点开抓
  12. image-20240613203819469

扣代码

  1. image-20240613205415430
  2. 先搞定加密,定位到 pov0M2gfR 这个函数
  3. image-20240613212022614
  4. 简单扣一下代码,缺啥找啥,这题很简单,随便扣了两个文件 2000 行,入参加密就破解成功了
  5. image-20240613213609051
  6. 再搞解密,定位到了 deIZLF7oahc0DLiXbqt 这个函数
  7. image-20240613214629626
  8. 然后发现这个函数已经在扣加密的时候也已经扣过了,可以直接调,至此,加解密的破解我们就完成了
  9. image-20240613214856629

模拟请求

import execjs
import requests
from pathlib import Path
import json
project_dir = Path(__file__).resolve().parent
file = f'{project_dir}\\入参.js'
ctx = execjs.compile(open(file, encoding='utf-8').read())

url = "https://www.aqistudy.cn/apinew/aqistudyapi.php"
headers = {
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}

for city in ['广州', '深圳', '杭州', '北京', '上海', '南京', '重庆']:
    ret = {
        'city': city,
        'type': 'HOUR',
        'startTime': '2024-06-14 08:00:00',
        'endTime': '2024-06-14 09:00:00'
    }
    params = ctx.call('encrypted', ret)
    data = {"hXhY1B2Kd": params}
    res = requests.post(
            url=url,
            headers=headers,
            data=data
        )
    if res.status_code == 200:
        text = res.text.strip()
        data = ctx.call('deIZLF7oahc0DLiXbqt', text)
        print(city, json.loads(data))
    else:
        print(res.text)

image-20240614100835131

第二题

打开页面 https://xunkebao.baidu.com/#/searchList?searchValue=%E4%BA%BF%E7%BA%AC%E9%94%82%E8%83%BD&searchTab=all

搜索 亿纬锂能 找到接口https://xunkebao.baidu.com/crm/web/dgtsale/bizcrm/enterprise/search

3 种方法快速定位到接口中 headers 里的 Acs-Token 参数加密位置

方法一

  1. Acs-Token 并非常见的参数名称,那么我们直接全局搜索,打上断点一步到位
  2. image-20240614201620568

方法二

  1. 该接口请求类型为 xhr,一个 XHR/fetch 断点先断到该请求处(此处没找到接口 dgtsale ,找到了和题目描述一致的 bizcrm
  2. image-20240614202525068
  3. XHR 直接断在了这里,此时我们打印一下参数,会发现还没有出现我们所需要的值。于是我们 Step out of current function 往后跟一跟
  4. image-20240614202111600

方法三

  1. Acs-Token 参数既然在 headers 当中,那么我们通过 hook headers 的方式跟踪 headers 的赋值操作
  2. image-20240614203702847
  3. Step out of current function 往出跟一跟,也到了这个地方
  4. image-20240614204257878

追踪后续

  1. 根据上述三种方法找到该值出现的地方,我们从 C3 往下追到 getSign
  2. image-20240614194722093
  3. 往下跟,加密位置应该就是这里了,入参挨个执行完 pe.gs 生成结果,这块好像都是异步调用还有箭头函数什么
  4. image-20240614215007047
  5. image-20240614215216787

第三题

解决题目 https://match2023.yuanrenxue.cn/topic/4 ,给出详细可行的解决思路

分析

  1. 先简单分析一下请求,发现 payload 有两个参数,一个 page ,一个 yt4 ,且每个请求无法重放,可知我们只要搞定 yt4 这个参数,就可以解决该问题
  2. image-20240616195126942
  3. 该请求系 XHR ,直接用 Initiator 跟过去,可以发现 yt4 就是在 match4.js 这里算出来的
  4. image-20240617213154109
  5. 跟着往里面扣一下,会发现实际入参只有两个,一个是固定字符串 YtNMIT/vOuJkScU6ZqG+zY3tfyyrHuzHO4glJQaz/OU= ,和一个 13 位的时间戳。经过了函数 _$IU 调用得到一个 44 位的字符串,如 y2GObvzkjaUVRtsHpldmFPmd2GXSdm0CE4OoX4ZSVmVn
  6. image-20240617215324446
  7. 然后这个 44 位的字符串和固定字符串 YtNMIT/vOuJkScU6ZqG+zY3tfyyrHuzHO4glJQaz/OU=13 位的时间戳再走一遍 _$pa[_$ya](_$wa, _$Ua) 即可取得最终的 yt4 ,如图8、9所示
  8. image-20240617233247533
  9. image-20240617233425513
  10. 最后【未经验证】这个请求一定要快,推测是慢了时间戳和服务端校验不一致会 403

第四题

打开页面 https://music.163.com/ ,搜索 周杰伦

找到接口 https://music.163.com/weapi/cloudsearch/get/web?csrf_token=

实现该接口中的 paramsencSecKey 算法,成功访问该接口并获取到正确数据

分析

  1. 接口请求类型 XHR ,一个断点直接打上去,然后看看堆栈,搞一下红框里的几行代码,入参可变的其实也就 i0x 里一个搜索词
  2. image-20240614224804436

扣代码

  1. 首先去扣 window.asrsea ,直接跟踪定位到 d 这里,前后非匿名函数扣一扣,缺啥找啥,很容易就可以在本地运行了
  2. image-20240615152704161
  3. 整理一下函数命名,将死参数直接写入函数内部
  4. image-20240615154410723

模拟请求

  1. 最后拿着我们得到的参数去模拟请求,成功获取响应,过关
  2. image-20240615155238513

第五题

打开页面 https://www.ynjzjgcx.com/register/process?type=

获取验证码,代码实现触发的滑块验证码流程,破解通过率高于 80%

分析

  1. 模拟一遍过程,其请求了两个接口:
    1. 第一步通过一个 params 参数请求了 https://www.ynjzjgcx.com/prod-api/mohurd-pub/vcode/genVcode ,在手机号相同的条件下每次请求的 params 不同,且其为一个 172 位的字符串
    2. 第二步通过滑块后同样通过一个 params 参数请求了 https://www.ynjzjgcx.com/prod-api/mohurd-pub/sms/sendVCodeSms ,且其也为一个 172 位的字符串,有理由推测是同一种加密方式
  2. XHR 请求,直接用 Initiator 跟过去瞅瞅,一下就找到了这两个显眼包,入参为一个手机号
  3. image-20240616214636312
  4. 往下简单跟几步之后发现了几个加密函数,最终结果很像最后要的 params ,重复几次请求验证证实确实如此
  5. image-20240616222905494

扣代码

  1. 然后我们去扣一下这里面的两个加密函数 W_eX_eW_e 是一个 key=B6*40.2_C9#e4$E3sm4 加密算法,X_e 应该是一个 rsa 加密算法
  2. image-20240617235433528
  3. 关于这个 rsa 加密临近交卷最核心的 nextBytes 以及之后的 doPublic 函数扣了很多但确实还是没有扣下来,其它部分均已知悉,详见下图
  4. image-20240618233705665
posted @ 2024-06-16 23:14  anyiya  阅读(6)  评论(0编辑  收藏  举报