Mitmproxy 实现HTTP监控与篡改

1.小知识

实现 content 修改

import requests


url = 'http://www.xiyou.edu.cn'              西邮官网
response = requests.get(url)
text = response.content.decode('utf8')         
text = text.replace('西安邮电大学', '屈哥')
print(text)


开发工具上展示
结果

<TITLE>屈哥</TITLE><META Name="keywords" Content="屈哥" />
其中一条展示
特别强调: text 与 content 推荐使用 content, 因为它是固定格式

2.Mitmproxy

实现代理服务器
访问流程: 客户端----代理服务器----服务器
浏览器发起请求----代理捕获、修改请求----服务器接收请求----服务器返回响应----代理捕获、修改响应----返回浏览器响应

一个提供Python接口的HTTP监控、拦截工具
其中包括 mitmproxy, mitmdump, mitmweb三个
因为 mitmproxy不支持Windows, 所以不介绍它

总流程如下

1.pip install mitmproxy==4.0.4
2.设置浏览器为代理服务器,代理地址为本机IP地址,端口默认8080
3.申请ca认证证书-----允许拦截、访问HTTPS请求

1.mitmweb------提供Web前端显示亦可手动修改响应

mitmweb    开启监听端口,默认为8080

打开浏览器看到弹出页面如下
在这里插入图片描述
其中第二行 intercept 处填写需要拦截的请求 url
下面空白处显示监视的请求,点开一个后,点击 Resume表示允许HTTP请求和响应通过,右边可编辑保存,后在浏览器可看到修改后的响应

2.mitmdump------命令行显示亦可执行Python脚本修改响应

mitmdump   开启监听端口
mitmdump -s xxx.py  执行当前目录下的Python测试脚本

我现在要修改响应头及响应内容

import mitmproxy.http


# 修改响应固定函数名
def response(flow: mitmproxy.http.HTTPFlow):
    """
    content 表示二进制内容
    pretty_url 表示被拦截的请求地址
    """
    if flow.request.pretty_url == 'http://www.xiyou.edu.cn/':
        flow.response.headers['name'] = "haha"
        flow.response.content = flow.response.content.decode('utf8').replace('西安邮电大学', '屈帅').encode('utf8')

浏览器 F12后F5 即可查看结果
注意: 只修改此地址响应,其他图片、静态文件响应不做修改

3.Mitmdump与Django结合

在 script.py中添加配置
将数据库与代理监控结合使用

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings")
django.setup()
import mitmproxy.http
from flow.models import User


def response(flow: mitmproxy.http.HTTPFlow):
    """
    content 表示二进制内容
    pretty_url 表示请求地址
    """
    if User.objects.filter(username='lll'):
        if flow.request.pretty_url == 'http://www.xiyou.edu.cn/':
            flow.response.headers['name'] = "haha"
            flow.response.content = flow.response.content.decode('utf8').replace('西安邮电大学', '屈帅').encode('utf8')


当数据库查询满足后才会进行拦截修改

4.Django的COOKIES

当访问流程中的下一个路由函数需要上个函数的参数时
设置cookie传参
设置后所有视图函数都能获取


def early(request):
    username = request.POST.get(username, '')
    response = render(request, 'test.html')redirect('/xxx/xxx/xx路由/')
    
    response.set_cookie('username', username)
    return response


def later(request):
    username = request.COOKIES.get('username')
    获得传递的参数


set_cookie 方法,可以使浏览器的请求头和响应头保存 cookie 内容,
浏览器开发者工具可看到;

多次访问依然可以看到,亦可以设置过期时间,关闭浏览器则 cookie 消失

5.Django的Session

类似于cookies,所有视图函数都能获取,不过方法不同

设置  request.session['name'] = 'li'
获取  value = request.session.get(name)


同时Django的自带数据库 django_session 会有记录保存
可设置过期时间,默认为14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值