mysql漏洞
2017年那场大规模的拖库事件,至今还在安全圈里被反复提起。攻击者用的不是什么0day,而是MySQL一个存在了快十年的老漏洞——CVE-2012-2122。原理蠢得让人想笑:只要不断尝试密码,命中概率约1/256,就能绕过认证直接登进root。是的,暴力破解,但不是猜密码,是猜“比较结果”。
这个漏洞出在MySQL处理用户认证时的memcmp函数上。密码比对一旦返回0就放行,可如果内存中刚好有个随机字节是0,那这次比较就“碰巧”通过了。听起来像段子,但当年互联网上遍地是开着3306端口、没做访问控制的数据库。有人写了个几十行的Python脚本,跑了几个小时,拿下了好几万台服务器。
官方在2012年就发了补丁,可五年后依然有大把系统裸奔。为什么?很多运维根本不知道自己在跑MySQL,更别提关注它的版本号了——那是某个老旧CMS的附属品,装完就忘,phpMyAdmin还挂在公网上。漏洞不可怕,可怕的是没人知道自己有什么。
MySQL的漏洞家族里,SQL注入算是最“传统”的一支。开发者写拼接查询,用户输入直接怼进语句里,单引号一闭合,整张表就跟你姓了。前几年某电商平台被拖走千万条用户手机号,事后复盘,攻击入口不过是一个搜索框,参数没做转义。你说这技术含量高吗?不高。但就是管用。
还有一类容易被忽略的,是权限提升漏洞。默认安装的MySQL,root账户只允许本地登录,但有些安装包为了省事,把bind-address设成0.0.0.0,密码还为空。扫描器一扫一个准,上去就是GRANT ALL PRIVILEGES,直接变超级管理员。这类问题跟版本无关,纯粹是配置懒惰。
我见过最离谱的一次,是某公司内网数据库被人拖了库,查日志发现攻击者是从一个“已下线”的测试服务器跳过来的。那台测试机装了MySQL,开了弱口令,防火墙规则没删,成了内网跳板。事后DBA一脸委屈:“那个机器早该关了,但没人记得密码,就一直开着。”——你看,漏洞的尽头往往是管理问题。
说句实在话,MySQL本身的代码质量在数据库里算不错的。真正让它千疮百孔的,是海量使用者把它当“免费的Oracle”用,却没人愿意花时间做加固。补丁打了没?账号权限最小化了吗?慢查询日志和错误日志有人看吗?多数时候,答案都是沉默。
所以别迷信“最新版本就安全”。版本只是起点,配置、监控、响应机制才是真正的防线。MySQL漏洞年年有,但最危险的永远不是那个CVE编号,而是你对着屏幕想不起来自己数据库密码存在哪个Excel里的那个瞬间。
