# Az - SQL

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

## Azure SQL

Azure SQL is 'n familie van bestuurde, veilige en intelligente produkte wat die **SQL Server-databasisengine in die Azure-wolk** gebruik. Dit beteken jy hoef nie bekommerd te wees oor die fisiese administrasie van jou bedieners nie, en jy kan fokus op die bestuur van jou data.

Azure SQL bestaan uit vier hoofaanbiedinge:

1. **Azure SQL Server**: 'n bediener is nodig vir die **ontplooiing en bestuur** van SQL Server-databasisse.
2. **Azure SQL Database**: Dit is 'n **volledig bestuurde databasisdiens**, wat jou toelaat om individuele databasisse in die Azure-wolk te huisves.
3. **Azure SQL Managed Instance**: Dit is vir groter skaal, hele SQL Server-instantie-geskepte ontplooiings.
4. **Azure SQL Server op Azure VMs**: Dit is die beste vir argitekture waar jy **beheer oor die bedryfstelsel** en SQL Server-instantie wil hê.

### SQL Server Sekuriteitskenmerke

**Netwerktoegang:**

- Publieke eindpunt (kan toegang tot spesifieke netwerke beperk).
- Privaat eindpunte.
- Dit is ook moontlik om verbindings op grond van domeinnames te beperk.
- Dit is ook moontlik om Azure-dienste toe te laat om toegang te verkry (soos om die Query-redigeerder in die portaal te gebruik of om 'n Azure VM toe te laat om te verbind).

**Verifikasiemetodes:**

- Microsoft **Entra-slegs** verifikasie: Jy moet die Entra-principals aandui wat toegang tot die diens sal hê.
- **Sowel SQL as Microsoft Entra** verifikasie: Tradisionele SQL-verifikasie met gebruikersnaam en wagwoord saam met Microsoft Entra.
- **Slegs SQL** verifikasie: Toegang slegs toelaat via databasisgebruikers.

Let daarop dat as enige SQL-verifikasie toegelaat word, 'n admin-gebruiker (gebruikersnaam + wagwoord) aangedui moet word, en as Entra ID-verifikasie gekies word, moet daar ook ten minste een principal met admin-toegang aangedui word.

**Enkripsie:**

- Dit word "Deursigtige data-enkripsie" genoem en dit enkripteer databasisse, rugsteun en logs in rus.
- Soos altyd, 'n Azure bestuurde sleutel word standaard gebruik, maar 'n klant bestuurde enkripsiesleutel (CMEK) kan ook gebruik word.
**Bestuurde Identiteite:**

- Dit is moontlik om stelsel- en gebruiker bestuurde MI's toe te ken.
- Gebruik om toegang tot die enkripsiesleutel te verkry (is 'n CMEK gebruik) en ander dienste van die databasisse.
- Vir 'n paar voorbeelde van die Azure-dienste wat vanaf die databasis toeganklik is, kyk [hierdie bladsy van die dokumentasie](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
- As meer as een UMI toegeken word, is dit moontlik om die standaard een aan te dui wat gebruik moet word.
- Dit is moontlik om 'n gefedereerde kliëntidentiteit vir kruis-tenant toegang te konfigureer.

Sommige opdragte om inligting binne 'n blob-stoor vanaf 'n SQL-databasis te verkry:
```sql
-- 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:**

- Nuttig vir “die versagting van potensiële databasis kwesbaarhede, en die opsporing van anomale aktiwiteite”
- Ons sal oor Defender in sy eie les praat (dit kan in verskeie ander Azure dienste geaktiveer word)

**Backups:**
- Die frekwensie van rugsteun word in die retensiebeleide bestuur.

**Verwyderde databasisse:**
- Dit is moontlik om DB's wat uit bestaande rugsteun verwyder is, te herstel.

## Azure SQL Database

**Azure SQL Database** is 'n **volledig bestuurde databasisplatform as 'n diens (PaaS)** wat skaalbare en veilige relationele databasisoplossings bied. Dit is gebou op die nuutste SQL Server tegnologieë en elimineer die behoefte aan infrastruktuurbestuur, wat dit 'n gewilde keuse maak vir wolk-gebaseerde toepassings.

Om 'n SQL-databasis te skep, is dit nodig om die SQL-server aan te dui waar dit gehoste sal word.

### SQL Database Sekuriteitskenmerke

- **Altijd Op Datum**: Loop op die nuutste stabiele weergawe van SQL Server en ontvang nuwe kenmerke en patches outomaties.
- **Geërfde SQL Server sekuriteitskenmerke:**
- Verifikasie (SQL en/of Entra ID)
- Toegewyde Bestuurde Identiteite
- Netwerkbeperkings
- Enkripsie
- Rugsteun
- …
- **Data redundansie:** Opsies is plaaslik, sone, Geo of Geo-Zone redundante.
- **Ledger:** Dit verifieer die integriteit van data cryptografies, wat verseker dat enige vervalsing opgespoor word. Nuttig vir finansiële, mediese en enige organisasie wat sensitiewe data bestuur.

'n SQL-databasis kan deel wees van 'n **elastiese Poel**. Elastiese poele is 'n kostedoeltreffende oplossing vir die bestuur van verskeie databasisse deur konfigureerbare rekenaar (eDTUs) en stoorhulpbronne onder hulle te deel, met prysbepaling wat slegs gebaseer is op die hulpbronne wat toegeken is eerder as die aantal databasisse.

#### Azure SQL Kolomvlak Sekuriteit (Maskering) & Ryvlak Sekuriteit

**Azure SQL se dinamiese** datamaskering is 'n kenmerk wat help om **sensitiewe inligting te beskerm deur dit** van ongemagtigde gebruikers te verberg. In plaas daarvan om die werklike data te verander, maskering dit dinamies die vertoonde data, wat verseker dat sensitiewe besonderhede soos kredietkaartnommers verborge is.

Die **Dinamiese Datamaskering** raak alle gebruikers behalwe diegene wat nie gemasker is nie (hierdie gebruikers moet aangedui word) en administrateurs. Dit het die konfigurasieopsie wat spesifiseer watter SQL-gebruikers vrygestel is van dinamiese datamaskering, met **administrateurs altyd uitgesluit**.

**Azure SQL Ryvlak Sekuriteit (RLS)** is 'n kenmerk wat **beheer watter rye 'n gebruiker kan sien of wysig**, wat verseker dat elke gebruiker slegs die data sien wat relevant is vir hulle. Deur sekuriteitsbeleide met filter of blokpredikate te skep, kan organisasies fyngeweefde toegang op databasisvlak afdwing.

### Azure SQL Bestuurde Instansie

**Azure SQL Bestuurde Instansies** is vir groter skaal, hele SQL Server instansie-geskepte ontplooiings. Dit bied byna 100% kompatibiliteit met die nuutste SQL Server op-premises (Enterprise Edition) Databasis-enjin, wat 'n inheemse virtuele netwerk (VNet) implementering bied wat algemene sekuriteitskwessies aanspreek, en 'n besigheidsmodel wat gunstig is vir op-premises SQL Server kliënte.

### Azure SQL Virtuele Masjiene

**Azure SQL Virtuele Masjiene** laat jou toe om **die bedryfstelsel** en die SQL Server instansie te **beheer**, aangesien 'n VM in die VM-diens wat die SQL-server draai, geskep sal word.

Wanneer 'n SQL Virtuele Masjien geskep word, is dit moontlik om **alle instellings van die VM te kies** (soos in die VM-les gewys) wat die SQL-server sal huisves.
- Dit beteken dat die VM toegang tot sommige VNet(s) sal hê, moontlik **Bestuurde Identiteite aan dit geheg** kan hê, en lêerdeelings gemonteer kan hê… wat 'n **pivoting van die SQL** na die VM baie interessant maak.
- Boonop is dit moontlik om 'n app-id en geheim te konfigureer om **die SQL toegang te gee tot 'n spesifieke sleutelkluis**, wat sensitiewe inligting kan bevat.

Dit is ook moontlik om dinge soos **outomatiese SQL-opdaterings**, **outomatiese rugsteun**, **Entra ID-verifikasie** en die meeste van die kenmerke van die ander SQL-dienste te konfigureer.

## Enumerasie

{{#tabs}}
{{#tab name="az cli"}}
```bash
# 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"

```
{{#endtab}}

{{#tab name="Az PowerShell"}}
```bash
# 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}}

Boonop, as jy die Dinamiese Gegevensmaskering en Ryvlakbeleide binne die databasis wil opnoem, kan jy die volgende navraag doen:
```sql
--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;

```
### Verbind en voer SQL-navrae uit

Jy kan 'n verbindsstring (wat geloofsbriewe bevat) vind van voorbeeld [enumerating an Az WebApp](az-app-services.md):
```bash
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;'
```
U kan ook sqlcmd gebruik om toegang tot die databasis te verkry. Dit is belangrik om te weet of die bediener openbare verbindings toelaat `az sql server show --name <server-name> --resource-group <resource-group>`, en ook of die vuurmuurreël ons IP toelaat om toegang te verkry:
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
## Verwysings

- [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/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/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/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](https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql)

## Privilege Escalation

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

## Post Exploitation

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

### Persistensie

{{#ref}}
../az-persistence/az-sql-persistence.md
{{#endref}}

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