前言
如果要在命令行中连接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://www.freebuf.com/articles/web/159342.html
---恢复内容结束---