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