16 KiB
Az - SQL
{{#include ../../../banners/hacktricks-training.md}}
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)和数据库中的其他服务。
- 如果分配了多个 UMI,可以指明要使用的默认 UMI。
- 可以为跨租户访问配置联合客户端身份。
Microsoft Defender:
- 有助于“减轻潜在的数据库漏洞,并检测异常活动”。
- 我们将在自己的课程中讨论 Defender(可以在其他多个 Azure 服务中启用)。
备份:
- 备份频率在保留策略中管理。
已删除的数据库:
- 可以从现有备份中恢复已删除的数据库。
Azure SQL Database
Azure SQL Database 是一个 完全托管的数据库平台即服务 (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 Managed Instance
Azure SQL Managed Instances 适用于更大规模的整个 SQL Server 实例范围的部署。它提供与最新的 SQL Server 本地(企业版)数据库引擎近乎 100% 的兼容性,提供本地虚拟网络 (VNet) 实现,解决常见的安全问题,并为本地 SQL Server 客户提供有利的商业模式。
Azure SQL 虚拟机
Azure SQL 虚拟机 允许 控制操作系统 和 SQL Server 实例,因为将在运行 SQL Server 的 VM 服务中生成一个 VM。
创建 SQL 虚拟机时,可以 选择 VM 的所有设置(如 VM 课程中所示),该 VM 将托管 SQL Server。
- 这意味着 VM 将访问某些 VNet,可能会有 附加的托管身份,可能会挂载文件共享……使得 从 SQL 到 VM 的跳板 非常有趣。
- 此外,可以配置应用 ID 和密钥以 允许 SQL 访问特定的密钥保管库,该保管库可能包含敏感信息。
还可以配置自动 SQL 更新、自动备份、Entra ID 身份验证以及其他 SQL 服务的大多数功能。
枚举
{{#tabs}} {{#tab name="az cli"}}
# 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/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Sql/servers/getstorageserver/databases/masktest/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"
{{#endtab}}
{{#tab name="Az PowerShell"}}
# List Servers
Get-AzSqlServer -ResourceGroupName "<resource-group-name>"
# List All Databases in a SQL Server
Get-AzSqlDatabase -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# Get Details of a Specific Database
Get-AzSqlDatabase -Name "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Operations Performed on the Database
Get-AzSqlDatabaseActivity -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List SQL Database Classification
Get-AzSqlDatabaseSensitivityClassification -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Long-Term Retention Backups for a SQL Database
Get-AzSqlDatabaseLongTermRetentionBackup -ResourceGroupName "<resource_group>" -Location "<location>"
# List Replicas of a Database and Their Replication Status
Get-AzSqlDatabaseReplicationLink -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Deleted SQL Databases
Get-AzSqlDeletedDatabaseBackup -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List All Elastic Pools in a SQL Server
Get-AzSqlElasticPool -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List All Databases in a Specific Elastic Pool
Get-AzSqlElasticPoolDatabase -ElasticPoolName "<elastic_pool_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List all managed Instances
Get-AzSqlInstance
Get-AzSqlInstance -ResourceGroupName <ResourceGroupName> -Name <ManagedInstanceName>
# List All Databases in a SQL Managed Instance
Get-AzSqlInstanceDatabase -ResourceGroupName <ResourceGroupName> -InstanceName <ManagedInstanceName>
# Lis all sql VM
Get-AzSqlVM
{{#endtab}} {{#endtabs}}
此外,如果您想在数据库中枚举动态数据掩码和行级策略,可以查询:
--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
权限提升
{{#ref}} ../az-privilege-escalation/az-sql-privesc.md {{#endref}}
后期利用
{{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}}
{{#include ../../../banners/hacktricks-training.md}}