Az - SQL
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
Azure SQL
Azure SQL 是一系列托管、安全和智能的产品,使用 Azure 云中的 SQL Server 数据库引擎。这意味着您不必担心服务器的物理管理,可以专注于管理您的数据。
Azure SQL 由四个主要产品组成:
- Azure SQL Server:需要一个服务器来进行 SQL Server 数据库的 部署和管理。
- Azure SQL Database:这是一个 完全托管的数据库服务,允许您在 Azure 云中托管单个数据库。
- Azure SQL Managed Instance:适用于更大规模的整个 SQL Server 实例范围的部署。
- Azure SQL Server on Azure VMs:最适合您希望 控制操作系统 和 SQL Server 实例的架构。
SQL Server 安全特性
网络访问:
- 公共端点(可以限制访问特定网络)。
- 私有端点。
- 也可以根据域名限制连接。
- 也可以允许 Azure 服务访问(例如使用门户中的查询编辑器或允许 Azure VM 连接)。
身份验证方法:
- Microsoft Entra-only 身份验证:您需要指明将访问该服务的 Entra 主体。
- SQL 和 Microsoft Entra 身份验证:传统的 SQL 身份验证,使用用户名和密码以及 Microsoft Entra。
- 仅 SQL 身份验证:仅允许通过数据库用户访问。
请注意,如果允许任何 SQL 身份验证,则需要指明一个管理员用户(用户名 + 密码),如果选择 Entra ID 身份验证,则还需要指明至少一个具有管理员访问权限的主体。
加密:
-
这被称为“透明数据加密”,它对数据库、备份和静态日志进行加密。
-
和往常一样,默认使用 Azure 托管密钥,但也可以使用客户管理的加密密钥(CMEK)。 托管身份:
-
可以分配系统和用户管理的 MI。
-
用于访问加密密钥(如果使用 CMEK)和数据库中的其他服务。
-
有关可以从数据库访问的 Azure 服务的一些示例,请查看 文档的此页面
-
如果分配了多个 UMI,可以指明要使用的默认 UMI。
-
可以为跨租户访问配置联合客户端身份。
一些从 SQL 数据库访问 blob 存储内部信息的命令:
-- Create a credential for the managed identity
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
WITH IDENTITY = 'Managed Identity';
GO
-- Create an external data source pointing to the blob storage to access
CREATE EXTERNAL DATA SOURCE ManagedIdentity
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://testsqlidentity.blob.core.windows.net/sqlcontainer',
CREDENTIAL = ManagedIdentityCredential
);
GO
-- Read a file from ths storage and return it
SELECT *
FROM OPENROWSET(
BULK 'message.txt',
DATA_SOURCE = 'ManagedIdentity',
SINGLE_CLOB
) AS DataFile;
GO
Microsoft Defender:
- 有助于“减轻潜在数据库漏洞,并检测异常活动”
- 我们将在单独的课程中讨论 Defender(它可以在其他多个 Azure 服务中启用)
备份:
- 备份频率在保留策略中管理。
已删除的数据库:
- 可以从现有备份中恢复已删除的数据库。
Azure SQL 数据库
Azure SQL 数据库 是一个 完全托管的数据库平台即服务 (PaaS),提供可扩展和安全的关系数据库解决方案。它基于最新的 SQL Server 技术,消除了基础设施管理的需要,使其成为基于云的应用程序的热门选择。
要创建 SQL 数据库,需要指明将要托管的 SQL 服务器。
SQL 数据库安全特性
- 始终保持最新:运行在最新的稳定版本 SQL Server 上,并自动接收新功能和补丁。
- 继承的 SQL Server 安全特性:
- 身份验证 (SQL 和/或 Entra ID)
- 分配的托管身份
- 网络限制
- 加密
- 备份
- …
- 数据冗余: 选项包括本地、区域、地理或地理区域冗余。
- 账本: 它通过加密验证数据的完整性,确保任何篡改都能被检测到。对金融、医疗和任何管理敏感数据的组织非常有用。
SQL 数据库可以是 弹性池 的一部分。弹性池是一种经济高效的解决方案,通过在多个数据库之间共享可配置的计算 (eDTUs) 和存储资源来管理多个数据库,定价仅基于分配的资源,而不是数据库的数量。
Azure SQL 列级安全 (掩码) 和行级安全
Azure SQL 的动态 数据掩码是一项功能,帮助 通过隐藏敏感信息 来 保护敏感信息。它不是改变实际数据,而是动态掩盖显示的数据,确保像信用卡号码这样的敏感细节被遮蔽。
动态数据掩码 影响所有用户,除了未被掩盖的用户(这些用户需要被指明)和管理员。它具有配置选项,指定哪些 SQL 用户免于动态数据掩码,管理员始终被排除在外。
Azure SQL 行级安全 (RLS) 是一项功能,控制用户可以查看或修改哪些行,确保每个用户仅看到与他们相关的数据。通过创建带有过滤或阻止谓词的安全策略,组织可以在数据库级别实施细粒度访问控制。
Azure SQL 托管实例
Azure SQL 托管实例 适用于更大规模的、整个 SQL Server 实例范围的部署。它提供与最新的 SQL Server 本地(企业版)数据库引擎近 100% 的兼容性,提供本地虚拟网络 (VNet) 实现,解决常见的安全问题,并为本地 SQL Server 客户提供有利的商业模式。
Azure SQL 虚拟机
Azure SQL 虚拟机 允许 控制操作系统 和 SQL Server 实例,因为虚拟机将在运行 SQL Server 的虚拟机服务中生成。
创建 SQL 虚拟机时,可以 选择虚拟机的所有设置(如虚拟机课程中所示),这些设置将托管 SQL Server。
- 这意味着虚拟机将访问某些 VNet,可能会有 附加的托管身份,可以挂载文件共享……使得 从 SQL 到虚拟机的跳板非常有趣。
- 此外,可以配置应用 ID 和密钥,以 允许 SQL 访问特定的密钥保管库,该保管库可能包含敏感信息。
还可以配置诸如 自动 SQL 更新、自动备份、Entra ID 身份验证 和其他 SQL 服务的大多数功能。
枚举
# List Servers
az sql server list # managed identities are enumerated here too
## List Server Usages
az sql server list-usages --name <server_name> --resource-group <resource_group>
## List Server Firewalls
az sql server firewall-rule list --resource-group <resource_group> --server <server_name>
## List of Azure Active Directory administrators in a server.
az sql server ad-admin list --resource-group <resource_group> --server <server_name>
## Gets an advanced threat protection
az sql server advanced-threat-protection-setting show --resource-group <resource_group> --name <server_name>
## Get server's auditing policy.
az sql server audit-policy show --resource-group <resource_group> --name <server_name>
## Gets a server's secure connection policy.
az sql server conn-policy show --resource-group <resource_group> --server <server_name>
## Gets a list of server DNS aliases for a server.
az sql server dns-alias list --resource-group <resource_group> --server <server_name>
## List of server keys.
az sql server key list --resource-group <resource_group> --server <server_name>
## Gets a server encryption protector.
az sql server tde-key show --resource-group <resource_group> --server <server_name>
# List Databases in a SQL server
az sql db list --server <server_name> --resource-group <resource_group> #--output table
## Get details of a specific database
az sql db show --name <database_name> --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List of operations performed on the database.
az sql db op list --database <database_name> --server <server_name> --resource-group <resource_group>
## List sql database classification
az sql db classification list --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention backups for a SQL database
az sql db ltr-backup list --database <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db ltr-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db str-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List the replicas of a database and their replication status
az sql db replica list-links --name <database_name> --server <server_name> --resource-group <resource_group>
## List deleted SQL databases
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List restorable dropped databases in a SQL server
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List advanced threat protection setting show
az sql db advanced-threat-protection-setting --name <database_name> --server <server_name> --resource-group <resource_group>
# List all elastic pools in a SQL server
az sql elastic-pool list --server <server_name> --resource-group <resource_group> #--output table
## List all databases in a specific elastic pool
az sql elastic-pool show --name <elastic_pool_name> --server <server_name> --resource-group <resource_group>
## List of databases in an elastic pool.
az sql elastic-pool list-dbs --name <elastic_pool_name> --server <server_name> --resource-group <resource_group>
# List all managed Instances
az sql mi list
az sql mi show --resource-group <res-grp> --name <name>
az sql midb list
az sql midb show --resource-group <res-grp> --name <name>
# Lis all sql VM
az sql vm list
az sql vm show --resource-group <res-grp> --name <name>
# List schema by the database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas?api-version=2021-11-01"
# Get tables of a database with the schema
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables?api-version=2021-11-01"
# Get columns of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/columns?api-version=2021-11-01"
# Get columns of a table
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables/<tableName>/columns?api-version=2021-11-01"
# Get DataMaskingPolicies of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default?api-version=2021-11-01"
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default/rules?api-version=2021-11-01"
此外,如果您想在数据库中枚举动态数据掩码和行级策略,可以查询:
--Enumerates the masked columns
SELECT
OBJECT_NAME(mc.object_id) AS TableName,
c.name AS ColumnName,
mc.masking_function AS MaskingFunction
FROM sys.masked_columns AS mc
JOIN sys.columns AS c
ON mc.object_id = c.object_id
AND mc.column_id = c.column_id
--Enumerates Row level policies
SELECT
sp.name AS PolicyName,
sp.is_enabled,
sp.create_date,
sp.modify_date,
OBJECT_NAME(sp.object_id) AS TableName,
sp2.predicate_definition AS PredicateDefinition
FROM sys.security_policies AS sp
JOIN sys.security_predicates AS sp2
ON sp.object_id = sp2.object_id;
连接并运行 SQL 查询
您可以从示例 枚举 Az WebApp 中找到连接字符串(包含凭据):
function invoke-sql{
param($query)
$Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
$Connection = New-Object System.Data.SqlClient.SqlConnection $Connection_string
$Connection.Open()
$Command = New-Object System.Data.SqlClient.SqlCommand
$Command.Connection = $Connection
$Command.CommandText = $query
$Reader = $Command.ExecuteReader()
while ($Reader.Read()) {
$Reader.GetValue(0)
}
$Connection.Close()
}
invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'
您还可以使用 sqlcmd 访问数据库。了解服务器是否允许公共连接很重要 az sql server show --name <server-name> --resource-group <resource-group>,以及防火墙规则是否允许我们的 IP 访问:
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
参考文献
- https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql
- https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql
- https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql
- https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql
权限提升
后期利用
持久性
Tip
学习并练习 AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 subscription plans!
- 加入 💬 Discord group 或者 telegram group 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库 提交 PRs 来分享 hacking tricks。
HackTricks Cloud

