【自动化训练营】雪球app抓包与mock实战课程贴2

charles
mitmproxy
录制与回放
内容过滤
maplocal
mapremote

mock

maplocal


mapremote

https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1
  • https:协议(http,http和https有什么区别?)
  • www.baidu.com:服务器的地址(DNS),把地址转成点分十进制
  • /v/douga/:服务器目录
  • ?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1:参数

maplocal

image
取消证书验证:

curl https://www.baidu.com/ -x 127.0.0.1:8090 -k

windows上cmd乱码:

CHCP 65001 

mapremote

image

第一节课case

  1. 获取 token : maplocal
  2. 使用这个 token :完成信息的获取1
  3. 使用这个token:完成信息的获取2

image
image

curl https://www.baidu.com?token=abcdef -x 127.0.0.1:8090 -k
curl https://book.douban.com?token=abcdef -x 127.0.0.1:8090 -k

课间作业

  1. 利用 maplocal 实现一个中转,对 https://www.baidu.com 进行请求,并且传递一个参数:gettoken ,就会返回这个 token
  2. 使用 mapremote 和 maplocal 完成数据查询,对 https://book.douban.com 进行请求,并且传递一个参数:get=name 和 token=abcde,就会返回 tmp.json 内容:{“name”:“xiaohong”}

mitmproxy

官网:https://www.mitmproxy.org/

安装:

  • mac:brew install mitmproxy
  • windows,linux:
  1. Install a recent version of Python (we require at least 3.6).
  2. Install pipx.
  3. pipx install mitmproxy

代理开启及过滤功能:

https://docs.mitmproxy.org/stable/concepts-filters/

  1. 开启监听(默认端口是8080):mitmdump -p 8090
  2. 录制:mitmdump -p 8090 -w record
  3. 回放:mitmdump -nC record
  4. 过滤:mitmdump -nr record -w record2 “~s hogwarts”

证书安装
>https://docs.mitmproxy.org/stable/concepts-certificates/

对雪球进行更改

  1. 使用 charles 进行更改

  2. 使用 mitmdump 实现 maplocal

"""
This example shows how to send a reply from the proxy immediately
without sending any data to the remote server.
"""
from mitmproxy import http


# request不能被改变
def request(flow: http.HTTPFlow) -> None:
    # pretty_url takes the "Host" header of the request into account, which
    # is useful in transparent mode where we usually only have the IP otherwise.

    if flow.request.pretty_url == "https://www.baidu.com/":
        flow.response = http.HTTPResponse.make(
            200,  # (optional) status code
            b"Hello World!!!!!!",  # (optional) content
            {"Content-Type": "text/html"}  # (optional) headers
        )

  1. 使用 mitmproxy 实现 maplocal
"""
This example shows how to send a reply from the proxy immediately
without sending any data to the remote server.
"""
from mitmproxy import http


# request不能被改变
def request(flow: http.HTTPFlow) -> None:
    # pretty_url takes the "Host" header of the request into account, which
    # is useful in transparent mode where we usually only have the IP otherwise.
    # 如果url中有 quote.json
    if "quote.json" in flow.request.pretty_url:
        # 打开本地的json文件
        with open("C:/Users/yuruo/Desktop/xueqiu.json", encoding="utf-8") as f:
             # 将json文件内容放入返回结果
            flow.response = http.HTTPResponse.make(
                200,  # (optional) status code
                f.read(),  # (optional) content
                {"Content-Type": "application/json"}  # (optional) headers
            )

  1. 实现 mapremote
import json


def response(flow):
    if "quote.json" in flow.request.pretty_url:
        # 返回结果json化
        res = json.loads(flow.response.content)
        # 对返回结果进行篡改
        res["data"]["items"][0]["quote"]["name"] = "hogwarts2020!!!!!"
        # 返回结果的二次赋值
        flow.response.text = json.dumps(res)

作业

  1. 使用 mitmdump 完成 maplocal,对雪球股票名子进行更改
  2. 使用 mitmdump实现 mapremote,对雪球股票名子进行更改
  • 第1题
  • maplocal
    image
  • 网页运行结果:
    image
  • curl 命令
curl https://www.baidu.com/?gettoken -x 127.0.0.1:8888 -k
  • curl运行截图
    image
  • 第2题
  • maplocal
    image
  • 网页运行截图
    image
  • curl 命令
curl "https://www.baidu.com/?gettoken&get=name&token=abcde" -x 127.0.0.1:8888 -k 
curl "https://book.douban.com/?get=name&token=abcde" -x 127.0.0.1:8888 -k
1 Like

课间作业

证书有问题,无法访问百度,把百度换成bilibili

  1. 利用 maplocal 实现一个中转,对 https://www.baidu.com 进行请求,并且传递一个参数:gettoken ,就会返回这个 token
  • maplocal设置
    image
  • 访问结果
    image
  1. 使用 mapremote 和 maplocal 完成数据查询,对 https://book.douban.com 进行请求,并且传递一个参数:get=name 和 token=abcde,就会返回 tmp.json 内容:{“name”:“xiaohong”}
  • maplocal设置
    image
  • mapremote设置
    image
  • 网页截图
    image
1 Like

课件作业

1、

浏览器

image

cmd

2、

浏览器

不知道为什么,浏览器访问正常,在cmd中访问的还是百度

  • 具体配置:

image
image

1、利用 maplocal 实现一个中转,对 https://www.baidu.com 进行请求,并且传递一个参数:gettoken ,就会返回这个 token
image
image
image

curl https://www.baidu.com?gettoken -x 127.0.0.1:8080 -k

image
2\ 使用 mapremote 和 maplocal 完成数据查询,对 https://book.douban.com 进行请求,并且传递一个参数:get=name 和 token=abcde,就会返回 tmp.json 内容:{“name”:“xiaohong”}
maplocal:
image
image
image

curl https://book.douban.com/?token=abcdef -x 127.0.0.1:8080 -k

image
mapremote:
image
image
image
image
image

curl "https://book.douban.com/?get=name&token=abcde" -x 127.0.0.1:8080 -k

image

课间作业

  1. 利用 maplocal 实现一个中转,对 https://www.baidu.com 进行请求,并且传递一个参数:gettoken ,就会返回这个 token
curl https://www.baidu.com/?gettoken=abcdef -x 127.0.0.1:8888 -k

  1. 使用 mapremote 和 maplocal 完成数据查询,对 https://book.douban.com 进行请求,并且传递一个参数:get=name 和 token=abcde,就会返回 tmp.json 内容:{“name”:“xiaohong”}

第二个curl的获取失败了,原因是有两个或更多参数时需要使用双引号

curl https://book.douban.com?"get=name&token=abcde" -x 127.0.0.1:8888 -k

或者

curl "https://book.douban.com?get=name&token=abcde" -x 127.0.0.1:8888 -k

作业1:

设置maplocal

image

浏览器访问,显示结果:

image

命令显示结果:

作业2:

设置maplocal

image

###设置mapremote
image

#浏览器访问效果

课间作业

1. 利用 maplocal 实现一个中转,对 https://www.baidu.com 进行请求,并且传递一个参数:gettoken ,就会返回这个 token

map local:
image

浏览器访问:
image

curl 访问:
image

2. 使用 mapremote 和 maplocal 完成数据查询,对 https://book.douban.com 2 进行请求,并且传递一个参数:get=name 和 token=abcde,就会返回 tmp.json 内容:{“name”:“xiaohong”}

map local:
image

map remote:
image

浏览器访问:
image

curl 访问:
多于1个参数,需要加上双引号
image

作业

1.使用 mitmdump 完成 map local,对雪球股票名字进行更改

json 文件:
image

Python 文件:

在Python文件所在目录,执行:

下拉雪球页面进行刷新后, “五菱汽车” 变成了 “hogwarts”
image

2. 使用 mitmdump实现 map remote,对雪球股票名字进行更改

Python 文件:

在Python文件所在目录,执行:

下拉雪球页面进行刷新后, “五菱汽车” 变成了 “hogwarts2020!!!”
image

课后作业

  • 1、使用 mitmdump 完成 maplocal,对雪球股票名字进行更改
    image
    xueqiu.json文件内容:
    image
    image
"""
This example shows how to send a reply from the proxy immediately
without sending any data to the remote server.
"""
from mitmproxy import http
# request不能被改变,是写死的
def request(flow: http.HTTPFlow) -> None:
    # pretty_url takes the "Host" header of the request into account, which
    # is useful in transparent mode where we usually only have the IP otherwise.
    # 如果url中有 quote.json
    if "v5/stock/batch/quote.json" in flow.request.pretty_url:
        # 打开本地的json文件
        with open("C:/Users/Administrator/Desktop/xueqiu2.json", encoding="utf-8") as f:
             # 将json文件内容放入返回结果
             #加入路径后需要把路径下的分隔符"\"修改为"/",因为"\"为转义字符
            flow.response = http.HTTPResponse.make(
                200,  # (optional) status code
                f.read(),  # (optional) content
                {"Content-Type": "application/json"}  # (optional) headers
            )

image

  • 2、使用 mitmdump实现 mapremote,对雪球股票名字进行更改
    image
import json

def response(flow):
    # 判断url是否存在"v5/stock/batch/quote.json"(有多个quote.json需要根据路径明确到具体的
    if "v5/stock/batch/quote.json" in flow.request.pretty_url:
        # 返回结果json化
        res = json.loads(flow.response.content)
        # 对返回结果进行篡改
        res["data"]["items"][1]["quote"]["name"] = "jinzhe-mu2020!!!!!"
        res["data"]["items"][1]["quote"]["current"] = "0.8888888"
        # 返回结果的二次赋值
        flow.response.text = json.dumps(res)

image

课后作业

1.使用 mitmdump 完成 maplocal,对百度进行更改

"""
This example shows how to send a reply from the proxy immediately
without sending any data to the remote server.
"""
from mitmproxy import http

#request 不能被修改,是写死的
def request(flow: http.HTTPFlow) -> None: #传了HTTPFlow参数
    # pretty_url takes the "Host" header of the request into account, which
    # is useful in transparent mode where we usually only have the IP otherwise.

    if flow.request.pretty_url == "https://www.baidu.com/":
        flow.response = http.HTTPResponse.make(
            200,  # (optional) status code
            b"Hello World!! success!!!",  # (optional) content
            {"Content-Type": "text/html"}  # (optional) headers
        )

对python所在的文件目录执行:

效果如下:

2. 使用 mitmdump 完成 maplocal,对雪球股票名子进行更改

修改json文件

python文件

"""
This example shows how to send a reply from the proxy immediately
without sending any data to the remote server.
"""
from mitmproxy import http

#request 不能被修改,是写死的
def request(flow: http.HTTPFlow) -> None: #传了HTTPFlow参数
    # pretty_url takes the "Host" header of the request into account, which
    # is useful in transparent mode where we usually only have the IP otherwise.
    #url是不是存在quote.json
    if "/v5/stock/batch/quote.json" in flow.request.pretty_url:
        #打开本地的json文件
        with open("‪C:/Users/86155/Desktop/quote.json", encoding="utf-8") as f:
            #将json文件内容加载到返回结果
            flow.response = http.HTTPResponse.make(
            200, # (optional) status code
            f.read(), # (optional) content
            {"Content-Type": "application/json"}  # (optional) headers
        )

对python所在的文件目录执行:

下拉雪球页面进行刷新后, “京东” 变成了 “奔驰test0607”,股价变成了88888888

image

2. 使用 mitmdump 完成 mapremote,对雪球股票名子进行更改

python文件

对python所在文件目录执行:

雪球执行结果,修改了list[1] 中的股票名称

image

作业

  1. 使用 mitmdump 完成 maplocal,对雪球股票名字进行更改
# request是定死的,不能被更改
def request(flow:http.HTTPFlow) -> None:
    if "quote.json" in flow.request.url:  # 如果请求的url中有quote.json
        # 打开本地的json文件
        with open(r"D:\CBF\testdata\xueqiurewrite.json", encoding="utf-8") as f:
            # 将返回结果篡改为本地json文件的内容
            flow.response=http.HTTPResponse.make(
                200,
                f.read(),
                {"Content-Type":"application/json"}
            )

运行截图:
image

  1. 使用 mitmdump实现 mapremote,对雪球股票名字进行更改
import json
from mitmproxy import http

# response是定死的,不能被改变
def response(flow: http.HTTPFlow):
    if "/v5/stock/batch/quote.json" in flow.request.pretty_url:  # 如果url中有/v5/stock/batch/quote.json
        # 再次过滤,如果url中有symbol=……,因为有多个包的地址都一样,只有参数不一样,且每次获取的地址只有symbol这个参数的值没有变
        if "symbol=PDD%2CBABA%2CJD%2CSH601318%2CSZ002400%2CSH600895%2CSH600519%2CSZ000651&extend=detail" in flow.request.pretty_url:
            res = json.loads(flow.response.content)  # 把返回内容转换为json格式,并赋值给res
            # 把返回内容的data字典中的items字典中的第1个列表中的quote字典中的name字典的值篡改为拼多多mapremote
            res["data"]["items"][0]["quote"]["name"] = "拼多多mapremote"  # 这里语法与jq很相似
            res["data"]["items"][1]["quote"]["name"] = "阿里巴巴mapremote"
            res["data"]["items"][2]["quote"]["name"] = "京东mapremote"
            res["data"]["items"][3]["quote"]["name"] = "中国平安mapremote"
            flow.response.text = json.dumps(res)  # 把篡改后的值转换为字符串并赋值给返回内容

运行截图:
image

一:用mitmdump实现maplocal

  • 源码

  • 篡改股票名称和价格并翻倍

image

二:用mitmdump实现mapremote

  • 源码

image

  • 实现股票名称的篡改

image

关闭