欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CLR在SQL Server中的利用技术分析

来源:本站整理 作者:佚名 时间:2017-07-20 TAG: 我要投稿

CLR:通用语言运行平台(Common Language Runtime,简称CLR)是微软为他们的.NET的虚拟机所选用的名称。它是微软对通用语言架构(CLI)的实现版本,它定义了一个代码运行的环境。CLR运行一种称为通用中间语言的字节码,这个是微软的通用中间语言实现版本。
存储过程:是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序。
0x01 测试环境及使用工具
操作系统:Windows Server 2012 Datacenter
数据库版本:SQLServer 2012
Framework版本:v4.0.30319
开发平台:VisualStudio Professional 2015(14.0.25431.01 Update 3)
使用工具:winhex
0x02 通过CLR在SQL Server中执行代码简述
利用思路:使用VS创建SQL Server项目,使用公共语言运行时(CLR)来创建自定义存储过程,SQL Server将允许执行任何受CLR支持的编程语言代码,比如C#。
限制条件:
需要创建自定义存储过程的能力。
SQL Server上启用CLR。
并且要求SQL Server服务帐户具有执行命令/代码的必要权限。
0x03 通过CLR在SQL Server代码执行实现
1、CLR代码执行方式
创建CLR有两种方式:
①使用DLL文件进行创建

CREATE ASSEMBLY assembly_name from ‘dll_path’
②使用文件16进制流进行创建
CREATE ASSEMBLY assembly_name from 文件十六进制流
第一种方法,需要上传我们所需要的存储过程DLL,攻击门槛高。相比之下第二种方法,只需要一个注入点就可以了。所以本文重点讨论第二种方法的CLR攻击实现。
2、详细测试步骤
①在VS 2015中创建CLR C#项目:

图1 创建CLR项目
新建一个SQL Server的数据库项目,此模板需要在VS安装时勾选SQL Tool选项。
②设置项目属性:

图2:项目属性设置
项目属性设置分为两部分:
在项目设置中,选定目标SQL版本,此处我选定的为SQL2012。
在SQLCLR中设置权限级别UNSAFE,以及选定所用语言为C#。
③添加新建项

图3:新建项目
右键项目,点击添加→新建项→SQL CLR C#→SQL CLR C#存储过程。
④添加代码

关键代码为在SqlStoredProcedure1 ()内,代码逻辑很简单,创建一个cmd进程执行 whoami /user 并把结果写入到本地txt文件中。
⑤进行编译,解压出我们所需要的16进制流数据

图4:解压dacpac文件
找到编译文件夹,将dacpac文件解压出来,获得其中的sql文件。

图5:获得到16进制文件流数据
⑥执行sql语句

逻辑就是创建存储过程,以及获得一个实例,去执行它。
⑦结果

找到C:/sql_exec目录下,里面确实有执行结果,并且所有者为MSSQLSERVER。

0x04 深入研究
1、执行方式的异同
之前所说过,SQL Server执行CLR,有两种方法,一种是引入文件,第二种是FROM文件流。针对这两种方法,我们进行对比。
通过WinHex,打开代码编译后得到的dll文件。进行查看:

图8:编译后得到的dll
之后我们对比解压出来sql文件中的16进制流文件。进行对比:

图9:得到sql文件
经过对比,发现里面的内容是一样的,所以在SQL Server执行过程中,对两种方法的效果是一样的。
2、提权行为分析
在此次试验中,执行sql语句的用户是testUser,并不是高权限的数据库角色。对testUser仅分配了CREATE ASSEMBLY, CREATE PROCEDURE, EXEC权限。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载