Files
hacktricks-cloud/src/pentesting-cloud/azure-security/az-services/az-sql.md

16 KiB
Raw Blame History

Az - SQL

{{#include ../../../banners/hacktricks-training.md}}

Azure SQL

Azure SQL 是一系列托管、安全和智能的产品,使用 Azure 云中的 SQL Server 数据库引擎。这意味着您不必担心服务器的物理管理,您可以专注于管理您的数据。

Azure SQL 由四个主要产品组成:

  1. Azure SQL Server:需要一个服务器来进行 SQL Server 数据库的部署和管理
  2. Azure SQL Database:这是一个 完全托管的数据库服务,允许您在 Azure 云中托管单个数据库。
  3. Azure SQL Managed Instance:适用于更大规模的整个 SQL Server 实例范围的部署。
  4. 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>

参考

权限提升

{{#ref}} ../az-privilege-escalation/az-sql-privesc.md {{#endref}}

后期利用

{{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}}

{{#include ../../../banners/hacktricks-training.md}}