CLR 在sql server中的应用
CLR:通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.NET的虚拟机所选用的名称。它是微软对通用语言架构(CLI)的实现版本,它定义了一个代码运行的环境。CLR运行一种称为通用中间语言的字节码,这个是微软的通用中间语言实现版本。(我理解CLR为可执行程序)
存储过程:是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序。若要在存储过程执行外部可执行程序,则
CREATE PROCEDURE dbo.esp_proc(存储过程名称)
AS EXTERNAL NAME '可执行程序名'
excute dbo.esp_proc(存储过程名称)
1、CLR代码执行方式
创建CLR有两种方式:
①使用DLL文件进行创建
CREATE ASSEMBLY assembly_name from ‘dll_path’
②使用文件16进制流进行创建
CREATE ASSEMBLY assembly_name from 文件十六进制流
第一种方法,需要上传我们所需要的存储过程DLL,攻击门槛高。相比之下第二种方法,只需要一个注入点就可以了。所以本文重点讨论第二种方法的CLR攻击实现。
编译CLR时的代码:
关键代码为在SqlStoredProcedure1 ()内,代码逻辑很简单,创建一个cmd进程执行 whoami /user 并把结果写入到本地txt文件中。
经历种种,获取16进制流,执行sql语句:
逻辑就是创建存储过程,以及获得一个实例,去执行它。
同时完成提权,权限为数据库权限
CLR执行的环境是在SQLServer,通过CREATE ASSEMBLY, CREATE PROCEDURE创建存储过程,实例化操作对象,之后再经过EXEC执行。SQL Server执行CLR,必须要满足:
1、数据库开启CLR.
2、数据库用户有CREATE ASSEMBLY, CREATE PROCEDURE, EXEC权限。
查阅SQLServer官方文档,在默认情况下,Microsoft SQL Server 中关闭了公共语言运行库 (CLR)
集成功能。必须启用该功能才能使用 SQL Server 项目项。若要启用 CLR 集成,请使用 sp_configure 存储过程的“启用
clr”选项。
本文转载自 360网络安全响应中心