若是要在命令行中链接mysql,最经常使用的即是html
mysql -u root -p
这样指定用户名和密码mysql
固然还可使用远程链接web
mysql -h 127.0.0.1 -u root -p
还有一种较为少见的,使用ssl来链接sql
mysql -h 127.0.0.1 -u root --ssl=on -p
既然能够远程链接,那么数据一定要从网上流通.那就必然要面临安全问题,mysql是怎么解决的呢?数据库
既然要研究mysql远程链接时的通讯过程,那么首先要开启mysql的远程链接功能segmentfault
若是在配置文件中设置了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
使用tcp
mysql -h 127.0.0.1 -u admin -p
来链接数据库
执行下列命令
use flag; select * from flag1 where id = 1; exit
首先三次握手创建链接
创建链接后服务端会向客户端发送一个包,包的格式以下
抓包的数据为
接受到这样的包后由客户端加密事后向服务端发包,包的格式以下
抓包数据以下
只要password符合服务端的数据,便可创建链接
加密的方法以下
hash1 = SHA1(password) //password是用户输入的密码 result = hash1 ^ sha1(scramble+sha1(hash1))
执行命令的报文以下
抓包数据中能够看到
其中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
---恢复内容结束---
![]()