汇总 SQL Server 常见提权路径,区分配置滥用提权、组件功能提权、账户 / 代理提权、链路跳转提权、漏洞 / 缺陷提权补充冷门、特殊、容易被运维忽略的提权链路;区分:常规路径、另类特殊路径;标注底层载体、前置条件、攻击链路简述、风险等级 (P0 最高)、检测特征
SQL Server 常见 + 特殊 / 另类提权路径汇总表
说明:在原有基础上补充冷门、特殊、容易被运维忽略的提权链路;区分:常规路径、另类特殊路径;标注底层载体、前置条件、攻击链路简述、风险等级 (P0 最高)、检测特征。 P0:极易利用,高危;P1:条件满足即可利用;P2:需要特定配置;P3:极难、依赖旧版本 / 特殊环境
| 编号 | 提权路径分类 | 路径名称 | 底层载体 | 前置依赖条件 | 攻击链路简述 | 风险等级 | 检测特征 |
|---|---|---|---|---|---|---|---|
| 【常规路径】 | |||||||
| 1 | 组件功能提权 | xp_cmdshell 提权 | xplog70.dll | xp_cmdshell=1;具备执行权限 | 调用扩展存储过程,生成 cmd 子进程,以 SQL 服务账号 / 代理账号执行系统命令 | P0 | 审计:xp_cmdshell调用;Windows 4688 进程创建事件 |
| 2 | 组件功能提权 | OLE Automation 提权 | odsole70.dll | Ole Automation Procedures=1;拥有 sp_oacreate 执行权限 | 进程内实例化 COM 对象 WScript.Shell,无派生新进程,执行命令读写文件 | P0 | 审计 sp_oacreate/sp_oamethod;无 4688 日志,隐蔽 |
| 3 | 组件功能提权 | SQL‑CLR UNSAFE 提权 | sqlclr.dll、.NET Framework4.x | clr enabled=1;可 CREATE ASSEMBLY;绕过 clr strict security | 导入 UNSAFE 程序集,调用 Win32 API,进程内执行任意代码 | P0 | 审计 CREATE ASSEMBLY;sys.assemblies 出现 UNSAFE_ACCESS 程序集 |
| 4 | 角色权限提权 | sysadmin 角色授予 | master.sys.server_role_members | 执行者拥有 ALTER ANY SERVER ROLE/sysadmin | ALTER SERVER ROLE sysadmin ADD MEMBER xxx,直接授予实例最高权限 |
P0 | Xevent / 审计检测 ALTER SERVER ROLE;sys.server_role_members 新增成员 |
| 5 | 代理作业提权 | SQL Server Agent 作业提权 | SQLAGENT.EXE、msdb 库 | Agent 服务运行;攻击者可修改 / 创建作业 | 篡改 Agent 作业步骤,配置操作系统命令,手动执行或等待调度,使用代理账号权限 | P0 | msdb.dbo.sysjobs、sysjobsteps 新增 / 修改作业;sysproxies 代理账号使用 |
| 6 | 跨实例链路提权 | Linked Server 链接服务器提权 | OLEDB 提供程序,sys.servers | 可创建链接服务器;错误的身份模拟映射 | 本地通过OPENQUERY / EXEC AT向远端 SQL 下发 T‑SQL,利用远端高危组件横向 |
P1 | sys.servers 新增外部链接服务器;审计 EXEC AT 调用 |
| 7 | 账号爆破提权 | sa 弱密码爆破 | sys.sql_logins | sa 账号启用、密码强度弱 | 暴力破解 sa 账号,直接获得 sysadmin | P1 | 大量失败登录审计日志;sa 账号登录事件 |
| 8 | 数据库角色向上突破 | db_owner 向上提权 | 用户库元数据 | 数据库 TRUSTWORTHY ON;存在证书 / 非对称密钥;错误配置 | 库内 db_owner 借助受信任数据库、证书模块突破到服务器级别权限 | P1 | 数据库 TRUSTWORTHY ON;sys.databases 视图 trustworthy 标志为 1 |
| 【特殊 / 另类冷门提权路径】 | |||||||
| 9 | 注册表扩展存储过程提权 | xp_regread /xp_regwrite 滥用提权 | xpstar.dll | sysadmin,xp_*reg 存储过程可用 | 读写 Windows 注册表;可读取服务账号密码、SAM 缓存、配置项,配合其他链路落地执行;可修改启动项 | P2 | 审计 xp_regread、xp_regwrite 调用;注册表敏感键读取操作 |
| 10 | 扩展存储过程自定义 DLL 提权 | 自定义扩展存储过程 X‑proc | sp_addextendedproc,自定义恶意 dll | sysadmin;可以向磁盘写入 dll 文件;可注册扩展存储过程 | 将恶意 dll 写入磁盘,sp_addextendedproc注册扩展存储过程,dll 在 sqlservr 进程内执行原生代码 |
P2 | master.sys.extended_procedures 出现非微软扩展存储过程;磁盘出现陌生 dll |
| 11 | SSIS 代理 / SSIS 包提权 | SSIS 包恶意执行提权 | SSIS 引擎、SSISDB 库 | SSIS 服务可用;攻击者可部署 / 修改 SSIS 项目包;代理账号配置 | 上传恶意 SSIS 包,包内执行操作系统命令;以 SSIS 代理账号身份运行 | P2 | SSISDB 项目 / 包新增修改;SSIS 服务执行日志 |
| 12 | 资源滥用提权 | xp_dirtree /xp_subdirs 信息泄露辅助提权 | xpstar.dll | 允许执行 xp_dirtree;sysadmin 或被授予执行权限 | 遍历服务器本地磁盘目录,搜集配置文件、凭据文件,为后续攻击搜集信息,本身不直接执行命令,作为提权前置链路 | P3 | 审计 xp_dirtree、xp_subdirs 调用;大量目录遍历行为 |
| 13 | 备份文件劫持提权 | 恶意备份到可写路径,劫持写入文件 | BACKUP DATABASE 命令 | sysadmin;服务器磁盘路径可写;可以控制备份目标路径 | 利用BACKUP DATABASE ... TO DISK=写入恶意 dll / 脚本到系统目录,配合其他功能加载执行 |
P2 | 异常 BACKUP 操作,备份路径指向 system32 等系统目录 |
| 14 | CLR 程序集还原迁移提权 | 恶意 CLR 程序集数据库还原 | mdf 数据库备份文件 | 攻击者可还原数据库;目标实例 clr enabled 开启;未开启 clr strict security | 把携带 UNSAFE CLR 程序集的恶意数据库备份还原到目标实例,直接获得可执行的恶意 CLR 对象 | P2 | 异常 RESTORE DATABASE;还原后 sys.assemblies 出现 UNSAFE 程序集 |
| 15 | 证书 / 非对称密钥后门提权 | 服务器证书非对称密钥后门提权 | master 库证书、非对称密钥 | sysadmin;可以创建证书 / 非对称密钥;可加载程序集签名 | 在 master 植入恶意证书,绕过 clr strict security,后续加载 UNSAFE 程序集;或者利用证书映射登录实现权限绕过 | P1 | master.sys.certificates 出现陌生自定义证书;非对称密钥新增条目 |
| 16 | RPC 远程存储过程提权 | sp_oacreate 调用远程 COM 组件 | odsole70.dll | Ole Automation 开启;目标可访问远程 COM 对象 | sp_oacreate 实例化远程主机 COM 对象,跨主机执行操作,内网横向 | P3 | sp_oacreate 传入远程 ProgID;网络对外 COM 组件访问流量 |
| 17 | 服务器触发器后门提权 | 服务器级别 DDL 触发器提权 | sys.server_triggers | sysadmin,可创建服务器触发器 | 创建服务器 DDL 触发器,每次发生服务器事件自动执行恶意 T‑SQL;等待 DBA 执行特定操作自动触发提权动作 | P2 | sys.server_triggers 出现非微软服务器触发器;审计 DDL 触发器执行 |
| 18 | 作业激活后门提权 | Agent 非激活作业埋伏提权 | msdb 库 sysjobs | 拥有修改 Agent 作业权限;作业禁用状态 | 创建禁用的恶意 Agent 作业,等待 DBA 后续启用该作业,实现延时触发提权,攻击链路潜伏 | P3 | msdb.sysjobs 中大量禁用操作系统命令步骤的作业 |
| 19 | 权限遗留提权 | sys.fn_xp_cmdshell_proxy_account 代理账号滥用 | master 库 | 配置了 xp_cmdshell 代理账号;低权限用户拥有 xp_cmdshell 执行权限 | 不需要 sysadmin,普通用户借助代理账号的 Windows 凭据执行系统命令 | P2 | xp_cmdshell_proxy_account存在配置;非 sysadmin 账号调用 xp_cmdshell |
| 20 | 链接服务器 OLEDB 提供程序执行命令 | 链接服务器调用 OLEDB 命令执行 | sys.servers,MS‑DAOSQL | 可创建链接服务器;使用特殊 OLEDB 提供程序 | 利用链接服务器的 OLEDB 提供执行操作系统命令,不需要本地开启 xp_cmdshell | P2 | sys.servers 特殊 OLEDB 提供程序;EXEC AT 调用外部存储过程 |
| 21 | 漏洞类提权 | 历史 CVE 权限绕过提权 | sqlservr.exe 对应版本漏洞 | SQL Server 未打对应安全补丁;拥有普通低权限登录账号 | 利用版本漏洞,低权限账号直接绕过权限检查提升 sysadmin | P0 | 对应版本;审计普通账号异常获取 sysadmin 角色;对应 CVE 编号 |
| 22 | 应用层注入链提权 | SQL 注入完整链路提权 | 业务应用 + SQL Server | Web 应用存在 SQL 注入;应用账号具备较高 SQL 权限 | 攻击者通过 Web 注入,依次完成:开启高危组件、添加账号、执行系统命令;权限上限等于应用数据库账号 | P0 | Web 访问日志出现 SQL 注入特征;数据库侧异常配置变更 |
补充特殊另类路径关键说明
- xp_regread/xp_regwrite:本身不直接执行命令,属于信息搜集 + 辅助提权,经常用来读取服务账号密码、读取注册表自启动项,再配合备份劫持、组件完成落地。
- 自定义扩展存储过程 sp_addextendedproc:很多运维只关闭 xp_cmdshell 开关,但是没有限制 sp_addextendedproc,sysadmin 上传恶意 dll 即可重新注册恶意扩展存储过程。
- 备份劫持:
BACKUP DATABASE可以写入任意本地路径,只要账号有对应磁盘写权限;攻击者可以把 dll 写入System32目录,后续通过扩展存储过程加载。 - xp_cmdshell 代理账号
##xp_cmdshell_proxy_account##:非常容易被忽略,非 sysadmin 用户也可以调用 xp_cmdshell,权限是代理 Windows 账号,不是调用 SQL 账号。 - 证书后门:SQL Server2017+
clr strict security=1环境下,不再信任 TRUSTWORTHY,攻击者会在 master 植入恶意证书,给恶意 CLR 程序集签名,绕过安全校验。 - 服务器 DDL 触发器、禁用 Agent 作业:属于潜伏式后门提权,不立即执行,等待后续管理员操作触发,属于隐蔽的另类提权方式。
- SSIS 包提权:企业环境 SSIS 使用广泛,很多人忽略 SSIS 代理账号权限,恶意 SSIS 包可以执行操作系统命令。
延伸巡检要点(可合并进之前 PowerShell 流水线)
需要增加巡检项:
- 检查自定义扩展存储过程
sys.extended_procedures - 检查服务器 DDL 触发器
sys.server_triggers - 检查 master 库陌生证书、非对称密钥
- 检查 xp_cmdshell 代理账号配置
- 检查 msdb 库 SSIS 项目、包信息
- 检查数据库 TRUSTWORTHY ON 的数据库清单
SQL Server 提权方式完整解构
拆解维度:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化流水线 说明:汇总 SQL Server 常见提权路径,区分配置滥用提权、组件功能提权、账户 / 代理提权、链路跳转提权、漏洞 / 缺陷提权;每一种拆解底层实现、依赖组件、攻击链路、边界限制;最后附完整巡检流水线。
提权总览表
| 提权方式 | 底层核心原理 | 依赖组件 / 文件 | 前置条件 | 攻击场景 | 输出权限 |
|---|---|---|---|---|---|
| sysadmin 角色授予 | ALTER SERVER ROLE修改服务器角色成员,直接授予实例最高服务器主体权限 |
master 系统元数据,sys.server_role_members |
攻击者已有ALTER ANY SERVER ROLE /sysadmin 权限 |
拿到低权限 DBA、SQL 注入可执行 T‑SQL,将自身账号加入 sysadmin | 实例 sysadmin |
| xp_cmdshell 提权 | xplog70.dll,扩展存储过程,内部CreateProcessW生成 cmd 子进程,继承 SQL 服务账号 Windows 令牌 |
xplog70.dll、cmd.exe |
1.xp_cmdshell开关开启;2. 调用者具备执行权限;3.sysadmin 或合法代理账号配置 |
SQL 注入、低权限获取存储过程执行权限,执行系统命令 | SQL 服务账号操作系统权限 |
| OLE‑Automation 提权 | odsole70.dll,进程内 COM 对象实例化,无派生子进程,继承 SQL 服务账号权限 |
odsole70.dll、ole32.dll/oleaut32.dll |
Ole Automation Procedures=1,调用者拥有 sp_oacreate 系列执行权限 |
SQL 注入,实例化WScript.Shell、Scripting.FileSystemObject执行命令、读写文件 |
SQL 服务账号操作系统权限 |
| SQL‑CLR 提权 | sqlclr.dll桥接.NET Framework,加载数据库内部存储的托管程序集;UNSAFE_ACCESS可调用原生 Win32 API |
sqlclr.dll、系统.NET Framework 4.x |
1.clr enabled=1;2. 可执行CREATE ASSEMBLY;3. 允许UNSAFE_ACCESS;4.SQL2017 + 需绕过clr strict security |
导入恶意 UNSAFE 程序集,执行任意原生代码;无新进程,隐蔽性强 | SQL 服务账号操作系统权限 |
| SQL Server Agent 代理提权 | Agent 作业 / 代理账户,作业步骤可执行操作系统命令;代理账户映射 Windows 凭据,作业以代理账户身份运行 | SQLAGENT.EXE、Agent 内部作业存储 msdb 库 |
1.SQL Agent 服务运行;2. 攻击者可创建 / 修改 Agent 作业;3. 存在可用代理账户 | 低权限 SQL 账号篡改 Agent 作业,等待调度触发,或手动执行作业步骤 | 代理账户 Windows 操作系统权限 |
| Linked Server(链接服务器)提权 | 跨实例 OLEDB 远程调用,链接服务器配置错误的身份模拟,本地权限传递到远端 SQL 实例 | oledb提供程序、master 库链接服务器元数据sys.servers |
1. 可创建 / 修改链接服务器;2. 模拟配置开启;3. 两端信任关系配置缺陷 | 本地 SQL 注入,通过链接服务器向远端实例执行 T‑SQL,获取远端 sysadmin;也可调用远端 OLE 存储过程执行系统命令 | 远端 SQL 实例权限,可联动操作系统 |
| sa 弱密码提权 | sa 是 SQL 内置高权限登录名;弱口令爆破直接拿到 sysadmin 权限 | master 库登录元数据sys.sql_logins |
sa 启用、密码简单,端口 1433 可访问 | 外部爆破、内网横向,登录获取实例 sysadmin | 实例 sysadmin |
| 服务账户滥用提权 | SQL Server 服务账号本身拥有高 Windows 权限;攻击者利用前述组件 (xp_cmdshell/OLE‑Automation/CLR) 以该身份执行系统操作 | sqlservr.exe服务账号 |
攻击者拿到 sysadmin,启用高危组件;服务账号本地权限过高 | 数据库权限→操作系统权限,内网横向移动 | SQL 服务账号操作系统权限 |
| db_owner 数据库角色提权 | 数据库级别最高角色,可在库内执行大量操作,部分场景可链到服务器级别提权 | 用户库系统元数据sys.database_role_members |
攻击者可修改数据库角色成员,已有库内权限 | 拿到库 db_owner,配合组件、链接服务器、信任数据库配置向上突破服务器权限 | db_owner,部分场景提升至 sysadmin |
| 权限绕过 / 漏洞提权 | SQL Server 版本漏洞,低权限主体绕过权限检查直接执行高权限操作;历史 CVE | 对应版本 sqlservr.exe 及相关 dll | 未打补丁,低权限登录账号可登录实例 | 内网已有普通 SQL 账号,利用漏洞直接提升为 sysadmin | 实例 sysadmin |
| 应用 SQL 注入缺陷提权 | Web / 业务应用未做输入过滤,攻击者可控部分 T‑SQL 语句;利用应用数据库账号已有权限向上拓展 | 业务应用 + SQL Server | 应用存在 SQL 注入,应用数据库账号权限过高 | 外部通过 web 入口,在应用账号权限上下发 T‑SQL,开启高危组件、添加账号 | 应用账号对应 SQL 权限,可进一步到操作系统 |
一、各提权路径底层原理、依赖、逻辑链路
1)sysadmin 角色授予提权
底层原理 SQL Server 服务器级别角色存储于master.sys.server_role_members;ALTER SERVER ROLE xxx ADD MEMBER xxx修改该元数据,直接把登录账号加入 sysadmin 服务器角色;一旦加入,该登录拥有实例全部服务器权限。
依赖文件
sqlservr.exe;master.mdf(存储服务器角色元数据)
依赖关系
- 执行者需要:
ALTER ANY SERVER ROLE权限 或本身已是 sysadmin; - 不需要操作系统层面权限,纯数据库内部权限变更。
逻辑链路
攻击者可控T‑SQL执行
↓
ALTER SERVER ROLE sysadmin ADD MEMBER [target_login]
↓
master.sys.server_role_members写入成员关系
↓
该登录下次会话生效,获得完整sysadmin权限
边界
- 仅影响 SQL 实例权限,不会直接获得操作系统权限;拿到 sysadmin 之后再借助 xp_cmdshell/OLE‑Automation/CLR 才能落地操作系统;
- 需要服务器级别权限,普通 db_owner 默认无法执行该命令。
2)xp_cmdshell 提权(xplog70.dll)
底层原理 扩展存储过程,xplog70.dll内部调用CreateProcessW创建 cmd.exe 子进程;执行身份:sysadmin 复用 sqlservr 服务账号令牌;非 sysadmin 走##xp_cmdshell_proxy_account##代理凭据。
依赖文件 xplog70.dll、cmd.exe、master.mdf(扩展存储过程元数据)
逻辑链路
攻击者T‑SQL执行 EXEC xp_cmdshell 'cmd命令'
↓
sqlservr查询sys.configurations确认xp_cmdshell开关开启
↓
加载xplog70.dll导出函数,权限校验
↓
获取Windows访问令牌(服务账号 / 代理账号)
↓
CreateProcessW 生成cmd.exe子进程,管道捕获输出
↓
命令执行,结果回传给T‑SQL客户端
边界
- 会产生 4688 进程创建 Windows 日志,容易被检测;
- 开关关闭时直接拒绝调用;
- 代理账号配置错误则非 sysadmin 调用失败。
3)OLE‑Automation 提权(odsole70.dll)
底层原理 odsole70.dll在sqlservr.exe进程内实例化 COM 对象,无新子进程;COM 对象直接继承 SQL 服务账号 Windows 令牌;可实例化WScript.Shell、Scripting.FileSystemObject实现命令执行、文件读写。
依赖文件 odsole70.dll、ole32.dll、oleaut32.dll、master.mdf
逻辑链路
EXEC sp_oacreate 'WScript.Shell',@obj out
EXEC sp_oamethod @obj,'Run',NULL,'cmd /c xxx'
↓
sqlservr调用odsole70.dll
↓
校验Ole Automation Procedures开关
↓
CoCreateInstance在sqlservr进程内创建COM对象
↓
COM对象执行命令,全部运行于SQL服务进程内部
边界
- 无 4688 进程日志,隐蔽性高于 xp_cmdshell;
- 无代理账号机制,全部使用 SQL 服务账号权限;
- 部分 COM 组件在服务进程环境无法正常工作。
4)SQL‑CLR 提权(sqlclr.dll)
底层原理 sqlclr.dll作为桥接层,加载数据库内部存储的.NET 程序集;UNSAFE_ACCESS权限集允许调用任意 Win32 原生 API;SQL2017 + 默认clr strict security=1强制证书签名。
依赖文件 sqlclr.dll、系统.NET Framework 4.x、mdf(存储程序集二进制)
逻辑链路
CREATE ASSEMBLY [mal] FROM 恶意二进制 WITH PERMISSION_SET = UNSAFE
CREATE PROCEDURE … AS EXTERNAL NAME …
EXEC 恶意CLR存储过程
↓
sqlclr.dll校验clr enabled、clr strict security、证书签名
↓
创建AppDomain,加载数据库内的托管程序集
↓
UNSAFE代码调用Win32 API执行系统操作
边界
- 无派生子进程,审计最难;
- SQL‑CLR 仅支持.NET Framework,不支持.NET Core/.NET5+;
- 迁移还原数据库必须导入签名证书,否则程序集加载失败。
5)SQL Server Agent 代理提权
底层原理 SQL Server Agent(SQLAGENT.EXE) 作业步骤可以执行操作系统命令;代理账户保存 Windows 凭据,作业步骤以代理账户身份运行,而非 SQL 服务账号;msdb 库存储作业、代理配置。
依赖文件 SQLAGENT.EXE,msdb.mdf
逻辑链路
攻击者(有修改Agent作业权限)创建/修改作业
↓
作业步骤配置操作系统命令,选择高权限代理账户
↓
手动执行作业或等待调度触发
↓
SQLAGENT进程以代理Windows账号执行系统命令
边界
- 攻击前提:攻击者可修改 Agent 作业;
- 权限是代理账号,不一定等于 SQL 服务账号;
- Agent 服务停止则无法触发。
6)Linked Server 链接服务器提权
底层原理 链接服务器是 SQL Server 跨实例 OLEDB 访问;如果配置不安全身份模拟,本地 SQL 权限可以传递到远端实例;远端也可以调用 xp_cmdshell 等高危组件。
依赖文件 master.mdf(sys.servers 元数据),对应 OLEDB 访问提供程序。
逻辑链路
攻击者本地SQL,创建/操作链接服务器
↓
开启身份模拟,本地登录映射到远端SQL登录
↓
通过OPENQUERY / EXEC AT 向远端实例下发T‑SQL
↓
远端执行高危存储过程,获取远端sysadmin或操作系统权限
边界
- 需要网络连通两端 SQL 实例;
- 身份模拟配置错误才会发生;严格账号映射可防护。
7)sa 弱密码提权
底层原理 sa 为 SQL Server 内置服务器级 sysadmin 登录;如果启用且密码简单,攻击者可暴力破解,直接登录实例获取 sysadmin。
依赖文件 master.mdf sys.sql_logins
边界
- 如果 sa 禁用,则该路径不可用;
- 仅拿到 SQL 实例权限,后续仍要借助高危组件拿到操作系统权限。
8)db_owner 数据库角色提权
底层原理 db_owner 是数据库级别最高角色,可以操作库内对象;在特定错误配置下(例如数据库TRUSTWORTHY ON、证书 / 非对称密钥、链接服务器),可以从库内向上突破到服务器级别权限。
边界
- 默认情况下 db_owner≠sysadmin;需要依赖额外错误配置才能向上提权。
9)漏洞 / 权限绕过提权
底层原理 SQL Server 版本漏洞,低权限登录绕过权限检查直接执行服务器级别操作;对应 CVE 编号。
边界
- 需要对应版本未打补丁;
- 补丁更新后该路径失效。
10)应用 SQL 注入缺陷提权
底层原理 业务 Web 应用输入过滤缺陷,攻击者可控 T‑SQL 片段;所有后续提权路径都可以通过注入来触发;权限上限等于应用连接数据库账号的权限。
边界
- 取决于应用账号权限;应用账号权限越低,可利用空间越小。
二、配套链(安全加固配置片段)
-- 1.关闭三大高危组件
EXEC sp_configure 'show advanced options',1;RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures',0;RECONFIGURE;
EXEC sp_configure 'clr enabled',0;RECONFIGURE;
GO
-- 2.严格控制服务器角色,检查sysadmin成员
SELECT p.name FROM sys.server_role_members rm
JOIN sys.server_principals p ON rm.member_principal_id=p.principal_id
JOIN sys.server_principals r ON rm.role_principal_id=r.principal_id
WHERE r.name='sysadmin';
--3.检查sa账号状态
SELECT name,is_disabled FROM sys.sql_logins WHERE name='sa';
--4.检查链接服务器
SELECT name,product,provider FROM sys.servers WHERE is_local=0;
--5.检查Agent代理账号(msdb库)
USE msdb;
SELECT proxy_name,credential_id FROM dbo.sysproxies;
GO
三、边界总结(关键风险点)
- 数据库权限 ≠ 操作系统权限:sysadmin 本身只是 SQL 权限,必须依靠
xp_cmdshell/OLE‑Automation/SQL‑CLR/Agent作业才能落地操作系统权限。 - 隐蔽性排序:
xp_cmdshell(有4688日志)< Agent 作业 < Linked Server < OLE‑Automation < SQL‑CLR(无进程创建日志,最难检测)。 - 加固误区:仅删除扩展存储过程元数据,不关闭开关;DLL 文件还在磁盘,sysadmin 可快速恢复。
- Agent 代理账号风险:权限是代理 Windows 账号,与 SQL 服务账号相互独立,容易被忽略。
- db_owner 不等于 sysadmin,只有存在错误配置时才可以向上提权。
四、自动化流水线 PowerShell(SQL Server 提面风险点批量巡检)
巡检项:sysadmin 成员、sa 状态、xp_cmdshell/OLE‑Automation/CLR 开关、用户 CLR 程序集、链接服务器、Agent 代理账号,输出 CSV 报告。
<#
SQL Server提权风险批量巡检流水线
依赖:Install‑Module SqlServer
#>
$targetInstances = @("SQL01","SQL02\INST2")
$outCsv = ".\sql_privesc_audit_$(Get‑Date -Format yyyyMMdd_HHmmss).csv"
$report = @()
foreach($inst in $targetInstances){
$row = [PSCustomObject]@{
InstanceName = $inst
SysadminMembers = $null
Sa_IsDisabled = $null
Sa_PasswordPolicyEnforced = $null
XpCmdshellEnabled = $null
OleAutomationEnabled = $null
ClrEnabled = $null
ClrStrictSecurity = $null
UnsafeClrAssemblies = $null
LinkedServerCount = 0
AgentProxyCount = 0
ErrorMsg = $null
}
try{
#1 sysadmin成员
$qSysAdmin=@"
SELECT p.name FROM sys.server_role_members rm
JOIN sys.server_principals p ON rm.member_principal_id=p.principal_id
JOIN sys.server_principals r ON rm.role_principal_id=r.principal_id
WHERE r.name='sysadmin'
"@
$saRet = Invoke‑SqlCmd -ServerInstance $inst -Query $qSysAdmin
$row.SysadminMembers = ($saRet.name)‑join ";"
#2 sa账号
$qSa="SELECT name,is_disabled,is_policy_checked FROM sys.sql_logins WHERE name='sa'"
$saLoginRet = Invoke‑SqlCmd -ServerInstance $inst -Query $qSa
$row.Sa_IsDisabled = $saLoginRet.is_disabled
$row.Sa_PasswordPolicyEnforced = $saLoginRet.is_policy_checked
#3 高危组件开关
$qCfg=@"
SELECT name,config_value FROM sys.configurations
WHERE name IN ('xp_cmdshell','Ole Automation Procedures','clr enabled','clr strict security')
"@
$cfgRet = Invoke‑SqlCmd -ServerInstance $inst -Query $qCfg
foreach($c in $cfgRet){
switch($c.name){
'xp_cmdshell' {$row.XpCmdshellEnabled = $c.config_value}
'Ole Automation Procedures' {$row.OleAutomationEnabled = $c.config_value}
'clr enabled' {$row.ClrEnabled = $c.config_value}
'clr strict security' {$row.ClrStrictSecurity = $c.config_value}
}
}
#4 UNSAFE CLR程序集
$qAsm="SELECT name FROM sys.assemblies WHERE is_user_defined=1 AND permission_set_desc='UNSAFE_ACCESS'"
$asmRet = Invoke‑SqlCmd -ServerInstance $inst -Query $qAsm
$row.UnsafeClrAssemblies = ($asmRet.name)‑join ";"
#5 链接服务器
$qLs="SELECT COUNT(1) cnt FROM sys.servers WHERE is_local=0"
$lsRet = Invoke‑SqlCmd -ServerInstance $inst -Query $qLs
$row.LinkedServerCount = $lsRet.cnt
#6 Agent代理账号(msdb)
$qAgentProxy=@"
USE msdb;
SELECT COUNT(1) cnt FROM dbo.sysproxies
"@
$proxyRet = Invoke‑SqlCmd -ServerInstance $inst -Query $qAgentProxy
$row.AgentProxyCount = $proxyRet.cnt
}
catch{
$row.ErrorMsg = $_.Exception.Message
}
$report += $row
}
$report | Export‑Csv -Path $outCsv -Encoding UTF8 -NoTypeInformation
Write‑Host "✅ SQL提权风险巡检报告输出:$outCsv"
SQL Server 提权方法 的汇总,包括不同的提权方式、描述和可能的应用场景:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| sysadmin 权限 | 通过赋予用户 sysadmin 角色,可以让该用户拥有完全的数据库管理权限,包括访问和修改所有数据库对象。 | 适用于需要完全控制 SQL Server 实例的情况。通过 ALTER SERVER ROLE 命令授予用户该角色。 |
| SQL Server 代理提权 | 利用 SQL Server 代理(SQL Agent)执行外部命令。SQL Server 代理拥有操作系统级别的权限,可能会执行系统级别的命令。 | 通过 SQL Server Agent 执行的任务可以运行操作系统命令,如 xp_cmdshell。需要 DBA 权限启用此功能。 |
| xp_cmdshell 提权 | xp_cmdshell 扩展存储过程允许 SQL Server 执行操作系统命令,具有很高的权限。 |
通过 xp_cmdshell 执行命令时,SQL Server 使用执行该命令的 Windows 用户权限。可用来访问操作系统资源。 |
| SQLCLR 提权 | SQLCLR(SQL Common Language Runtime)允许使用 .NET 代码执行操作系统命令。如果系统允许 Unsafe Assembly 的加载,可以使用 SQLCLR 执行任意代码。 | 当数据库启用了 SQLCLR 功能并且允许加载不安全的程序集时,可以通过 CREATE ASSEMBLY 加载恶意代码。 |
| 服务账户提权 | SQL Server 在运行时使用的 Windows 服务账户可能具有高权限。通过 SQL Server 中的功能,攻击者可能获取该服务账户的权限。 | 攻击者可能通过查看服务账户的权限,或在 SQL Server 配置中提升权限,来获得更高的系统权限。 |
| 权限提升漏洞 | 某些配置错误(如高权限账户的默认配置或遗漏)可能使得低权限用户能够提升权限。 | SQL Server 中的配置错误或系统漏洞,如 xp_regread 权限配置不当,可能导致非管理员账户提权。 |
| 代理账户提权 | SQL Server 代理账户通常拥有执行系统命令的权限。如果攻击者能够在代理账户下执行代码,可能获得系统级权限。 | 通过 SQL Server Agent 执行任务时,攻击者可以利用代理账户的权限执行更高权限的操作。 |
| Linked Server 提权 | 通过建立与其他 SQL Server 实例的 Linked Server,攻击者可以利用权限漏洞进行跨服务器提权。 | 通过配置不安全的 Linked Server 连接,攻击者可能访问其他 SQL Server 实例,或利用该连接执行恶意命令。 |
| 缺陷应用程序提权 | 某些数据库应用程序在执行特定操作时存在安全缺陷,这些缺陷可能使攻击者通过 SQL 注入、权限绕过等方式提升其权限。 | 例如,通过应用程序的 SQL 注入漏洞获取管理员权限。 |
| 权限绕过 | 利用 SQL Server 中的 权限绕过 技术,攻击者可以从较低权限的用户提权到 sysadmin 或其他高级权限。 | SQL Server 的安全配置错误或权限管理漏洞允许攻击者绕过访问控制机制。 |
| 数据库角色提权 | 将数据库角色(如 db_owner、db_securityadmin)分配给低权限用户,使其拥有高级别权限。 | 攻击者通过向自己分配数据库角色来获取管理员权限,通常是通过操作系统权限或应用漏洞来实现。 |
| SA账户弱密码提权 | 如果 SQL Server 实例的 sa(系统管理员)账户密码较弱或未启用,攻击者可以通过暴力破解或其他方法获得该账户的控制权限。 | 通过暴力破解或字典攻击获取 sa 账户的密码,从而获得对 SQL Server 实例的完全控制权限。 |
| SQL Server 配置错误提权 | SQL Server 的配置错误(如过度权限、没有启用的加密功能、未更新的安全补丁)可能导致攻击者获得不应该拥有的权限。 | 例如,通过错误配置的端口、未关闭的功能(如 xp_cmdshell 或 OLE Automation)获取系统权限。 |
详细说明:
-
sysadmin 权限:这是 SQL Server 中权限最高的角色,赋予该角色的用户可以执行任何操作,包括数据库管理、服务器管理等。
-
SQLCLR 提权:在 SQL Server 中,允许用户执行 .NET 代码的功能(如 SQLCLR)可以被用来执行系统命令或访问外部资源,如果不进行适当的安全配置,攻击者可以利用这一功能。
-
服务账户与代理账户提权:SQL Server 的服务账户或 SQL Server Agent 代理账户通常具有系统权限。如果这些账户被不当配置或泄露,攻击者可以利用这些账户来提升自己的权限。
-
漏洞利用: SQL Server 中的配置错误或漏洞,如弱密码、默认账户等,可能成为攻击者用来获得更高权限的跳板。
安全建议:
- 禁用不必要的功能:如 xp_cmdshell、SQLCLR 等功能,如果不需要应禁用。
- 最小权限原则:避免将 sysadmin 权限授予不必要的用户,确保数据库和操作系统的安全性。
- 及时更新和打补丁:确保 SQL Server 和操作系统及时更新,修补已知的安全漏洞。
- 强化账户安全:使用强密码并定期更新,避免使用默认账户,特别是 sa。
一、权限继承提权(对象继承提权)
1. 底层原理
2. 依赖文件
3. 依赖关系
-
依赖 SQL 默认权限继承机制(无法关闭)
-
依赖管理员错误授予数据库/架构宽泛权限
-
依赖低权限用户拥有对象访问入口
4. 逻辑链路
5. 配套链
6. 边界(风险坑点)
-
属于配置缺陷提权,无漏洞、无组件,极难被设备检测
-
大量企业存在“架构全通配授权”高危配置
-
仅能横向扩权,无法直接落地系统权限,多用于前置铺垫
2. 依赖文件
3. 依赖关系
-
SQL 混合认证模式开启
-
高权限账号口令强度不足
-
应用明文/密文可破解口令泄露
4. 逻辑链路
5. 配套链
6. 边界
-
Windows 认证模式可规避该风险
-
开启密码策略可极大降低风险
三、数据库备份文件提权(备份劫持/泄露提权)
1. 底层原理
2. 依赖文件
3. 依赖关系
-
备份目录权限开放、未隔离
-
运维未加密备份文件
-
攻击者可读取/写入备份路径
4. 逻辑链路
5. 配套链
6. 边界
-
备份加密可完全阻断该提权
-
备份写入劫持仅 sysadmin 可利用
四、跨数据库提权(Cross-DB 跨库权限穿透)
1. 底层原理
2. 依赖文件
3. 依赖关系
-
未开启严格权限隔离
-
数据库存在 TRUSTWORTHY 信任配置
-
低用户拥有当前库较高权限
4. 逻辑链路
5. 配套链
6. 边界
五、内存凭证提权(内存密钥/连接字符串泄露)
1. 底层原理
2. 依赖文件
3. 依赖关系
-
未启用严格密钥保护
-
调试权限未封禁
-
系统存储过程允许低权限读取内存信息
4. 逻辑链路
5. 边界
六、SQL Server 配置文件篡改提权
1. 底层原理
2. 依赖文件
3. 依赖关系
-
服务器本地权限过低,可篡改配置文件
-
SQL 服务可重启
4. 逻辑链路
5. 边界
七、DBCC 内存执行/隐藏追踪提权
1. 底层原理
2. 依赖文件
3. 依赖关系
4. 逻辑链路
5. 边界
八、未修补漏洞提权(CVE 原生提权)
1. 底层原理
2. 依赖文件
3. 依赖关系
4. 逻辑链路
九、恶意存储过程提权
1. 底层原理
2. 依赖文件
3. 逻辑链路
十、代理任务漏洞提权(SQL Agent 任务缺陷)
1. 底层原理
2. 依赖文件
3. 逻辑链路
十一、数据库引擎漏洞提权
十二、认证绕过提权
底层原理
十三、链式提权(Chaining 多级组合提权)
底层原理
十四、带外提权(OOB 外带通道提权)
底层原理
十五、统一自动化巡检流水线(新增全量检测项)
-
检测宽泛架构/数据库权限继承风险
-
检测弱口令、未启用密码策略账号
-
检测备份目录权限、未加密备份文件
-
检测跨库访问权限、TRUSTWORTHY 开启数据库
-
检测 DBCC 高危调试操作审计
-
检测恶意存储过程、低权限创建存储过程权限
-
检测 Agent 公共可篡改作业、危险代理账号
-
检测混合认证模式、认证绕过风险配置
十六、终极安全加固建议(补全你提供的规范)
-
最小攻击面收敛:强制关闭 xp_cmdshell、OLE、CLR、未使用扩展存储过程;禁用不必要服务与远程链接。
-
强制 Windows 认证:关闭混合模式,杜绝口令爆破、认证绕过风险。
-
全量敏感加密:备份加密、密钥加密、连接字符串加密、配置文件加密。
-
全链路审计:XEvent 审计高危组件、DBCC、角色变更、作业变更、备份操作、跨库查询。
-
应用层防注入:参数化查询、WAF 规则、权限分离,杜绝注入起点。
-
持续安全巡检:自动化流水线周期性扫描所有提权风险项,闭环整改。
-
补丁常态化更新:修复引擎层、认证层、代理服务所有高危漏洞。
-
权限严格隔离:杜绝宽泛架构授权、杜绝跨库信任、杜绝低权限创建对象。
继续补充更多的 SQL Server 提权方式及相关细节:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| 权限继承提权 | SQL Server 中的一些对象(如表、存储过程)可以继承父对象的权限。如果父对象具有较高权限,攻击者可能通过继承方式提升自己的权限。 | 当数据库的某些对象或角色权限配置不当时,攻击者可以继承高权限父对象的权限。 |
| 弱密码和口令泄露 | 使用弱密码或密码管理不当(例如密码硬编码在应用程序中)可能导致攻击者通过猜测或暴力破解获得高权限账户的访问。 | 攻击者通过暴力破解、字典攻击、或者通过外部途径(例如应用程序源代码泄露)获得数据库管理员的密码。 |
| 数据库备份文件提权 | 如果备份文件存储位置没有适当的权限保护,攻击者可以通过窃取、修改或利用备份文件恢复数据库并获取敏感信息。 | 当备份文件存储在未经保护的目录时,攻击者可以通过访问备份文件获得数据库的完整内容,包括敏感数据和管理员账户。 |
| 跨数据库提权(Cross DB) | SQL Server 允许不同数据库之间通过 Linked Server 连接进行交互。如果攻击者能够利用这种连接,可能通过高权限数据库进行跨数据库攻击。 | 通过跨数据库的操作,可以执行本应受到限制的查询,访问其他数据库,或者在其他数据库中执行恶意代码。 |
| 内存中的凭证提权 | 攻击者通过 SQL Server 访问内存中的凭证(如加密密钥、连接字符串等),可能能够获取数据库服务器的身份验证信息,从而绕过身份验证。 | 当 SQL Server 存储凭证信息或加密密钥未加密或保护不当时,攻击者可以提取这些信息进行权限提升。 |
| SQL Server 配置文件篡改 | 修改 SQL Server 配置文件或重载配置项,攻击者可以影响 SQL Server 启动时的行为,进而提升其权限。 | 修改 SQL Server 配置文件(如 sqlservr.exe 配置)可能导致 SQL Server 启动时加载恶意模块或权限更高的账户。 |
| 内存中执行代码提权 | 使用 DBCC TRACEON 等 SQL Server 内存操作命令,攻击者可以启用 SQL Server 的隐藏功能,进而执行特定操作,绕过标准的权限控制机制。 | 利用 SQL Server 内存配置选项,启用低级别调试功能或未公开的 API,可能突破权限控制,执行未经授权的命令。 |
| 未修补漏洞提权 | SQL Server 的未修补漏洞(如特定版本中的远程代码执行漏洞或提权漏洞)可以让攻击者通过漏洞利用获取更高权限。 | 漏洞利用可能包括通过网络或本地权限提升攻击,利用未修补的漏洞直接获得系统级权限。 |
| 恶意存储过程提权 | 恶意存储过程可以通过 SQL Server 中的权限漏洞来提升权限,尤其是当这些存储过程执行操作系统命令或其他危险操作时。 | 如果 SQL Server 存储过程中存在权限提升的漏洞,攻击者可以通过创建恶意存储过程或修改现有过程来提升权限。 |
| 代理任务漏洞提权 | SQL Server 代理的任务配置可能允许某些高权限任务执行,攻击者可以通过注入恶意代码或配置任务来利用这些高权限任务。 | 攻击者通过 SQL Server 代理配置任务来利用系统级权限,通常这类任务能够执行操作系统命令或访问敏感资源。 |
| 数据库引擎漏洞提权 | SQL Server 引擎本身可能存在漏洞(例如某些特定版本的 SQL Server 存在的缺陷),攻击者可以利用这些漏洞进行权限提升。 | 使用针对特定版本或配置的 SQL Server 引擎漏洞进行提权,能够绕过正常的权限控制机制。 |
| SQL Server 认证绕过 | 如果 SQL Server 的身份验证配置不当(例如启用了 SQL Server 身份验证而禁用了 Windows 身份验证),攻击者可以绕过身份验证过程并获取高权限。 | 攻击者通过 SQL Server 身份验证或凭证管理不当,能够直接使用低权限账户绕过身份验证并提权。 |
| 数据库链提权(Chaining) | 利用多个 SQL Server 中的权限漏洞进行链式攻击,通过一个低权限账户的操作,逐步提升到更高的权限。 | 通过多个阶段的攻击(如 SQL 注入、权限提升等),最终通过链式攻击获得 sysadmin 或其他高权限角色。 |
| 带外提权 | 通过带外访问(如 SQL Server 被配置为允许远程连接)或其他带外渠道,攻击者可以在不通过正常身份验证的情况下访问 SQL Server,并尝试获取系统权限。 | 攻击者利用 SQL Server 配置允许的远程访问方式或其他带外访问技术进行提权。 |
额外的安全建议:
-
最小化攻击面:禁用不必要的 SQL Server 功能(如 SQLCLR、xp_cmdshell 等),并限制对外部连接的访问。
-
强制使用 Windows 身份验证:避免使用 SQL Server 身份验证,推荐强制使用 Windows 身份验证,并确保操作系统和 SQL Server 的账号管理得当。
-
加密敏感信息:加密数据库连接字符串、敏感数据、配置文件等,避免通过内存访问或文件泄露获取敏感信息。
-
增强日志审计:启用 SQL Server 审计功能,监控所有异常行为和可能的安全漏洞,包括高权限账户的操作和异常查询。
-
应用程序安全性:确保 SQL 注入防护得当,不让恶意用户通过漏洞提权,定期检查应用程序代码中的安全隐患。
-
定期安全测试:定期进行渗透测试和漏洞扫描,及时发现和修复 SQL Server 安全漏洞。
SQL Server 提权的方式有很多,攻击者往往通过多种方式结合,利用配置错误、漏洞、权限管理不当等进行提权。为了提高 SQL Server 的安全性,管理员应遵循安全最佳实践,定期检查和加固权限设置,并及时应用安全补丁。
1. SQL Server 配置文件修改提权
底层原理
依赖文件
依赖关系
逻辑链路
配套链
边界约束(坑点)
自动化流水线巡检项
2. 高权限系统视图/DMV 信息泄露辅助提权
底层原理
依赖文件
边界约束
自动化流水线巡检项
3. 触发器漏洞/恶意触发器提权
底层原理
依赖文件
依赖关系
逻辑链路
配套链
边界约束
自动化流水线巡检项
4. 应用程序漏洞链式提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
自动化流水线巡检项
5. SQL Server 账户劫持提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
自动化流水线巡检项
6. SQLCLR 程序集注入提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
自动化流水线巡检项
7. 扩展存储过程滥用提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
自动化流水线巡检项
8. 目录遍历文件读取提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
自动化流水线巡检项
9. 代理身份冒用提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
自动化流水线巡检项
10. 动态管理视图DMV漏洞提权
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
11. 数据库审计漏洞绕过提权
底层原理
依赖关系
逻辑链路
边界约束
12. 权限继承漏洞提权
底层原理
依赖关系
逻辑链路
13. 服务账户滥用提权
底层原理
依赖关系
逻辑链路
14. 连接池滥用提权(ADO.NET 连接池劫持)
底层原理
依赖文件
依赖关系
逻辑链路
边界约束
15. 低权限组合漏洞提权
底层原理
逻辑链路
统一安全防护体系(最终完整版)
-
严格最小权限原则:杜绝宽泛架构/数据库授权,账号权限按需分配,禁用多余高权限角色。
-
全量审计启用:开启SQL审计+XEvent高危行为监控,覆盖组件开启、权限变更、作业修改、触发器新增、程序集导入。
-
持续补丁更新:定期修复SQL引擎、DMV、认证层所有高危漏洞,杜绝nday提权。
-
高危组件全面封禁:无业务需求永久关闭xp_cmdshell、OLE、CLR、自定义扩展存储过程。
-
备份隔离加密:备份文件独立存储、加密保护、收紧访问权限,杜绝备份泄露与劫持提权。
-
收敛网络攻击面:限制SQL外网暴露、封禁多余端口、限制非信任IP访问。
-
服务账号权限收敛:SQL/Agent服务账号严格降权,禁止本地管理员权限。
-
应用层防注入:参数化查询、WAF防护、应用账号最小权限隔离。
-
配置文件完整性防护:监控SQL配置文件哈希变更,禁止未授权修改。
-
会话与连接池安全管控:收紧连接池策略、会话超时、身份强校验,防止连接劫持。
继续补充 SQL Server 提权方式及相关细节:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| SQL Server 配置文件修改 | 攻击者通过修改 SQL Server 配置文件(如 sqlservr.ini)可以影响 SQL Server 的行为,可能导致权限提升,或者触发已知漏洞的利用。 | 修改 SQL Server 配置文件可能影响数据库服务的启动参数或权限设置,导致漏洞的暴露或不当权限分配。 |
| 利用 SQL Server 高权限视图 | SQL Server 中可能有一些隐蔽的高权限视图,攻击者通过查询这些视图可以获得系统级的信息,包括数据库和操作系统的敏感数据。 | 使用高权限视图如 sys.dm_exec_sessions, sys.dm_exec_requests 等,攻击者可以读取与系统运行有关的敏感信息。 |
| 触发器漏洞提权 | 在某些情况下,攻击者可能会利用 SQL Server 中的触发器功能,通过注入恶意代码在数据库操作时执行特定的提权操作(例如修改表、执行系统命令)。 | 利用触发器中的漏洞或恶意触发器设计,攻击者可以在数据更改时执行特权操作,达到权限提升的效果。 |
| 应用程序漏洞提权 | 如果应用程序层存在漏洞(例如 SQL 注入、权限管理错误),攻击者可以利用应用程序对 SQL Server 的访问来获得更高权限。 | 攻击者通过漏洞攻击应用程序(如注入恶意 SQL 语句),可以绕过应用程序的权限控制,从而获得数据库管理员权限。 |
| SQL Server 账户劫持 | 如果 SQL Server 账户管理不当(例如共享账户、默认账户或未更改的默认密码),攻击者可以通过劫持这些账户获得更高权限。 | 利用弱口令或默认账户(如 sa)进行劫持,通过暴力破解或暴力攻击方法获取管理员账户,从而提升权限。 |
| SQL Server 程序集注入 | 在启用 CLR(公共语言运行库)时,攻击者可以通过注入恶意程序集(如自定义代码)到 SQL Server 中执行高权限操作。 | 通过 SQLCLR 功能,攻击者可以上传恶意代码并利用它来执行系统命令、读取文件或修改数据库。 |
| 扩展存储过程滥用 | SQL Server 允许创建扩展存储过程,这些存储过程具有执行系统命令的权限。如果攻击者能创建或篡改这些存储过程,则可以直接访问操作系统资源,进而提升权限。 | 恶意扩展存储过程可以执行操作系统命令,攻击者通过这种方式绕过 SQL Server 的权限控制,访问操作系统资源。 |
| 目录遍历攻击 | SQL Server 的一些 API 允许访问文件系统,攻击者可能通过利用文件路径泄漏漏洞进行目录遍历,访问服务器上的敏感文件,如数据库备份或系统配置文件。 | 利用文件路径泄漏或不当文件访问配置,攻击者可能通过目录遍历访问敏感文件,从而获得敏感信息或提权。 |
| 利用代理身份 | SQL Server 代理在执行任务时可能会以指定的高权限身份运行,攻击者可以通过篡改代理任务配置,借此身份执行任意命令,提升自己的权限。 | 如果代理任务的配置不当,攻击者可以控制任务的执行过程,从而利用高权限的代理身份进行提权操作。 |
| 动态管理视图漏洞提权 | SQL Server 的一些动态管理视图(如 sys.dm_exec_requests)可能暴露正在执行的 SQL 查询或会话信息,攻击者可能通过这些视图获取系统内的敏感信息来提升权限。 | 攻击者可以通过对动态管理视图的查询,收集有用的系统信息或漏洞细节,从而突破权限限制,获取管理员权限。 |
| 利用数据库审计漏洞 | 如果数据库审计功能未配置或配置不当,攻击者可以绕过审计日志,进行不受监控的操作,可能导致权限提升或数据泄露。 | 在数据库审计不完善的环境中,攻击者可以通过绕过审计机制实施恶意操作,不会被记录和追踪,进而进行权限提升。 |
| 利用权限继承漏洞 | 在复杂的权限结构中,某些对象可能会继承不正确的权限设置,攻击者可能利用这些继承权限执行不应允许的操作,从而达到权限提升。 | 当数据库权限继承配置错误时,攻击者可以通过访问较低权限对象,间接获取较高权限对象的访问权限。 |
| 服务账户滥用 | SQL Server 使用的服务账户可能具有更高的操作系统权限,攻击者如果能够控制 SQL Server 服务账户(例如通过提权漏洞、应用配置错误等),可以进一步提升权限。 | 如果服务账户权限过大,攻击者可能通过对服务账户的控制,获得操作系统级别的访问权限,从而实现提权。 |
| SQL Server 连接池滥用 | 某些情况下,攻击者可能通过连接池功能(如 ADO.NET)连接到 SQL Server,通过池中的连接对象,伪装成高权限用户进行数据库操作。 | 如果 SQL Server 配置不当,攻击者可能通过连接池滥用技术,获得高权限用户的连接实例,进行未经授权的操作。 |
| 利用低权限漏洞提权 | 即使攻击者处于较低权限的账户,若能识别和利用系统中的漏洞(如对象泄漏、错误配置等),也可以逐步提升权限。 | 攻击者在最低权限下可能通过漏洞分析和组合攻击步骤,最终实现权限提升,例如利用 SQL 注入漏洞、权限漏斗等技术。 |
更多的安全防护措施:
-
强制最小权限原则:每个用户和应用程序只能分配执行任务所需的最低权限,避免授予过多的权限,减少潜在攻击者滥用权限的机会。
-
启用并管理 SQL Server 审计:启用详细的审计日志,确保所有的权限变更、关键操作和异常行为被记录和审查,及时发现潜在的恶意活动。
-
定期更新 SQL Server:保持 SQL Server 和操作系统的最新补丁和更新,避免被已知漏洞攻击。特别注意高危补丁的及时应用。
-
限制扩展存储过程和 SQLCLR 功能:如果没有明确需要,最好禁用扩展存储过程和 SQLCLR 功能,以减少利用这些功能进行提权的风险。
-
隔离和加密备份:数据库备份文件应存储在受保护的服务器上,并加密存储,确保备份文件不容易被窃取或篡改。
-
最小化外部连接和网络访问:限制 SQL Server 的网络暴露,关闭不必要的端口和服务,避免来自不受信任网络的访问。
SQL Server 提权方式的复杂性和多样性要求数据库管理员和安全团队保持高度警觉,通过多层次的安全措施来减少攻击面。定期的漏洞扫描、权限审查和数据库安全加固是防止提权攻击的关键。
继续补充 SQL Server 提权方式及相关细节:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| 操作系统级别的命令执行 | 在某些配置下,SQL Server 可以执行操作系统命令。攻击者可以通过特定的 SQL 注入或扩展存储过程利用这个功能执行系统级命令,从而实现权限提升。 | 攻击者可能通过执行操作系统命令,利用操作系统漏洞或系统配置错误,进一步突破 SQL Server 限制,获取更高的权限。 |
| 密码喷射攻击 | 通过尝试不同的用户凭证,攻击者可能会尝试使用弱密码或默认密码来获取更高权限的账户(如 sa)。这一攻击方法与暴力破解类似,但通过多次尝试常见的密码组合进行。 |
攻击者可能通过对 SQL Server 默认账户进行暴力破解,猜测密码,获得管理员权限。 |
| 远程代码执行漏洞 | SQL Server 存在的某些漏洞可能允许攻击者远程执行任意代码,这通常是由于配置不当、缺乏适当的输入验证或已知漏洞引起的。远程代码执行攻击可以直接在服务器上执行恶意操作。 | 通过已知的漏洞或不当配置,攻击者可以远程控制 SQL Server,执行恶意代码或系统命令,甚至提权获得操作系统权限。 |
| SQL Server 配置错误 | 在配置 SQL Server 时,某些安全选项可能被忽视或配置错误。例如,如果 SQL Server 允许 Windows 身份验证且未正确限制,攻击者可以利用域帐户权限进行攻击。 | 错误配置导致的权限提升可能通过过度授权、错误配置的身份验证方式、开放的网络连接等因素来实现。 |
| 不安全的默认数据库设置 | SQL Server 安装后默认数据库设置(如允许的用户、预设的表空间等)可能存在安全隐患。攻击者可以通过利用这些默认设置来提升权限。 | 如果在部署 SQL Server 时没有修改默认数据库设置,攻击者可能通过访问默认的数据库或系统表来获取更高的权限。 |
| 跨数据库权限提升 | 如果攻击者能够访问多个数据库,并且其中一些数据库设置了过宽的权限,他们可能能够通过跨数据库的查询或操作来提升权限。 | 通过跨数据库的查询,攻击者可能访问到更高权限的数据库,并使用这些权限进行提权或执行恶意操作。 |
| SQL Server 服务配置漏洞 | 如果 SQL Server 服务以高权限账户运行(如管理员账户或 SYSTEM 账户),攻击者可能会通过控制 SQL Server 服务的配置文件或设置来获得系统级权限。 | 如果 SQL Server 服务配置错误(例如使用了过高的权限帐户),攻击者可能直接访问操作系统或执行高权限操作。 |
| 动态链接库(DLL)注入 | SQL Server 可能允许加载自定义的动态链接库文件(DLL),攻击者如果能够上传恶意的 DLL 文件并加载,可以借此在 SQL Server 中执行任意代码来提升权限。 | 通过上传和注入恶意 DLL 文件,攻击者能够在 SQL Server 中执行系统命令,操控服务或获取操作系统权限。 |
| 数据库触发器滥用 | SQL Server 触发器本质上是一种自动执行的 SQL 语句,攻击者如果能够创建或修改触发器,就可能在数据库操作时执行恶意代码,实现权限提升。 | 攻击者通过精心设计恶意触发器,在数据插入、更新或删除时触发并执行有害操作,从而提升其数据库权限。 |
| SQL Server Agent 任务 | SQL Server Agent 是一个用于调度和执行任务的服务。攻击者如果能够在 SQL Server Agent 中创建或修改任务,则可以借此执行有权限的 SQL 语句,甚至调用外部系统命令。 | 攻击者可以创建或修改 SQL Server Agent 任务,借用代理的高权限执行恶意操作或提权。 |
| 操作系统漏洞滥用 | 如果攻击者已经获得了 SQL Server 的访问权限,操作系统本身的漏洞(如权限配置、补丁未打等)也可能被利用来进一步提升攻击者的权限。 | 即使攻击者仅有数据库访问权限,操作系统本身的漏洞(如未打补丁的服务、过高权限的进程等)仍可被利用来实现权限提升。 |
| 数据库视图篡改 | 攻击者可以通过创建或篡改现有的数据库视图,将其权限提升操作隐藏在视图中,使用不被审计的 SQL 执行非法命令。 | 攻击者通过操控数据库视图来执行高权限的操作,利用视图隐藏实际行为,绕过审计或日志记录。 |
| SQL 注入与权限扩展 | SQL 注入漏洞仍是许多攻击者用来绕过权限控制的常见方式。如果 SQL 注入漏洞存在且攻击者能够在数据库中执行系统命令,便可以在数据库内扩展权限,获取管理员权限。 | 攻击者通过 SQL 注入漏洞,不仅可以执行恶意查询,还能执行操作系统命令,获取系统权限或扩展数据库权限。 |
| SQL Server 审计绕过 | 如果 SQL Server 的审计机制存在漏洞或配置不当,攻击者可能绕过审计日志,进行恶意操作而不被检测到,最终实现权限提升。 | 通过绕过 SQL Server 审计日志,攻击者能够隐藏其恶意行为,避免被安全团队察觉,从而继续进行权限提升操作。 |
| 内存中的权限提升 | 利用内存中 SQL Server 进程的漏洞或不当配置,攻击者可以执行特殊的内存攻击,绕过权限检查,获得更高权限。 | 通过对 SQL Server 进程内存进行分析和操作,攻击者可能利用内存中的弱点来提升自己的权限。 |
| SQL Server 环境变量滥用 | SQL Server 的环境变量可能被攻击者利用,尤其是在执行存储过程或命令时,环境变量可能包含敏感信息或操作系统路径。攻击者可修改这些环境变量来扩展其权限。 | 攻击者可能篡改 SQL Server 的环境变量,改变路径或配置,从而让攻击者的代码或命令得以执行。 |
补充的防护措施:
-
最小化 SQL Server 服务账户权限:确保 SQL Server 服务账户仅具备执行数据库所需的最小权限,不应使用具有管理员权限的账户运行 SQL Server。
-
加强密码管理:为 SQL Server 的管理员账户设置强密码,并定期更新密码。禁止使用默认密码或弱密码,防止暴力破解攻击。
-
限制外部访问:如果不需要远程连接,建议将 SQL Server 配置为仅允许本地连接,或者通过 VPN 或其他安全通道访问。
-
启用加密和传输保护:使用 SQL Server 提供的加密功能(如 TDE),确保数据库中的敏感数据加密存储。同时,启用 SSL/TLS 以加密数据传输,防止中间人攻击。
-
定期审计和监控:定期审计数据库的访问日志,监控异常行为,及时检测未授权的权限提升或攻击行为。利用 SIEM(安全信息和事件管理)工具提高检测效率。
-
加固操作系统:不仅仅是 SQL Server 本身,操作系统也应进行加固,关闭不必要的服务和端口,定期打补丁,减少可供攻击的漏洞。
-
部署 Web 应用防火墙:如果 SQL Server 后端被 Web 应用访问,考虑部署 Web 应用防火墙(WAF)来防止 SQL 注入等网络攻击。
SQL Server 提权是攻击者绕过数据库安全限制并获得更高权限的常见手段。通过充分理解 SQL Server 的安全架构和攻击途径,可以更好地防范提权攻击。在日常运维过程中,加强 SQL Server 配置的安全性、定期审查权限设置和使用综合的安全策略,能够显著降低被攻击的风险。
继续补充 SQL Server 提权方式及防护措施:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| 使用链接服务器攻击 | SQL Server 允许通过链接服务器连接到其他数据库实例或外部资源。攻击者可能通过滥用链接服务器的权限,访问或操作其他系统,进一步提升权限。 | 攻击者通过操控链接服务器的权限,访问外部数据库或服务,进行权限提升或获取敏感信息。 |
| XPL0IT / xp_cmdshell 攻击 | SQL Server 提供了一些扩展存储过程(如 xp_cmdshell)来执行操作系统命令,如果配置不当,这些存储过程可能被攻击者滥用来执行恶意命令。 |
如果攻击者能够执行 xp_cmdshell,便可以通过 SQL Server 执行系统命令,进一步提升权限。 |
| 权限重定向 | 攻击者通过操控数据库中的视图、存储过程或触发器来重定向 SQL Server 的权限管理,进而控制不该访问的资源。 | 攻击者通过篡改视图、存储过程或触发器,重新定义权限结构,使得他们能执行非法操作,从而提升自身权限。 |
| SQL Server 备份还原漏洞 | 如果 SQL Server 未正确配置备份和还原权限,攻击者可能通过备份还原数据库来获取敏感数据,或者通过备份文件恢复一个更高权限的用户。 | 攻击者通过非法获取备份文件或利用备份还原功能,绕过权限限制并恢复数据库中的高权限账户。 |
| DTS 包滥用 | SQL Server 中的 Data Transformation Services(DTS)功能允许数据在服务器之间进行转换和移动。如果 DTS 配置不当,攻击者可以创建恶意的 DTS 包并利用它们提升权限。 | 攻击者通过滥用 DTS 功能,移动或修改数据,甚至通过执行恶意的 DTS 包进行权限提升。 |
| SQL Server 高权限脚本执行 | SQL Server 提供了 sp_configure 和其他配置存储过程,这些可以用于改变数据库和服务的配置。攻击者通过操控这些存储过程,能够改变数据库配置,获得更高权限。 |
攻击者通过执行高权限的存储过程,改变数据库的配置,直接获得数据库的管理员权限。 |
| 利用 SQL Server 内部函数 | SQL Server 提供了很多内置函数,攻击者可以通过滥用这些函数来查看系统信息、枚举用户权限,甚至操作数据库的内部设置,从而为提权做好准备。 | 攻击者利用内置函数(如 xp_logininfo、xp_enumgroups 等)来获取系统和用户信息,从而设计提权路径。 |
| ADO.NET 恶意请求 | 如果应用程序使用 ADO.NET 连接到 SQL Server 并且没有进行适当的输入验证,攻击者可能通过恶意的 SQL 注入代码来绕过身份验证,提升其权限。 | 攻击者通过滥用 ADO.NET 的 SQL 注入漏洞,绕过身份验证,获得更高的权限。 |
| 事件日志操控 | 攻击者通过访问 SQL Server 的事件日志或通过执行相关存储过程,清除或操控日志,掩盖自己的攻击轨迹,从而在数据库和操作系统之间进行未授权操作。 | 攻击者通过操控事件日志隐藏攻击行为,避免被安全团队发现,进而保持对系统的持续访问和权限提升。 |
| SQL Server 异常处理漏洞 | SQL Server 在处理异常时,某些配置或错误的处理机制可能泄露系统信息或提供攻击者绕过权限的机会。攻击者可能通过构造特定的错误请求,获得敏感信息来提权。 | 攻击者通过构造特定的错误请求,利用系统的异常处理机制,泄露敏感信息或执行未经授权的操作,从而提升权限。 |
| 内存溢出漏洞 | 如果 SQL Server 的内存管理存在漏洞(如堆栈溢出),攻击者可以通过发送特制的请求,操控 SQL Server 的内存,执行任意代码,从而获取更高权限。 | 攻击者通过内存溢出漏洞在 SQL Server 中注入恶意代码,执行高权限操作,甚至控制整个服务器。 |
| 身份验证绕过 | 如果 SQL Server 配置为使用混合身份验证(Windows 和 SQL Server 身份验证),且密码管理不当,攻击者可能通过猜解或破解 SQL Server 登录凭证绕过身份验证,获取管理员权限。 | 攻击者通过暴力破解、弱密码攻击等手段,绕过身份验证并获取管理员权限。 |
补充的防护措施:
-
禁用不必要的扩展存储过程:对于
xp_cmdshell等可以执行系统命令的扩展存储过程,应该禁用这些功能,除非确实需要它们。可以通过 SQL Server 的配置命令来关闭这些功能,例如sp_configure。 -
使用强密码策略:确保所有 SQL Server 登录账户都采用强密码策略,避免使用弱密码或默认密码。定期检查和更换密码,并实施强制密码复杂度要求。
-
限制数据库权限:只授予用户执行必要任务的权限。通过细化权限控制,最小化每个用户的访问范围,从而降低权限提升的风险。
-
强化 SQL Server 配置:加强 SQL Server 配置,确保没有开放不必要的端口,所有连接都通过加密进行传输,且仅允许经过认证的用户访问。避免 SQL Server 使用过高权限的账户运行。
-
定期更新和打补丁:确保 SQL Server 和操作系统都定期进行安全更新和打补丁,以修复已知的漏洞并防止攻击者利用这些漏洞进行提权。
-
利用 SQL Server 安全功能:启用 SQL Server 的内建安全功能(如加密、审计等),并严格限制执行权限。可以使用透明数据加密(TDE)、动态数据掩码等功能保护敏感数据。
-
防止 SQL 注入攻击:应用程序与 SQL Server 之间的交互应该采用参数化查询,而不是动态构建 SQL 查询字符串,以防止 SQL 注入漏洞的利用。
-
实施最小特权原则:为所有数据库用户和服务账户应用最小权限原则,确保每个账户只有完成其工作所需的权限,而没有过多的访问权限。
-
增强监控和日志分析:配置 SQL Server 审计功能,记录所有用户的访问活动,并监控异常行为。使用 SIEM 系统(如 Splunk、LogRhythm 等)进行日志分析,及早发现潜在的攻击行为。
-
应用多层安全措施:除了数据库层面的安全配置,还应实施网络级别的安全措施,如防火墙、入侵检测/防御系统(IDS/IPS)等,以确保 SQL Server 不会暴露在外部攻击者面前。
SQL Server 提权的手段多种多样,攻击者可以通过多种方式绕过权限控制并获得更高的访问权限。对 SQL Server 的防护不仅仅是关注数据库本身的安全性,还包括操作系统、安全配置、身份验证、日志管理等多个层面的综合安全策略。确保实施严格的安全配置、定期检查权限设置、采用强密码策略和加固 SQL Server 安全功能是防范 SQL Server 提权攻击的有效措施。
继续补充 SQL Server 提权方式及防护措施:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| 权限继承攻击 | 在某些情况下,SQL Server 中的权限继承可能导致权限提升。攻击者通过操控数据库对象的继承权限,能够间接获得高权限。 | 攻击者通过继承其他用户的权限来提升自己的权限。例如,攻击者在有权限的用户下创建对象,间接获得高权限。 |
| SQL Server 代理滥用 | SQL Server 代理服务(SQL Server Agent)通常用于自动化任务和调度。如果配置不当,攻击者可能通过修改或创建代理任务,执行恶意操作,进一步提升权限。 | 攻击者通过操控 SQL Server 代理服务,调度恶意任务,甚至在系统中执行任意代码来提升权限。 |
| 利用服务账户 | SQL Server 在运行时使用 Windows 服务账户。如果攻击者获得了对服务账户的控制权限,可能会用该账户的权限提升 SQL Server 的权限。 | 攻击者通过操控 SQL Server 运行的 Windows 服务账户来获取更高权限,尤其是如果服务账户具有管理员权限。 |
| 滥用动态管理视图 (DMV) | SQL Server 提供了许多动态管理视图(DMV),它们可以查询系统信息和配置。攻击者可以通过查询这些视图来获取数据库的结构和用户信息,从而设计攻击路径并提升权限。 | 攻击者通过查询动态管理视图,获取数据库架构、用户信息及配置,从而设计后续的提权策略。 |
| 跨数据库查询攻击 | SQL Server 允许进行跨数据库查询,攻击者可能滥用这种功能查询其他数据库的信息。通过跨数据库的访问,攻击者可以查看、篡改数据或利用数据泄露进行权限提升。 | 攻击者通过滥用跨数据库查询功能,访问其他数据库中的敏感信息,从而增加攻击的范围并获取更多权限。 |
| SQL Server 脚本执行漏洞 | 某些 SQL Server 环境中的脚本可能存在漏洞,攻击者可以通过构造特定的脚本来触发漏洞,从而执行系统级命令或获取未授权的数据库操作权限。 | 攻击者通过构造恶意脚本,利用 SQL Server 中的漏洞执行非法操作,进行权限提升。 |
| 通过存储过程滥用权限 | 存储过程在 SQL Server 中是一个常用的执行流程,如果存储过程具有较高的执行权限,攻击者可以滥用这些存储过程执行恶意操作。 | 攻击者通过操控具有高权限的存储过程,执行危险的系统操作或进行权限提升。 |
| SQL Server 安全漏洞 | SQL Server 中的某些已知安全漏洞如果没有及时打补丁,攻击者可能通过这些漏洞绕过认证、提权或执行恶意操作。常见的漏洞包括缓冲区溢出、权限绕过等。 | 攻击者利用 SQL Server 或操作系统的已知漏洞进行提权,直接控制服务器或数据库实例。 |
| 通过 SQL Server 扩展模块滥用 | SQL Server 提供了扩展模块的支持(例如 CLR 集成),如果配置不当,攻击者可以通过注入恶意代码,控制数据库的行为或执行非法操作,进而获取更高的权限。 | 攻击者通过滥用扩展模块功能,注入恶意 CLR 代码,操控数据库执行恶意操作,从而提升权限。 |
| 凭据重用攻击 | 攻击者通过获取 SQL Server 用户的凭据,可能会试图重用这些凭据访问其他系统或数据库实例,进一步提升权限。由于不同系统间的凭据重用,攻击者可能会突破多层防线。 | 攻击者利用数据库凭据重用,获取更多系统资源的访问权限,从而提升攻击范围。 |
| SQL Server 连接字符串滥用 | 攻击者可以通过捕获或篡改应用程序的数据库连接字符串,获得数据库的连接信息。利用这些信息,攻击者可以直接访问数据库,并通过不当的权限配置进行提权。 | 攻击者通过窃取或篡改应用程序的连接字符串,直接连接数据库并提权,利用连接中的敏感信息访问更高权限的资源。 |
| 表内字段漏洞 | SQL Server 中有些表或字段可能存储了敏感的权限或配置信息,攻击者可以通过查询这些表或字段,获取重要的系统信息或用户凭证,利用这些信息进一步提升权限。 | 攻击者通过直接查询特定表或字段,获取系统配置、密码或敏感信息,进而提升权限。 |
进一步加强的防护措施:
-
利用 SQL Server 角色和用户管理:
- 定期审查 SQL Server 中的角色和用户设置,确保只有经过授权的用户能够访问敏感信息。禁用不再使用的账户,特别是具有高权限的账户。
- 使用数据库角色而不是直接赋予用户权限,最小化权限暴露。
- 启用 Windows 身份验证而非 SQL Server 身份验证来进一步加强身份验证的安全性。
-
加强跨数据库访问控制:
- 禁止不必要的跨数据库查询,减少攻击者通过跨数据库攻击获得的权限。
- 配置严格的数据库访问控制策略,确保每个数据库只能由指定的用户或应用程序访问。
-
加强代理服务和自动化任务的配置:
- 定期审查和管理 SQL Server 代理服务,确保没有未授权的任务和脚本在系统上执行。
- 禁用不必要的 SQL Server Agent 作业,并为剩余的作业分配最小权限。
-
使用高级加密技术:
- 启用 SQL Server 加密功能(如 TDE,透明数据加密)来加密存储的数据。这样即使攻击者成功获得了访问权限,也无法轻易访问敏感数据。
- 配置数据库连接加密,避免中间人攻击(MITM)窃取敏感信息。
-
启用和审计 SQL Server 审计功能:
- 启用 SQL Server 审计功能,记录所有重要的数据库活动和变更。可以审计用户登录、权限更改、数据访问等操作。
- 配置适当的日志和警报机制,以便及时发现异常行为并采取行动。
-
定期进行漏洞扫描和安全测试:
- 定期使用安全扫描工具对 SQL Server 进行漏洞扫描,检查已知的漏洞,并及时应用补丁。
- 进行渗透测试以模拟可能的攻击路径,发现潜在的提权风险和漏洞。
-
配置最小特权原则和访问控制列表(ACLs):
- 对 SQL Server 配置最小特权原则,确保每个用户仅获得其工作所需的最低权限。
- 通过访问控制列表(ACLs)对数据库和服务器资源进行严格限制,确保未授权访问被阻止。
-
加强网络层安全:
- 配置 SQL Server 防火墙和防止未经授权的 IP 地址访问数据库实例。
- 使用虚拟专用网络(VPN)来保护远程访问,确保只有特定的安全用户可以连接到 SQL Server 实例。
-
监控和检测异常行为:
- 部署异常检测系统,实时监控 SQL Server 实例中的非正常活动,如未授权访问、权限变更、异常查询等。
- 在发现潜在的攻击行为时,立即触发警报,并采取隔离措施,防止攻击蔓延。
SQL Server 提权攻击手段层出不穷,攻击者利用多种漏洞和配置错误来提升自己的权限。为了有效防护 SQL Server,必须从多个层面进行全面的安全策略部署:包括身份验证、权限管理、加密措施、审计日志、漏洞修复、代理服务配置等方面。防止 SQL Server 提权攻击需要对数据库系统进行精细化管理,并定期进行安全审计与检测,确保系统的安全性和可持续性。
继续补充 SQL Server 提权方式及防护措施:
提权方式:
| 提权方式 | 描述 | 应用场景 |
|---|---|---|
| 利用系统存储过程提权 | SQL Server 中的系统存储过程允许对数据库进行各类操作。如果权限配置不当,攻击者可能通过执行这些系统存储过程,获得更高的权限或执行未经授权的操作。 | 攻击者滥用具有高权限的存储过程(如 xp_cmdshell、sp_configure 等),执行系统命令或改变服务器配置,进一步提权。 |
| 通过 CLR(公共语言运行库)提权 | SQL Server 允许集成 CLR 代码,可以通过编写 C# 或其他 .NET 代码扩展数据库功能。攻击者通过创建恶意的 CLR 程序,可能会调用系统级 API 或执行任意代码,从而提升权限。 | 攻击者利用 CLR 集成,创建恶意程序集执行系统操作,滥用权限,进一步获取管理员权限。 |
| SQL Server 认证绕过 | 如果数据库存在 SQL Server 身份验证机制配置不当或漏洞,攻击者可能绕过身份验证系统直接获取数据库访问权限,从而实现提权。 | 攻击者利用 SQL Server 身份验证机制中的漏洞(如 SQL 注入漏洞、弱密码等),绕过身份验证,直接获得数据库访问权限。 |
| 滥用代理账户提权 | SQL Server 代理账户通常由 Windows 系统账户提供服务。如果代理账户权限过高,攻击者可能通过操控代理账户执行任意命令,进一步获取系统权限。 | 攻击者通过滥用 SQL Server 代理账户的权限,执行系统级命令,进而提升到更高的系统权限。 |
| 通过网络共享滥用 | 如果 SQL Server 配置不当,攻击者可以通过共享网络驱动器访问 SQL Server 实例中的文件,进一步攻击并提升权限。 | 攻击者通过访问 SQL Server 实例上共享的文件和目录,窃取敏感信息或操控数据库文件,进而提升权限。 |
| 通过 SQL Server 配置文件滥用 | SQL Server 配置文件中存储了敏感的配置信息,包括管理员账户、连接字符串和其他重要的系统设置。如果攻击者能够访问这些配置文件,可能会获得管理员的访问权限。 | 攻击者通过访问 SQL Server 配置文件(如 sqlservr.ini 等)获取敏感信息,从而直接控制数据库实例,获得更高权限。 |
| 通过缓冲区溢出漏洞提权 | 在某些情况下,SQL Server 存在缓冲区溢出漏洞,攻击者通过精心构造的请求,可以覆盖程序内存,执行恶意代码,从而提升权限。 | 攻击者通过触发缓冲区溢出漏洞,执行恶意代码或命令,绕过权限控制,提升系统权限。 |
| 数据库触发器滥用 | SQL Server 支持触发器功能,允许在数据库表发生变化时自动执行某些操作。如果触发器没有妥善配置,攻击者可能通过滥用触发器执行非法操作,进一步获得权限。 | 攻击者通过操控或修改数据库触发器,执行恶意操作,篡改数据或执行未经授权的 SQL 语句。 |
| 数据库连接池滥用 | SQL Server 支持数据库连接池,如果攻击者能够操控应用程序或数据库连接池的配置,可能获得过多的数据库连接,从而达到提升权限的效果。 | 攻击者通过滥用连接池的管理方式,操控数据库连接,可能利用多连接攻击提权,导致数据库权限泄露。 |
| 文件系统权限滥用 | SQL Server 可能会与操作系统文件交互。如果 SQL Server 对文件系统的访问权限设置不当,攻击者可能通过访问文件系统,进行权限提升或修改数据库文件。 | 攻击者通过滥用文件系统权限,读取敏感文件或修改数据库文件,进而提升数据库实例的权限。 |
| 通过 Active Directory 提权 | 如果 SQL Server 与 Active Directory(AD)集成,攻击者可能通过滥用 AD 的权限,获取对 SQL Server 的访问权限。攻击者通过操控 AD 中的用户权限和组策略,可能实现 SQL Server 上的提权。 | 攻击者通过操控 Active Directory 中的权限,获取 SQL Server 认证信息,绕过身份验证,提升权限。 |
| 通过数据库链接滥用 | SQL Server 允许与其他数据库实例建立链接。如果攻击者能够操控链接配置或执行跨服务器查询,可能会访问其他数据库系统并提升权限。 | 攻击者通过滥用数据库链接,访问和操控其他服务器上的数据,进而获取更高的数据库权限。 |
| 命令行接口滥用 | SQL Server 提供了命令行工具(如 sqlcmd)来执行 SQL 脚本。如果攻击者能够访问这些命令行接口,并通过脚本执行操作,可能会绕过权限检查,提升权限。 |
攻击者通过 SQL Server 的命令行工具执行恶意脚本,绕过权限检查,直接执行高级操作或提升权限。 |
进一步加强的防护措施:
-
启用 Windows 身份验证模式:
- 强烈推荐启用 Windows 身份验证模式,并禁用 SQL Server 身份验证,减少恶意 SQL 注入攻击和其他认证绕过攻击的风险。
- 配置严格的身份验证策略,要求强密码,并定期更换密码,限制不必要的管理员权限。
-
限制系统存储过程的执行权限:
- 禁止普通用户或低权限用户执行敏感的系统存储过程(如
xp_cmdshell),通过审计日志监控这些存储过程的执行。 - 使用 SQL Server 的安全策略限制高权限存储过程的访问,减少滥用的可能性。
- 禁止普通用户或低权限用户执行敏感的系统存储过程(如
-
禁用或限制 CLR 集成:
- 对于不需要 CLR 功能的环境,禁用 CLR 集成,防止攻击者通过编写恶意的 CLR 代码来提升权限。
- 对需要使用 CLR 的环境,进行严格的代码审查和权限限制,确保只有经过授权的 CLR 程序可以执行。
-
最小化数据库的操作系统权限:
- 将 SQL Server 实例的操作系统帐户设置为最小权限账户,避免给 SQL Server 提供过多的操作系统权限。
- 定期检查 SQL Server 运行账户的权限,确保它仅能访问所需的系统资源。
-
加强代理和任务管理:
- 对 SQL Server 代理任务进行严格控制和审核,禁用不必要的代理任务,定期检查并更新任务配置。
- 为代理服务分配最小权限,避免代理服务滥用权限执行恶意操作。
-
密钥管理与加密:
- 配置 SQL Server 中的透明数据加密(TDE)来保护存储的数据,并配置适当的加密算法确保数据传输的安全性。
- 使用密钥管理系统(KMS)来管理数据库和应用程序的加密密钥,避免加密密钥泄漏。
-
启用高强度的审计与日志记录:
- 启用 SQL Server 审计功能,记录所有重要操作和权限变更。对数据库中执行的所有 SQL 查询进行监控,并设置警报机制。
- 定期分析 SQL Server 日志,及时发现潜在的安全事件,避免攻击的蔓延。
-
实施网络层防护:
- 配置防火墙和 VPN 保护 SQL Server 的访问,避免外部攻击者通过公共网络直接访问数据库。
- 限制 SQL Server 的访问仅限特定的 IP 地址或子网,减少潜在攻击的范围。
-
定期进行安全性评估和渗透测试:
- 定期对 SQL Server 实例进行渗透测试和漏洞扫描,找出潜在的安全隐患并及时修复。
- 对数据库进行全面的安全审计,检测不必要的权限配置、过期账户以及潜在的安全漏洞。
-
强化数据备份和灾难恢复计划:
- 定期备份 SQL Server 数据库并确保备份数据的安全,防止数据丢失或遭到篡改。
- 制定并测试灾难恢复计划,确保在遭遇攻击时能够迅速恢复正常运行。
SQL Server 提权攻击手段多样且具有高度隐蔽性,攻击者往往通过多种方式来获得系统或数据库实例的更高权限。为了防止此类攻击,企业需要对数据库系统进行全面的安全配置和防护。包括最小权限原则、身份验证控制、存储过程和代理服务管理、数据库加密、审计监控等方面的加强。这些防护措施能够有效降低 SQL Server 被提权攻击的风险,提高数据库系统的安全性。
SQL Server相关的高级权限和安全绕过技术,涉及的内容比较专业,并且在实际操作中,许多技术手段可能会被用于进行安全测试或评估。这里我可以为您简要解释每个提到的技术点,帮助您理解它们的工作原理和相关安全考虑。为了保证安全和合规性,我将尽量只提供关于技术的基础介绍,而不涉及具体的恶意用途。
1. xp_cmdshell (DBA权限)
xp_cmdshell 是SQL Server的一个扩展存储过程,它允许在SQL Server内部执行操作系统命令(类似于在命令行中运行)。如果一个数据库用户拥有DBA(数据库管理员)权限,攻击者可以利用此功能执行系统级命令,从而可能执行任何系统操作,如获取敏感信息、删除文件等。
启用 xp_cmdshell 后,SQL Server就可以执行外部操作系统命令,通常会被视为安全风险,因此很多生产环境中的SQL Server默认是禁用的。
2. sp_oacreate + sp_oamethod (DBA权限)
sp_oacreate 和 sp_oamethod 是SQL Server中的存储过程,可以用来创建和操作COM对象(Component Object Model)。攻击者可以利用这些存储过程执行外部程序或访问系统资源,从而获得对操作系统的控制。
sp_oacreate用于创建 COM 对象。sp_oamethod用于调用对象的方法。
如果攻击者拥有DBA权限,就能利用这些存储过程执行任意操作系统级操作,甚至启动恶意程序。
3. 沙盒提权 (DBA权限)
沙盒提权是一种技术手段,指通过绕过沙盒环境限制,从一个限制较低的执行环境(如沙盒)提升权限,获取更高的权限(如DBA权限)。在SQL Server中,如果有某些限制未能充分设置,攻击者可以利用某些漏洞或配置错误提升自己的权限。
4. CLR (DBA权限)
SQL Server支持在数据库中运行.NET程序集,通过CLR集成。攻击者可以上传恶意的.NET程序集并通过CLR执行。这些程序集可以直接访问操作系统功能,绕过SQL Server的标准权限限制。如果攻击者有DBA权限,他们可以执行操作系统级操作或进行任意代码执行。
5. xp_regwrite (映像劫持, DBA权限)
xp_regwrite 是SQL Server的一个扩展存储过程,它允许操作注册表。在攻击者拥有DBA权限时,可以利用这个存储过程修改系统注册表设置,从而可能执行恶意代码或进行其他恶意活动。
映像劫持指的是通过修改注册表或操作系统设置来劫持应用程序的启动过程,进而执行恶意代码。
6. SQL Server Agent Job (DBA权限)
SQL Server Agent 是SQL Server中的一个作业调度工具,允许用户定期执行SQL脚本、存储过程和操作系统命令。攻击者如果拥有DBA权限,可以创建或修改SQL Server Agent作业,执行恶意命令或定期启动恶意脚本,进而在目标系统上执行攻击。
7. R和Python (dbo/DBA权限)
SQL Server允许通过CLR或其他方式在数据库中运行外部语言(如R和Python)。在许多数据库应用中,数据科学家和分析人员可以利用R和Python来进行复杂的数据分析。如果攻击者拥有足够的权限(如DBA或dbo权限),他们可能通过这些语言执行恶意代码、访问操作系统资源等。
8. 不支持堆叠的情况下执行系统命令
通常,SQL Server允许在多个SQL语句中堆叠命令,即一次执行多个SQL命令。如果SQL Server配置不支持堆叠命令,攻击者可以寻找其他途径来执行系统命令(如利用存储过程或其他机制执行命令)。
9. 数据库差异备份写Webshell
数据库差异备份是SQL Server的一种备份方式,用来仅备份自上次完全备份以来发生更改的数据。如果攻击者能够修改或替换差异备份文件,就可能在备份中嵌入Webshell(通过修改备份文件中的内容或通过备份中的脚本),从而在恢复时获得远程控制。
10. 日志差异备份写Webshell
日志差异备份通常记录数据库事务日志的更改。当攻击者获取对这些日志文件的访问权限时,他们可以通过操控日志文件,插入Webshell等恶意代码。这样,一旦恢复数据库,攻击者就能够通过Webshell访问系统。
安全防护建议:
-
限制权限:最有效的防止此类攻击的方式是将权限最小化,DBA权限应只授予受信任的用户,且严格限制不必要的系统权限。
-
禁用危险功能:如
xp_cmdshell、sp_oacreate等,可以通过禁用或限制它们的使用来降低风险。 -
日志和监控:定期审计SQL Server日志并设置报警,以便及时发现异常操作。
-
隔离和沙盒:尽可能将数据库和应用程序环境隔离,使用防火墙、网络分段等措施限制未经授权的访问。
-
定期更新和补丁管理:确保SQL Server及其操作系统定期更新,及时修补安全漏洞。
这些技术和方法的目的通常是在企业或组织内部进行安全测试,识别潜在的漏洞和风险,而不是用于非法活动。
xp_cmdshell 是 SQL Server 中的一个扩展存储过程,它允许执行操作系统命令,类似于在 SQL Server 中执行外部命令行的操作。这个功能的出现与其潜在的安全风险紧密相关,因此在 SQL Server 的不同版本中,xp_cmdshell 的功能和行为经历了一些变化。以下是 xp_cmdshell 发展的时间线:
1. 早期版本(SQL Server 7.0 和 SQL Server 2000)
-
1998年(SQL Server 7.0 发布):
xp_cmdshell首次出现在 SQL Server 中,为了提供执行外部操作系统命令的功能。它允许 SQL Server 管理员执行任何操作系统命令,例如批处理脚本、文件操作、命令行工具等,通常用于管理员的日常任务自动化。 -
2000年(SQL Server 2000 发布):
xp_cmdshell依然是 SQL Server 的一部分,并广泛用于执行与操作系统相关的命令。不过,这个功能也开始引起了安全问题,因为它允许 SQL Server 执行具有极高权限的命令,容易被恶意利用。
2. SQL Server 2005 - 引入安全控制
- 2005年(SQL Server 2005 发布):SQL Server 2005 引入了更加严格的安全模型。虽然
xp_cmdshell仍然存在,但它不再默认启用。管理员需要手动启用该功能。xp_cmdshell的默认状态为 禁用。管理员必须通过sp_configure命令显式启用它。- 启用过程需要
advanced options的设置,这个改变使得默认情况下 SQL Server 更加安全。 - 在这个版本中,
xp_cmdshell的安全隐患依旧存在,特别是对于攻击者获取数据库权限后,可以进一步控制操作系统。
3. SQL Server 2008 - 增强的安全性
- 2008年(SQL Server 2008 发布):尽管
xp_cmdshell依然存在,并且同样需要手动启用,但 SQL Server 2008 在安全性方面进行了改进。xp_cmdshell可以通过权限配置来限制对其执行的访问。- 为了提高安全性,SQL Server 2008 提供了对系统管理权限的更加严格的控制。
- SQL Server 2008 还引入了其他安全机制,例如 Windows 身份验证和更细粒度的权限控制。
4. SQL Server 2012 - 默认禁用
- 2012年(SQL Server 2012 发布):随着对安全性的关注不断增加,
xp_cmdshell继续默认被禁用。管理员需要显式启用该功能,且必须具备足够的权限。- 新的权限模型:SQL Server 2012 强化了对
xp_cmdshell的访问控制,即使启用了xp_cmdshell,也只有特定的用户和角色才能执行操作。 - SQL Server 2012 还提供了对一些高级功能的改进,例如更强的身份验证和加密功能,从而提高了安全性。
- 新的权限模型:SQL Server 2012 强化了对
5. SQL Server 2014 - 安全性进一步加强
- 2014年(SQL Server 2014 发布):
xp_cmdshell继续保持默认禁用状态,并且管理员需要通过sp_configure手动启用。此版本继续加强了对敏感操作的控制,强化了数据库和操作系统的隔离。- 对于启用
xp_cmdshell的管理操作进行了更多的审计和日志记录,以帮助管理员监控其使用情况,防止滥用。 - 提高了 SQL Server 对敏感命令执行的限制,减少了潜在的风险。
- 对于启用
6. SQL Server 2016 - 更严格的权限管理
- 2016年(SQL Server 2016 发布):SQL Server 2016 引入了对
xp_cmdshell的更多控制,包括对其执行的进一步限制。- 通过强化的 审计 和 日志 机制,SQL Server 2016 可以更加清晰地记录谁在何时执行了
xp_cmdshell,并且能够追踪相关的命令。 xp_cmdshell仍然是默认禁用的,并且必须通过管理员手动启用,且通常需要额外的权限验证。
- 通过强化的 审计 和 日志 机制,SQL Server 2016 可以更加清晰地记录谁在何时执行了
7. SQL Server 2017 - 默认禁用并进一步改进安全性
- 2017年(SQL Server 2017 发布):
xp_cmdshell仍然默认禁用,并且为了提升安全性,管理员对其访问权限的控制进一步增强。SQL Server 2017 强化了对操作系统命令执行的隔离,尤其是在高风险环境下。- 进一步优化了 防止 SQL 注入 等攻击的功能,减少了通过
xp_cmdshell执行恶意操作的可能性。
- 进一步优化了 防止 SQL 注入 等攻击的功能,减少了通过
8. SQL Server 2019 和更高版本
- 2019年(SQL Server 2019 发布):到目前为止,
xp_cmdshell依然存在于 SQL Server 中,但它默认是禁用的,并且依然是潜在的安全风险源。因此,在生产环境中,尽量避免使用xp_cmdshell,除非绝对必要。- 进一步加强了 访问控制 和 审计 功能,要求 SQL Server 管理员必须小心处理
xp_cmdshell的启用。
- 进一步加强了 访问控制 和 审计 功能,要求 SQL Server 管理员必须小心处理
总结:
- 1998年(SQL Server 7.0):
xp_cmdshell首次出现,允许执行外部命令。 - 2005年(SQL Server 2005):默认禁用
xp_cmdshell,提高安全性。 - 2008年(SQL Server 2008):进一步增强了安全性和控制权限。
- 2012年(SQL Server 2012):继续保持默认禁用,并加强访问控制。
- 2014年(SQL Server 2014):安全性进一步提升,强化了对敏感命令的控制。
- 2016年(SQL Server 2016):强化审计和日志记录,提高安全性。
- 2017年及以后(SQL Server 2017+):
xp_cmdshell继续默认禁用,增强对命令执行的监控。
随着每个版本的发布,SQL Server 都不断加强对 xp_cmdshell 使用的安全管理和审计能力,逐渐将其作为高风险操作进行限制。为了防止潜在的安全漏洞,很多企业和数据库管理员选择在生产环境中禁用 xp_cmdshell。

浙公网安备 33010602011771号