安全攻防实战丨如何预防利用中间人攻击进行小程序刷分
本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-利用中间人攻击进行小程序刷分》,作者: MDKing 。
1. 中间人攻击定义
中间人攻击(Man-in-the-middle attack,简称MITM)是攻击者在进行网络通信的双方中间,分别与两端建立独立的联系,并进行数据嗅探甚至篡改,而通信的双方却对中间人毫不知情,认为自己是直接在与对端通信。
随着计算机通信网技术的不断发展,MITM攻击也越来越多样化。最初,攻击者只要将网卡设为混杂模式,伪装成代理服务器监听特定的流量就可以实现攻击,这是因为很多通信协议都是以明文来进行传输的,如HTTP、FTP、Telnet等。后来,随着交换机代替集线器,简单的嗅探攻击已经不能成功,必须先进行ARP欺骗才行。
2. 常见中间人攻击类型
ARP欺骗:ARP欺骗(ARP Spoofing)是一种局域网攻击方式,攻击者通过伪造虚假的ARP响应包,将自己的MAC地址伪装成网络中其他主机的MAC地址,从而欺骗其他主机发送数据给攻击者,达到中间人攻击的目的。简单讲就是在局域网内篡改ip与MAC地址的映射关系,源主机通过指定ip访问目标主机,这样就在不知情的情况下把消息发到了攻击者的主机上。
DNS欺骗:DNS欺骗(DNS Spoofing)也叫做DNS缓存投毒攻击(DNS Cache Poisoning),攻击者通过入侵DNS服务器、控制路由器等方法把受害者要访问的目标机器域名对应的IP篡改为攻击者所控制机器的ip(篡改域名与ip的映射关系),源主机通过指定域名访问目标主机,这样就在不知情的情况下把消息发到了攻击者的主机上。
WiFi热点攻击:攻击者创建一个与本地免费WiFi同名或相近名称的 WiFi 热点,当受害者连接到该热点时,攻击者可以拦截所有通过该热点传输的数据,包括用户名、密码等敏感信息。本质上是混淆视线,让人误识别wifi。
网站钓鱼:攻击者通过构建一个域名、页面与正常网站很类似的虚构网站,诱导受害者进入虚假网站后,输入敏感信息,攻击者通过截获敏感的信息做进一步的动作。本质上是混淆视线,让人误识别网站。
代理服务器:受害者可能由于多种原始使用了代理服务器,比如突破服务器对某些IP的屏蔽访问一些禁止访问的网站、害怕自己IP暴露被对方入侵而寻找层层代理把自己包裹起来等。如果代理服务器被不怀好意的攻击者做了手脚,就可以非常轻易的实施中间人攻击的各种手段。
3. 中间人攻击的危害类型
信息泄露(流量监控):中间人攻击可以截获分析受害者与服务器之间的所有通信信息,通过流量分析获取到用户的隐私数据或者对于攻击者有用的信息。
身份窃取(会话劫持):攻击者可以通过截获受害者与服务器间的cookie,拥有了cookie,就拥有了合法的会话令牌,可以已合法用户的身份对服务器进行相关操作。
通信篡改:受害者与服务器间的请求、响应报文都经过攻击者,攻击者在一去一回的过程中均能对交互数据进行篡改,即请求报文篡改、响应报文篡改。
网络服务瘫痪:攻击者可以干扰正常通信流量,造成网络服务无法正常使用或系统崩溃。
4. 预防中间人攻击的方法
验证证书可信性: 在进行网上购物、在线银行等操作时,要注意校验网站证书的合法性,确保数据传输的安全性。
使用虚拟专用网络(VPN): VPN能够在公共网络上建立加密连接,使得通信内容无法被中间人轻易截获和篡改。
5. 中间人攻击的利用实战
中间人攻击,我们除了要当心被攻击者攻击之外,我们自己利用中间人攻击的思想与技术也可以做一些“特殊”的事情。比如小程序游戏的辅助。本章节中我们借助mitmproxy中间人代理工具进行实战演练,实现小程序的客户端与服务器间交互数据的嗅探与篡改。
5.1 window下安装mitmproxy
首先安装python环境,然后用管理员身份在命令行中运行pip3 install mitmproxy
5.2 安装CA证书
想要截获https请求,就需要将mitmproxy的CA证书添加到受信任的根证书颁发机构。
5.3 启动mitmproxy
在完成 mitmproxy 的安装之后,mitm 提供的三个命令。要启动 mitmproxy, 用 mitmproxy、mitmdump、mitmweb 这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。
mitmproxy | 会提供一个在终端下的图形界面,具有修改请求和响应,流量重放等功能,具体操作方式有点 vim 的风格 |
mitmdump | 可设定规则保存或重放请求和响应,mitmdump 的特点是支持 inline 脚本,由于拥有可以修改 request 和 response 中每一个细节的能力,批量测试,劫持等都可以轻松实现 |
mitmweb | 提供的一个简单 web 界面,简单实用,初学者或者对终端命令行不熟悉的可以用 mitmweb 界面 |
我们通过mitmweb为例,如下图会启动8080端口的代理服务器,以及8081端口的web界面。
5.4 设置代理
搜索->代理服务器设置,将127.0.0.1 8080填写进去,打开代理
再访问网站后,在mitmweb界面上就能看到被拦截的请求了
5.5 编写并执行自定义python脚本
脚本编写关键点:
HTTP flow流程 | 一个完整的 HTTP flow 会依次触发 requestheaders、request、responseheaders 和 response,我们可以针对相关事件方法执行自定义逻辑脚本。 |
Event 事件 | 事件里面有3个事件是比较重要的 start 启动的时候被调用,会替换当前的插件,可以用此事件注册过滤器 request(flow) 当发送请求时,被调用 response(flow) 当接收到响应时被调用 |
关键数据结构 | mitmproxy.models.http.HTTPRequest mitmproxy.models.http.HTTPResponse mitmproxy.models.http.HTTPFlow |
API文档参考 | https://docs.mitmproxy.org/stable |
例如:
def response(flow): flow.response.headers["SAYHELLO"] = "Hello everyone!"
执行命令mitmweb -s addHeader.py
查看拦截的请求的response中,多了名为SAYHELLO的header
5.6 实战一:头脑王者即时显示答案
该案例引用自:使用 mitmproxy + python 做拦截代理
#!/usr/bin/env python #coding=utf-8 import sys import json from mitmproxy import flowfilter from pymongo import MongoClient reload(sys) sys.setdefaultencoding('utf-8') ''' 头脑王者即时显示答案脚本 ''' class TNWZ: ''' 从抓包可以看到 问题包的链接最后是 findQuiz ''' def __init__(self): #添加一个过滤器,只处理问题包 self.filter = flowfilter.parse('~u findQuiz') #连接答案数据库 self.conn = MongoClient('localhost', 27017) self.db = self.conn.tnwz self.answer_set = self.db.quizzes def request(self, flow): ''' 演示request事件效果, 请求的时候输出提示 :param flow: :return: ''' if flowfilter.match(self.filter,flow): print(u'准备请求答案') def responseheaders(self, flow): ''' 演示responseheaders事件效果, 添加头信息 :param flow: :return: ''' if flowfilter.match(self.filter, flow): flow.response.headers['Cache-Control'] = 'no-cache' flow.response.headers['Pragma'] = 'no-cache' def response(self, flow): ''' HTTPEvent 下面所有事件参数都是 flow 类型 HTTPFlow 可以在API下面查到 HTTPFlow, 下面有一个属性response 类型 TTPResponse HTTPResponse 有个属性为 content 就是response在内容,更多属性可以查看 文档 :param flow: :return: ''' if flowfilter.match(self.filter, flow): #匹配上后证明抓到的是问题了, 查答案 data = flow.response.content quiz = json.loads(data) #获取问题 question = quiz['quiz'] print(question) #获取答案 answer = self.answer_set.find_one({"quiz":question}) if answer is None: print('no answer') else: answerIndex = int(answer['answer'])-1 options = answer['options'] print(options[answerIndex]) #这里简单演示下start事件 def start(): return TNWZ()
执行脚本后,打开小程序,看到请求已经被做了相应修改,并且在控制台输出了答案
5.7 实战二:某合成类小游戏篡改数据实现物品复制
def response(self, flow): if flow.request.host == 'game.xxx.com' and flow.request.path == '/xxx/reqLogin': ctx.log.info("reqLogin response %d flows" % self.num) print("content:" + flow.response.text) jsonObj = json.loads(flow.response.text) dataObj = json.loads(jsonObj['data']['data']) print("TodayFirstLaunch:" + str(dataObj["TodayFirstLaunch"])) # copy thing if (dataObj["GameBoardData"]["itemData"][0][0] is not None and dataObj["GameBoardData"]["itemData"][0][0]["id"] == "F0L7" and dataObj["GameBoardData"]["itemData"][0][6] is not None and dataObj["GameBoardData"]["itemData"][0][6]["id"] == "F0L7" and dataObj["GameBoardData"]["itemData"][1][0] is not None and dataObj["GameBoardData"]["itemData"][2][0] is None): print("Copy thing") dataObj["GameBoardData"]["itemData"][2][0] = dataObj["GameBoardData"]["itemData"][1][0]; jsonObj['data']['data'] = json.dumps(dataObj) flow.response.text = json.dumps(jsonObj)
实现逻辑为,拦截该游戏登录请求的响应消息,将内容按照一定逻辑进行篡改,客户端收到篡改后的数据,将对应游戏物品展示在客户端界面上,下一次触发数据同步到服务器时,就成功将篡改数据归档到云端服务器。
5.8 实战启示
启示一:头脑王者的response中把正确问题的序号都一并发给客户端了。可以修改为展示题目、验证答案分成两个请求,避免直接暴露答案序号等关键信息。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Databend 开源周报第 116 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 What's On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 特性预览:使用 SQL 管理后台任务 此前,Databend 引入了 后台服务(Serverless Background Service)以允许 Databend 执行后台单次作业或以守护进程模式运行 cron 作业,从而简化数据维护任务管理的复杂性。 为了便于创建、管理和维护后台任务,Databend 近期支持了包括 CREATE TASK, ALTER TASK 和 SHOW TASK 在内的一系列 SQL 语句。 例如,下面的 SQL 语句要求 Databend 在每天早上 6 点(PST 时区),执行名为 MyTask1 的任务,将 (1, 2) 和 (3, 4) 插入到表 t 中。 CREATE TASK IF NOT EXISTS MyTask1 SCHEDULE = USING CRON...
- 下一篇
云图说|华为云CodeArts Build,云端化的编译构建平台
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 本文分享自华为云社区《云图说|华为云CodeArts Build,云端化的编译构建平台》,作者:阅识风云。 互联网企业业务种类多,业务跨平台,多语言编程成为常态? 传统应用软件为本地应用,业务复杂,软件规模大,编译构建耗时长? 移动终端APP业务变化快,交付要求短平快? 对于以上的问题,又该如何解决呢? 华为云编译构建 CodeArtsBuild又放大招啦!隆重上线了适用于Web应用前台、后端应用程序,支持按需分配编译构建资源,支持Android系列移动终端APP的编译构建服务,快来解锁您的编译构建之旅吧! 点击我了解更多,华为云编译构建CodeArts Build服务等着您! 点击关注,第一时间了解华为云新鲜技术~
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器