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

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

猜你喜欢

转载自www.cnblogs.com/hf99/p/9917414.html