水一篇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之类的抓包工具).
于是我们得到连接过程如下
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认证过程.
上述场景反过来是怎样的呢? 自己去抓包分析吧,我是水一篇,懒得继续分析了
参考:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。