MySQL协议-认证握手过程 - Go语言中文社区

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 版本认证过程

在这里插入图片描述

  1. server发送一个8字节长的随机字符串(scramble),即盐给client;
  2. client通过scramble与密码的hash异或(Xor)后得到一个32位哈希值,作为种子随机出一个8字节字符串发送给服务器;
  3. server使用数据库表mysql.user保存的password重复上述计算过程,与client端发过来的8字节字符串做对比,得出结果

MySQL 4.1 -5.7 版本认证过程

在这里插入图片描述

  1. server发送一个盐(salt, 或者叫scramble) 给client;
  2. client则使用这个salt加密密码并与用户名同时发送给server。client则使用这个salt加密密码并与用户名同时发送给server;
  3. 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)。

  1. server发送一个20字节的salt给client;
  2. client读取server的公钥,事先导入给client的;
  3. client计算password与salt的哈希值,并通过server的公钥加密发送给server;
  4. 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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/counsellor/article/details/83082894
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:48:50
  • 阅读 ( 1372 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢