前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[MYSQL] 默认密码插件和实际用户加密的密码插件不一致时, 是怎么认证的?

[MYSQL] 默认密码插件和实际用户加密的密码插件不一致时, 是怎么认证的?

原创
作者头像
大大刺猬
发布2024-11-29 11:01:28
发布2024-11-29 11:01:28
1480
举报
文章被收录于专栏:大大刺猬大大刺猬

导读

水一篇mysql认证的文, 之前我们讲过mysql的连接过程, 对于复杂的aching_sha2_password还专门写了篇文章来介绍, 甚至还除了审计脚本(记录业务发送的SQL),也基于此记录了SQL回复时间,从而得到mysql接受sql到返回数据所花费的时间,方便甩锅给开发,更甚至还仿照了pymysql实现了单个文件的minipymysql. (感兴趣的可以自己去翻以前的文章,脚本都在https://github.com/ddcw上面的).

扯远了, 总之就是熟悉mysql的连接(包含主从连接)过程是很有帮助的. 而今天要讲的就是其中的一个知识点: 我们知道服务端回复的HandshakeV10里面的密码插件是来自全局变量@@global.default_authentication_plugin, 而全局变量的值和用户实际加密的插件很可能是不一样的. 这时候的认证过程是怎么样的呢?

认证过程

我们直接通过抓包来看吧,简单明了.

先构建环境, 我们这里演示用户使用mysql_native_password, 默认值为caching_sha2_password的情况,

然后我们使用抓包工具来抓一下,(我这里就使用以前写的转发脚本了, 也可以使用tcpdump或者wireshark之类的抓包工具).

于是我们得到连接过程如下

代码语言:txt
复制
S->C:  0 b'J\x00\x00\x00\n8.0.28\x00\x15\x00\x00\x00\r,0\x04vDu\x17\x00\xff\xf7\xff\x02\x00\xff\x9f\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\rM`W*\x01SVyL\x04\x15\x00caching_sha2_password\x00'
C->S:  1 b'\xcf\x00\x00\x01\x85\xa6\xff\x19\x00\x00\x00\x01\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00root\x00 1\xb7\xb6\xb8\xd0Ei\xc3g\xdc\x8f\xc4f\xc1\xb3\xdd\xed\x16\n.\xad\x9e\xb0b\xc8\x80E\xc7\x1342fcaching_sha2_password\x00r\x04_pid\x048121\t_platform\x06x86_64\x03_os\x05Linux\x0c_client_name\x08libmysql\x07os_user\x04root\x0f_client_version\x068.0.28\x0cprogram_name\x05mysql'
S->C:  2 b',\x00\x00\x02\xfemysql_native_password\x00\r,0\x04vDu\x17\rM`W*\x01SVyL\x04\x15\x00'
C->S:  3 b'\x14\x00\x00\x03\x14\xdbcp\x1b2\x1bV-\x88^\x18\x8d\xbd\x93\xf7\xe9\x96P\xb9'
S->C:  4 b'\x07\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00'
C->S:  0 b'#\x00\x00\x00\x03\x00\x01select @@version_comment limit 1'
S->C:  1 b'\x01\x00\x00\x01\x01'
S->C:  2 b"'\x00\x00\x02\x03def\x00\x00\x00\x11@@version_comment\x00\x0c\xff\x00TU\x01\x00\xfd\x00\x00\x1f\x00\x00"
S->C:  3 b'\x1d\x00\x00\x03\x1cMySQL Community Server - GPL'
S->C:  4 b'\x07\x00\x00\x04\xfe\x00\x00\x02\x00\x00\x00'
C->S:  0 b'\x10\x00\x00\x00\x03\x00\x01select USER()'
S->C:  1 b'\x01\x00\x00\x01\x01'
S->C:  2 b'\x1c\x00\x00\x02\x03def\x00\x00\x00\x06USER()\x00\x0c\xff\x00\x80\x04\x00\x00\xfd\x00\x00\x1f\x00\x00'
S->C:  3 b'\x0c\x00\x00\x03\x0broot@ddcw21'
S->C:  4 b'\x07\x00\x00\x04\xfe\x00\x00\x02\x00\x00\x00'

整体过程和之前差不多, 只是客户端回复HandshakeResponse41之后, 服务端是返回的是\xfemysql_native_password, \xfe表示的是switch auth, 即使用后面的加密插件重新加密并发送过来, 之前讲过

也就是参数为caching_sha2_password时,可以借助caching_sha2_password的switch auth来传递mysql_nativie_password的密码. 那么问题来了, 反过来可以不呢? 即@@global.default_authentication_plugin=mysql_native_password时,用户使用的是caching_sha2_password加密的

总结

还是画图来表示连接过程吧, 其实就相当于特殊情况的caching_sha2_password认证过程.

上述场景反过来是怎样的呢? 自己去抓包分析吧,我是水一篇,懒得继续分析了

参考:

https://github.com/ddcw/ddcw

https://cloud.tencent.com/developer/article/2242261

https://cloud.tencent.com/developer/article/2247829

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 认证过程
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档