MySQL协议-认证握手过程
0x00 简介
MySQL数据库的认证方式是逐步改进的,从它的发展过程可以看到安全性的由弱到强。
在MySQL-4.1以前的版本存在容易被爆破(CVE-2000-0981)的安全风险。知名的内网嗅探工具cain有一项功能就是破解mysql数据库的hash值,猜解出明文密码。
在Mysql-4.1以后猜解哈希变得不再容易,但是只要有足够的精力,还是有戏的,cain和hashcat等工具都有支持。
在MySQL-5.1以后版本也曾出过一个身份认证漏洞(CVE-2012-2122),只需用户名就可以利用该漏洞登录数据库。
0x01 认证交互过程
MySQL 3.20 - 4.0 版本认证过程
- server发送一个8字节长的随机字符串(scramble),即盐给client;
- client通过scramble与密码的hash异或(Xor)后得到一个32位哈希值,作为种子随机出一个8字节字符串发送给服务器;
- server使用数据库表
mysql.user
保存的password重复上述计算过程,与client端发过来的8字节字符串做对比,得出结果
MySQL 4.1 -5.7 版本认证过程
- server发送一个盐(salt, 或者叫scramble) 给client;
- client则使用这个salt加密密码并与用户名同时发送给server。client则使用这个salt加密密码并与用户名同时发送给server;
- server也使用
mysql.user
表中的哈希值与client发送的密码哈希做比较,相同则认证成功。
当然,上述过程是MySQL 4.1及以后版本的认证方式。
在官网中可以找到MySQL 4.1使用的 【Protocol::HandshakeV10】 握手包数据格式
查看数据结构定义指南 -> 第一列是字节大小,第二列是释义
1 [0a] protocol version #协议
string[NUL] server version
4 connection id #wireshark中的Thread ID
string[8] auth-plugin-data-part-1 # salt的前8字节
1 [00] filler
2 capability flags (lower 2 bytes)
if more data in the packet:
1 character set
2 status flags
2 capability flags (upper 2 bytes)
if capabilities & CLIENT_PLUGIN_AUTH {
1 length of auth-plugin-data
} else {
1 [00]
}
string[10] reserved (all [00]) #字符串一般以[00]结束
if capabilities & CLIENT_SECURE_CONNECTION {
string[$len] auth-plugin-data-part-2 ($len=MAX(13, length of auth-plugin-data - 8)) #salt剩余12字节
if capabilities & CLIENT_PLUGIN_AUTH {
string[NUL] auth-plugin name
}
MySQL 5.7以上 版本认证过程
借用一张MySQL-8.04的图,从MySQL5.7开始密码加密已经开始使用SHA256(password)。
- server发送一个20字节的salt给client;
- client读取server的公钥,事先导入给client的;
- client计算password与salt的哈希值,并通过server的公钥加密发送给server;
- server用过RSA私钥解密,并通过scramble和password的hash进行比较认证。
由于引入了非对称加密方式的安全机制,嗅探MySQL流量中的哈希值并进行碰撞的攻击方法不再那么容易。作为攻击者必须获得server的公钥,才能有资格进行交互。
参考文献
参考文献
https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse
https://dev.mysql.com/doc/internals/en/authentication-method.html
https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/
https://dev.mysql.com/worklog/task/?id=10774
http://www.freebuf.com/vuls/3815.html
https://www.jb51.net/article/131681.htm
https://cn.aliyun.com/jiaocheng/1118621.html
http://www.php.cn/mysql-tutorials-355496.html
https://stackoverflow.com/questions/48477121/wireshark-password-capture-of-mysql-traffic
相关文章
- Docker安装MySQL
- 【MySql】mysql 的权限体系介绍
- linux - mysql 异常:MySQL Daemon failed to start.
- 关于安装php时 --with-mysql命令参数问题
- Mysql中NUMERIC和DECIMAL类型区别比较
- mysql分享一:运维角度浅谈MySQL数据库优化
- mysql中limit与in不能同时使用的解决方式.
- Ruby on Rails 3 Can't connect to local MySQL server through socket '/tmp/mysql.sock' on linux
- 【转载】彻底解决Linux下MySQL 5.5的中文乱码问题
- 【问题解决方案】MySQL安装后无法启动-net start mysql服务名无效
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
- MySQL 查询速度慢与性能差的原因与解决方法
- MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写
- MySQL 数据库救火:磁盘爆满了,怎么办?
- mysql事务 mysql事务回滚 MySQL事务死锁 如何解除死锁 资金出入账
- mysql表设计注意点
- ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 5
- [MySQL] 解决办法: Error: Transaction test error: file /etc/my.cnf from install of mysql-community-server
- mysql sql语句大全(MySQL语句 整理一)
- MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎
- MySQL缺失mysql_config文件
- Centos7安装Mysql-5.6.34
- 【Mysql异构实时同步Oracle】OGG12异构同步mysql到oracle(windows mysql实时同步数据到linux oracle)详细文档