MySQL服务端恶意读取客户端文件漏洞分析并使用Golang编写简易蜜罐

本文分析了MySQL服务端恶意读取客户端文件的漏洞原理,通过MySQL协议解析,阐述了如何利用Golang编写简易蜜罐来模拟攻击。通过Wireshark抓包分析了MySQL的登录流程,并详细解释了数据包内容。最后展示了利用Golang实现的代码,测试结果显示该漏洞在特定条件下可被触发。
摘要由CSDN通过智能技术生成

MySQL读取客户端文件漏洞分析并使用Golang编写简易蜜罐

一、 原理概述

这并不是一个新鲜的漏洞,我也是为了学习Golang才又拿出来炒一遍冷饭。
先大概说一下原理,MySQL客户端和服务端通信过程中是通过对话的形式来实现的,客户端发送一个操作请求,然后服务端根据客服端发送的请求来响应客户端,在这个过程中客户端如果一个操作需要两步才能完成那么当它发送完第一个请求过后并不会存储这个请求,而是直接就丢掉了,所以第二步就是根据服务端的响应来继续进行,这里服务端就可以欺骗客户端做一些事情。
但是一般的通信都是客服端发送一个MySQL语句然后服务端根据这条语句查询后返回结果,也没什么可以利用的,不过MySQL有个语法LOAD DATA INFILE是用来读取一个文件内容并插入到表中,既可以读取服务器文件也可以读取客服端文件,读取客服端文件的语法是load data local infile "/data/test.csv" into table TestTable;为了形象一点,这个语法的使用过程我用哦两个人的对话来表示:

	1.客户端:把我我本地/data/test.csv的内容插入到TestTable表中去
	2.服务端:请把你本地/data/test.csv的内容发送给我
	3.客户端:好的,这是我本地/data/test.csv的内容:....
	4.服务端:成功/失败

正常情况下这个流程是没毛病,但是前面我说了客户端在第二次并不知道它自己前面发送了什么给服务器,所以客户端第二次要发送什么文件完全取决于服务端,如果这个服务端不正常,就有可能发生如下对话:

	1.客户端:把我我本地/data/test.csv的内容插入到TestTable表中去
	2.服务端:请把你本地/etc/passwd的内容发送给我
	3.客户端:好的,这是我本地/etc/passwd的内容:....
	4.服务端:....随意了

这样服务端就非法拿到了/etc/passwd的文件内容,今天我要实现的就是做一个伪服务端来欺骗善良的客户端。

二、 分析MySQL协议

从上面可以看出,只要我们实现一个假的MySQL服务端就能做上面的事情,要实现一个伪MySQL服务端也不是很困难,因为我们并不需要实现什么功能,只需要保证能让客户端通过权限认证就行了,我们借助Wireshark抓包结合MySQL官方文档就能比较容易做到,首先使用Wireshark抓包查看MySQL登录流程:

  1. 我这里需要抓本地的数据所以还需要先设置一下让本地的流量也经过网卡,ipconfig查看本地IP和网关:
    ipconfig
    然后使用管理员权限执行CMD命令:
    route add 192.168.0.130 mask 255.255.255.255 192.168.0.1

    route add 192.168.0.130 mask 255.255.255.255 192.168.0.1
    这样就可以抓取本地数据了,不过MySQL连接地址要使用:192.168.0.130
  2. 选择网卡并过滤mysql协议数据准备抓包:
    准备抓包
    使用Navicat连接MySQL服务器然后停止抓包开始分析:
    抓包数据
    因为我这里是本地抓包,所以源地址和目标地址都是192.168.0.130,可能不太好分辨出是客户端还是服务端发出的,但是跟局后面的流程可以看出第一个是从服务端发出的,以此类推就行了。
    接下来就一个个分析:
  3. 分析各个数据包
    1. 第一个数据包:服务端->客户端
    第一个包
    0000   4a 00 00 00 0a 35 2e 35 2e 35 33 00 21 00 00 00   J....5.5.53.!...
    0010   3b 46 30 59 52 6c 4a 6e 00 ff f7 21 02 00 0f 80   ;F0YRlJn.ÿ÷!....
    0020   15 00 00 00 00 00 00 00 00 00 00 6a 49 6e 6e 5d   ...........jInn]
    0030   66 69 5f 7c 74 52 7d 00 6d 79 73 71 6c 5f 6e 61   fi_|tR}.mysql_na
    0040   74 69 76 65 5f 70 61 73 73 77 6f 72 64 00         tive_password.
    
    
    当客户端连接上服务器,服务器就会发送这第一个握手数据包,这些数据的内容取决于服务器版本和服务器配置,具体含义就需要参见:MySQL官方文档
    从上面可以看到这个数据包一共有78个字节,文档中明确指出了第一个字节表示协议版本,支持v10和v9,从Mysq3.21.0开始默认就是v10版本,那么第一个字节应该是0a,但是你会发现上面第一个字节并不是0a而是4a,这是为什么呢?
    查阅文档发现:
    Mysql文档截图
    通过Wireshark
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值