mitmproxy抓包 | Python双篡改假请求实战(六)

王大力测试进阶之路

共 3479字,需浏览 7分钟

 ·

2021-12-13 06:27


往期回顾:

抓包工具mitmproxy环境配置使用(一)

抓包工具mitmproxy | mitmweb基本用法(二)

mitmproxy抓包 | Python实时生成接口自动化用例(三)

mitmproxy抓包 | Python实时生成接口自动化用例

mitmproxy抓包 | Python疑难测试场景mock实战(四)

mitmproxy抓包 | Python疑难测试场景mock

mitmproxy抓包 | Python篡改请求参数实战(五)


       实际工作中,业务模块之间大多存在依赖关系的,例:B模块依赖A模块的触发,如果A模块处于阻断性、很难触发、已触发无法再次触发或不想被触发时,B模块是无法单独进行调试或测试的,这时可以借助mitmproxy工具实现前后端双向篡改,重定向A模块的url,mock A模块成功的响应数据,即A模块被假定成功触发,实际并未触发到服务器,这时我们就可进行B模块的调试或测试工作。


测试需求:

拉钩app-我的页面-活动banner

1、活动banner接口500了,活动banner不展示,无法测试活动详情页

2、活动banner已进入1次,活动banner不展示,无法测试活动详情页

3、至尊VIP充值5w,才能看到活动banner,真实充值不太可能,活动banner不展示,无法测试活动详情页



抓取banner(BAT大佬都在看的搞笑学习法)接口信息,或者参照接口文档接口信息


GET https://gate.lagou.com/v1/neirong/edu/ads/ad?type=1 HTTP/2.0
{ "content": { "adAppHref": "https://edu.lagou.com/growth/sem/offer.html?utm_source=lagouedu&utm_medium=wodetab-banner&utm_campaign=%E5%A4%A7%E8%AF%BE%E7%BA%BF%E7%B4%A2&_channel_track_key=yKyKbQxA&lgec_type=website&lgec_sign=9A0FAD8D532161C641529DEDC5C30AFC", "adAppImage": "https://s0.lgstatic.com/i/image6/M00/66/38/Cgp9HWGwLI6AIYWSAAMK4ADi3Jw315.png", "adId": 169, "adName": "大厂私教offer计划", "adPcHref": "", "adPcImage": "", "adType": null }, "message": "操作成功", "state": 1, "uiMessage": null}

篡改接口地址https://gate.lagou.com/v1/neirong/edu/ads/ad?type=1为https://www.baidu.com,让app发起请求时,不请求拉钩服务器,重定向到百度服务器

  • request

commonDescription
request = flow.request
request.urlurl
request.host域名
request.headers请求头
request.method方式:POST、GET 等
request.scheme类型:http、https
request.path路径,URL 除域名之外的内容
request.query返回MultiDictView类型的数据,URL 的键值参数
request.query.keys()获取所有请求参数键值的键
request.query.values()获取所有请求参数键值的值
request.query.get('wd')获取请求参数中wd 键的值(前提是要有 wb 参数
request.query.set_all('wd', ['python'])wd 参数的值修改为 python
class Demo:
def request(self, flow): # 匹配指定的url if 'https://gate.lagou.com/v1/neirong/edu/ads/ad?type=' in flow.request.url: flow.request.url='https://www.baidu.com/'

addons = [ Demo()]

由于前段识别到接口返回的数据是百度响应的数据格式,无法正常识别,故不展示banner了

我们想让banner展示出来,需要根据接口文档模拟正确的响应数据,让前端可以正常识别

  • response

commonDescription
response = flow.response
response.status_code响应码
response.text文本 (同下)
response.contentBytes 类型
response.headers响应头
response.cookies响应 cookie
response.set_text()修改响应的文本
response.get_text()文本 (同上)
flow.response= flow.response.make(404)响应 404

import json, os
response_data = { "content": { "adAppHref": "https://edu.lagou.com/growth/sem/offer.html?utm_source=lagouedu&utm_medium=wodetab-banner&utm_campaign=%E5%A4%A7%E8%AF%BE%E7%BA%BF%E7%B4%A2&_channel_track_key=yKyKbQxA&lgec_type=website&lgec_sign=9A0FAD8D532161C641529DEDC5C30AFC", "adAppImage": "https://s0.lgstatic.com/i/image6/M00/66/38/Cgp9HWGwLI6AIYWSAAMK4ADi3Jw315.png", "adId": 169, "adName": "测试", "adPcHref": "", "adPcImage": "", "adType": 'null' }, "message": "操作成功", "state": 1, "uiMessage": 'null'}

class Demo:
def request(self, flow): # 匹配指定的url if 'https://gate.lagou.com/v1/neirong/edu/ads/ad?type=' in flow.request.url: flow.request.url='https://www.baidu.com/'
def response(self, flow): # 匹配指定的url if flow.request.url.startswith ( 'https://www.baidu.com/' ): # 设置响应据 flow.response.set_text ( json.dumps ( response_data ) )

addons = [ Demo()]

再次app请求,接口响应数据是我们脚本里设置的

banner展示出来了,说明篡改的响应数据生效了,前段识别成功了,这时可以进入活动详情进行测试了,达到我们想要的效果了




浏览 97
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报