mysql协议简析

前言

如果要在命令行中连接mysql,最常用的便是

mysql -u root -p

这样指定用户名和密码

当然还可以使用远程连接

mysql -h 127.0.0.1 -u root -p

还有一种较为少见的,使用ssl来连接

mysql -h 127.0.0.1 -u root --ssl=on -p

既然可以远程连接,那么数据必定要从网上流通.那就必然要面临安全问题,mysql是怎么解决的呢?

前期设置

既然要研究mysql远程连接时的通信过程,那么首先要开启mysql的远程连接功能

如果在配置文件中设置了bind-address,需要将其改为0.0.0.0

创建一个用户名为admin,密码为123456的用户,允许外部访问

grant all on *.* to admin@'%' identified by '123456' with grant option; 

flush privileges;

使用tcpdump监听3306端口,并将监听结果导出至mysql.pcap文件中

tcpdump -i lo port 3306 -w mysql.pcap

使用

mysql -h 127.0.0.1 -u admin -p

来连接数据库

执行下列命令

use flag;
select * from flag1 where id = 1;
exit

mysql协议分析

0x1 建立连接

首先三次握手建立连接

建立连接后服务端会向客户端发送一个包,包的格式如下

抓包的数据为

接受到这样的包后由客户端加密过后向服务端发包,包的格式如下

抓包数据如下

只要password符合服务端的数据,即可建立连接

加密的方法如下

hash1 = SHA1(password) //password是用户输入的密码
result = hash1 ^ sha1(scramble+sha1(hash1))

0x2 执行命令

执行命令的报文如下

抓包数据中可以看到

其中02就对应着切换数据库的操作

0x00 	COM_SLEEP 	内部线程状态
0x01 	COM_QUIT 	关闭连接
0x02 	COM_INIT_DB 	切换数据库
0x03 	COM_QUERY 	SQL查询请求
0x04 	COM_FIELD_LIST 	获取数据表字段信息
0x05 	COM_CREATE_DB 	创建数据库
0x06 	COM_DROP_DB 	删除数据库
0x07 	COM_REFRESH 	清除缓存
0x08 	COM_SHUTDOWN 	停止服务器
0x09 	COM_STATISTICS 	获取服务器统计信息
0x0A 	COM_PROCESS_INFO 	获取当前连接的列表
0x0B 	COM_CONNECT 	(内部线程状态)
0x0C 	COM_PROCESS_KILL 	中断某个连接
0x0D 	COM_DEBUG 	保存服务器调试信息
0x0E 	COM_PING 	测试连通性
0x0F 	COM_TIME 	(内部线程状态)
0x10 	COM_DELAYED_INSERT 	(内部线程状态)
0x11 	COM_CHANGE_USER 	重新登陆(不断连接)
0x12 	COM_BINLOG_DUMP 	获取二进制日志信息
0x13 	COM_TABLE_DUMP 	获取数据表结构信息
0x14 	COM_CONNECT_OUT 	(内部线程状态)
0x15 	COM_REGISTER_SLAVE 	从服务器向主服务器进行注册
0x16 	COM_STMT_PREPARE 	预处理SQL语句
0x17 	COM_STMT_EXECUTE 	执行预处理语句
0x18 	COM_STMT_SEND_LONG_DATA 	发送BLOB类型的数据
0x19 	COM_STMT_CLOSE 	销毁预处理语句
0x1A 	COM_STMT_RESET 	清除预处理语句参数缓存
0x1B 	COM_SET_OPTION 	设置语句选项
0x1C 	COM_STMT_FETCH 	获取预处理语句的执行结果

参考链接

https://segmentfault.com/a/1190000012166738

https://www.freebuf.com/articles/web/159342.html

---恢复内容结束---

原文地址:https://www.cnblogs.com/hf99/p/9917414.html