mitmproxy实践——退选已过退选期的博雅课程
一、什么是mitmproxy
所谓mitm,全称是Man-in-the-Middle Attack(中间人攻击),是一种监听和篡改http封包的黑客行为。在学习爬虫的时候大家基本已经尝试过Chrome对封包的查看,Chrome仅能监听该应用内的HTTP协议封包,且不能进行修改,用处较窄。
在监听上最常用的软件是Wireshark,可以监听几乎任何类型的网络,并可以进行解析格式漂亮地显示封包。推荐大家下载学习。
在HTTP篡改方面最常用的是Fiddler,不过我前些日发现了一款极佳的应用可以代替Fiddler,它就是mitmproxy——一款功能丰富强大扩展性强的HTTP封包修改工具。
在本篇博客中,我将在一个实际的应用场景下演示mitmproxy的基本用法,更多的用法和扩展方式强烈建议查看官方文档学习。
二、安装mitmproxy
安装方式
mitmproxy支持Windows,Mac,Linux三平台,在Mac和Linux平台安装使用包管理器会极其方便:
Mac:
brew install mitmproxy
如果你从没用过brew,可以参考这篇文章https://www.jianshu.com/p/06a9a59e7040 ,不建议从brew官网安装,你会遇到一大堆网络问题。(熟悉配置代理的大佬请无视)
Linux(Ubuntu):
sudo apt install mitmproxy
Windows的话可以在官网下载安装包:https://www.mitmproxy.org/
使用方式
Mac用户和Linux用户可以直接在终端里使用命令mitmproxy
打开一个命令行版本的或者使用命令mitmweb
打开一个网页UI版的,Windows仅可以使用网页UI版的。
配置网络和伪造证书
启动mitmproxy之后,将会默认开放一个8080端口的代理,你要主动把浏览器的流量主动引向这个端口,才可以让mitmproxy拦截流量。如果你还不会设置系统代理,可以参考这两篇文章Mac: https://www.kuaidaili.com/doc/using/mac/ Windows: https://jingyan.baidu.com/article/eae07827ed56fa5eed548514.html 。代理服务器地址填写127.0.0.1,端口填写8080。
配置好之后,你用浏览器的访问就会在mitmproxy中留下记录了。
不过你可能会发现访问https://www.baidu.com之类的网站浏览器会提示不安全,这是因为TLS的安全机制探测到了中间人攻击,是正常现象。鉴于这次攻击是你有意为之,可以通过相信一个伪造证书来消除这个问题。(当然,这步可以不完成,手动在浏览器忽略风险直接访问也是可以的)
访问 http://mitm.it/ 这个网站即可获得你的专属证书,找到你的操作系统,安装它。
三、来Hack选课网站吧
下面我会用命令行界面进行演示,webui的用法会更加简单。
进入选课网站,点击已选课程,就可以看到这两个数据包了,其中我们要观察queryChosenCourse返回的数据,找到我们要退选的课程的id。当左边的>>指向目标,按回车就可以查看细节,该程序各个界面的指针的移动方式都可以选择使用vim键位,十分舒适。
就在这里,我们找到了目标的id是2570,将其记录下来,按q可以返回刚才的界面。
接下来,我们随便找到一个可以选的课,选了然后立刻退掉,这样就拿到了选课包和退选包。
移动到delChosenCourse,按回车进入,可以看到我们发送的数据包是
{
"id": xxxx
}
我们接下来要修改它并进行重放,达到退选的目的,按e之后选择request-body,修改请求包的包体。
之后会进入一个文本编辑器(根据你的配置不同可能是vim或nano之类的)将数字修改为刚才记录的2570,保存退出。
此时我们离成功只差一步了,数据包现在只在本地被修改,我们还需要进行Replay-Attack,将修改过后的包发送出去。仅需要在这个界面按R就完成了。
可以看到此时已经退选成功了,课程人数从40人变成39人。
同理,还可以再次利用这个工具Replay选课的数据包把这门已经过了选课时间的课选回来,人数又变回了40。
四、小结
mitmproxy这款工具在我看来堪称神器,在Mac上的Fiddler Everywhere真的难用且无法扩展;Windows上功能够用的Fiddler4也不如这款工具美观。mitmproxy界面很清新美观,对vim各种键位的支持让我可以用起来很流畅,这篇博客仅仅展示了Replay的功能,除此以外它还支持拦截流量,修改后再继续;它的扩展语言使用了Python,相较于Fiddler Script来说过于友好。非常欢迎大家来学习,相信会对大家计算机网络这门课有所帮助。
我们之所以可以利用修改封包来退选过期课程,是因为选课网站没有做后端校验,过分相信前端的用户输入,这是极其错误的做法。在做网页开发乃至应用开发时应该注意到这点,后端一定要做好校验。(某软工课程项目组因为不验证用户token在答辩时被公开处刑,太惨了)
另外,我在这里用Python封装了选课退选接口,刚才演示的步骤用这个脚本也可以极快地完成。https://github.com/Dr-Bluemond/BuaaBykcCrawler
感谢您的阅读!