安全攻防实战丨如何预防利用中间人攻击进行小程序刷分

本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-利用中间人攻击进行小程序刷分》,作者: 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. 预防中间人攻击的方法

使用加密通信协议: 通过使用HTTPS等加密通信协议,能够有效防止中间人窃取用户敏感信息。

验证证书可信性: 在进行网上购物、在线银行等操作时,要注意校验网站证书的合法性,确保数据传输的安全性。

防范ARP欺骗: 使用网络工具或防火墙等技术手段,监控网络中的ARP请求和响应,发现异常情况及时处理。

使用虚拟专用网络(VPN): VPN能够在公共网络上建立加密连接,使得通信内容无法被中间人轻易截获和篡改。

保持软件更新: 及时安装操作系统、浏览器和应用程序的安全补丁,以修复潜在的安全漏洞。

5. 中间人攻击的利用实战

中间人攻击,我们除了要当心被攻击者攻击之外,我们自己利用中间人攻击的思想与技术也可以做一些"特殊"的事情。比如小程序游戏的辅助。本章节中我们借助mitmproxy中间人代理工具进行实战演练,实现小程序的客户端与服务器间交互数据的嗅探与篡改。

mitmproxy 是一款 Python 语言开发的开源中间人代理神器,支持 SSL,支持透明代理、反向代理,支持流量录制回放,支持自定义脚本等。功能上同 Windows中的 Fiddler 有些类似。

5.1 window下安装mitmproxy

首先安装python环境,然后用管理员身份在命令行中运行pip3 install mitmproxy

完成后,系统将拥有 mitmproxy、mitmdump、mitmweb 三个命令,我们可以拿 mitmdump 测试一下安装是否成功,执行:mitmdump --version

5.2 安装CA证书

想要截获https请求,就需要将mitmproxy的CA证书添加到受信任的根证书颁发机构。

在初次运行mitmproxy(或者mitmdump、mitmweb)之后,会在C盘当前登录用户的.mitmproxy目录下面生成证书

双击mitmproxy-ca-cert.cer -> 安装证书 -> 当前用户 -> 将所有的证书都放入下列存储 -> 受信任的根证书颁发机构

5.3 启动mitmproxy

在完成 mitmproxy 的安装之后,mitm 提供的三个命令。要启动 mitmproxy, 用 mitmproxy、mitmdump、mitmweb 这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。

我们通过mitmweb为例,如下图会启动8080端口的代理服务器,以及8081端口的web界面。

5.4 设置代理

搜索->代理服务器设置,将127.0.0.1 8080填写进去,打开代理

再访问网站后,在mitmweb界面上就能看到被拦截的请求了

5.5 编写并执行自定义python脚本

接下来我们如果相对拦截的请求响应包做相关处理的话,就可以通过自定义python脚本的方式实现。

脚本编写关键点:

例如:

addHeader.py脚本为拦截的请求添加了SAYHELLO header

arduino 复制代码
def response(flow):
    flow.response.headers["SAYHELLO"] = "Hello everyone!"

执行命令mitmweb -s addHeader.py

查看拦截的请求的response中,多了名为SAYHELLO的header

5.6 实战一:头脑王者即时显示答案

该案例引用自:使用 mitmproxy + python 做拦截代理

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 实战二:某合成类小游戏篡改数据实现物品复制

ini 复制代码
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中把正确问题的序号都一并发给客户端了。可以修改为展示题目、验证答案分成两个请求,避免直接暴露答案序号等关键信息。

**启示二:**某合成类小游戏的服务器、客户端之间的关键信息交互,比如上传下载游戏进度数据,都要对数据体做签名校验,否则,内容本身可以被轻易的拦截、篡改。该合成类小游戏仅对请求数据做了签名校验,未对响应报文做签名校验。就产生了响应报文可以被利用的漏洞。

点击关注,第一时间了解华为云新鲜技术~

相关推荐
用户962377954481 天前
VulnHub DC-3 靶机渗透测试笔记
安全
木易士心1 天前
一文读懂:微信小程序云数据库直连原理与使用指南
微信小程序·serverless
明月_清风1 天前
小程序云函数:从入门到全栈的“降维打击”指南
前端·微信小程序·小程序·云开发
拉不动的猪2 天前
移动端调试工具VConsole初始化时的加载阻塞问题
前端·javascript·微信小程序
叶落阁主2 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954484 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机4 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
WangHappy4 天前
不写 Canvas 也能搞定!小程序图片导出的 WebView 通信方案
前端·微信小程序
用户962377954484 天前
DVWA 靶场实验报告 (Medium Level)
安全