不是浏览器有了 HTTPS,浏览器显示绿色的小锁就是安全的

本文主要讲解如何使用 mitmdump 配合 python 来实现抓包,修改请求头和响应内容,目的是希望各位千万别只看网站是不是加了 https 就安全了,并不是使用了 HTTPS,浏览器显示个绿色的小锁就代表网站是安全的,当黑客通过 MITM 中间人攻击,只要有权限,是可以随意篡改请求和响应头或响应内容的。

增加请求头

def response(flow):
    flow.response.headers["newheader"] = "foo"  

改写请求参数

实现,改写百度的搜索关键词,不管输入任何关键词都替换成网易云

    from mitmproxy import ctx

def request(flow):
    # 忽略非百度搜索地址
    if flow.request.host != "www.baidu.com" or not flow.request.path.startswith("/s"):
        return
    # 确认请求参数中有搜索词
    if "wd" not in flow.request.query.keys():
        return
    # 替换搜索词为“网易云”
    flow.request.query.set_all("wd", ["网易云"])

    flow.request.host  http请求host

效果

关于 flow request 的一些方法

  • flow.request.method 请求方法
  • flow.request.scheme 请求协议
  • flow.request.url 请求URL链接
  • flow.request.query 请求URL查询参数
  • flow.request.path 请求URL路径
  • flow.request.urlencoded_form 请求POST数据
  • flow.response.status_code HTTP响应状态码
  • flow.response.headers HTTP响应头信息
  • flow.response.get_text HTTP响应内容

改写响应信息

def response(flow):
    # 忽略非百度搜索地址
    if flow.request.host != "www.baidu.com":
        return

    # 将响应中百度的 logo“”替换为“谷歌的 logo”
    text = flow.response.get_text()
     text = text.replace("//www.baidu.com/img/bd_logo1.png", "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png")
    flow.response.set_text(text)

效果

爬取得到 APP 电子书存入 MongoDB(来源 python 爬虫)

import json
import pymongo
from mitmproxy import ctx

client = pymongo.MongoClient('localhost')
db = client['igetget']
collection = db['books']


def response(flow):
    global collection
    url = 'https://dedao.igetget.com/v3/discover/bookList'
    if flow.request.url.startswith(url):
        text = flow.response.text
        data = json.loads(text)
        books = data.get('c').get('list')
        for book in books:
            data = {
                'title': book.get('operating_title'),
                'cover': book.get('cover'),
                'summary': book.get('other_share_summary'),
                'price': book.get('price')
            }
            ctx.log.info(str(data))
            collection.insert(data)