# Az Static Web Apps

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

## Static Web Apps Basic Information

Azure Static Web Apps è un servizio cloud per l'hosting di **app web statiche con CI/CD automatico da repository come GitHub**. Offre distribuzione globale dei contenuti, backend serverless e HTTPS integrato, rendendolo sicuro e scalabile. Tuttavia, anche se il servizio è chiamato "statico", non significa che sia completamente sicuro. I rischi includono CORS mal configurati, autenticazione insufficiente e manomissione dei contenuti, che possono esporre le app ad attacchi come XSS e data leakage se non gestiti correttamente.

### Deployment Authentication

> [!TIP]
> Quando viene creata un'App Statica, puoi scegliere la **politica di autorizzazione per il deployment** tra **Token di deployment** e **workflow di GitHub Actions**.

- **Token di deployment**: Viene generato un token utilizzato per autenticare il processo di deployment. Chiunque con **questo token è sufficiente per distribuire una nuova versione dell'app**. Un **Github Action viene distribuito automaticamente** nel repo con il token in un segreto per distribuire una nuova versione dell'app ogni volta che il repo viene aggiornato.
- **Workflow di GitHub Actions**: In questo caso, viene distribuito anche un Github Action molto simile nel repo e il **token è anche memorizzato in un segreto**. Tuttavia, questo Github Action ha una differenza, utilizza l'azione **`actions/github-script@v6`** per ottenere l'IDToken del repository e usarlo per distribuire l'app.
- Anche se in entrambi i casi viene utilizzata l'azione **`Azure/static-web-apps-deploy@v1`** con un token nel parametro `azure_static_web_apps_api_token`, in questo secondo caso un token casuale con un formato valido come `12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345` è sufficiente per distribuire l'app poiché l'autorizzazione avviene con l'IDToken nel parametro `github_id_token`.

### Web App Basic Authentication

È possibile **configurare una password** per accedere all'App Web. La console web consente di configurarla per proteggere solo gli ambienti di staging o sia l'ambiente di staging che quello di produzione.

Questo è come appare un'app web protetta da password al momento della scrittura:

<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>

È possibile vedere **se viene utilizzata una password** e quali ambienti sono protetti con:
```bash
az rest --method GET \
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"
```
Tuttavia, questo **non mostrerà la password in chiaro**, solo qualcosa come: `"password": "**********************"`.

### Routes e Ruoli

Le route definiscono **come vengono gestite le richieste HTTP in entrata** all'interno di un'app web statica. Configurate nel file **`staticwebapp.config.json`**, controllano la riscrittura degli URL, i reindirizzamenti, le restrizioni di accesso e l'autorizzazione basata sui ruoli, garantendo una corretta gestione delle risorse e sicurezza.

Alcuni esempi:
```json
{
"routes": [
{
"route": "/",
"rewrite": "/index.html"
},
{
"route": "/about",
"rewrite": "/about.html"
},
{
"route": "/api/*",
"allowedRoles": ["authenticated"]
},
{
"route": "/admin",
"redirect": "/login",
"statusCode": 302
},
{
"route": "/google",
"redirect": "https://google.com",
"statusCode": 307
}
],
"navigationFallback": {
"rewrite": "/index.html",
"exclude": ["/api/*", "/assets/*"]
}
}
```
Nota come sia possibile **proteggere un percorso con un ruolo**, quindi, gli utenti dovranno autenticarsi nell'app e ricevere quel ruolo per accedere al percorso. È anche possibile **creare inviti** che concedono ruoli specifici a utenti specifici che accedono tramite EntraID, Facebook, GitHub, Google, Twitter, il che potrebbe essere utile per elevare i privilegi all'interno dell'app.

> [!TIP]
> Nota che è possibile configurare l'App in modo che **le modifiche al file `staticwebapp.config.json`** non vengano accettate. In questo caso, potrebbe non essere sufficiente cambiare il file da Github, ma anche **cambiare l'impostazione nell'App**.

L'URL di staging ha questo formato: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` come: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`

### Snippets

È possibile memorizzare snippet HTML all'interno di un'app web statica che verranno caricati all'interno dell'app. Questo può essere utilizzato per **iniettare codice malevolo** nell'app, come un **codice JS per rubare credenziali**, un **keylogger**... Maggiori informazioni nella sezione sull'elevazione dei privilegi.

### Managed Identities

Azure Static Web Apps può essere configurato per utilizzare **managed identities**, tuttavia, come menzionato in [questa FAQ](https://learn.microsoft.com/en-gb/azure/static-web-apps/faq#does-static-web-apps-support-managed-identity-), sono supportate solo per **estrarre segreti da Azure Key Vault per scopi di autenticazione, non per accedere ad altre risorse Azure**.

Per ulteriori informazioni, puoi trovare una guida di Azure su come utilizzare un segreto del vault in un'app statica su https://learn.microsoft.com/en-us/azure/static-web-apps/key-vault-secrets.

## Enumeration

{{#tabs }}
{{#tab name="az cli" }}
```bash
# List Static Webapps
az staticwebapp list --output table

# Get Static Webapp details
az staticwebapp show --name <name> --resource-group <res-group> --output table

# Get appsettings
az staticwebapp appsettings list --name <name>

# Get env information
az staticwebapp environment list --name <name>
az staticwebapp environment functions --name <name>

# Get API key
az staticwebapp secrets list --name <name>

# Get invited users
az staticwebapp users list --name <name>

# Get current snippets
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/trainingdemo/snippets?api-version=2022-03-01"

# Get database connections
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"

## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"

# Check connected backends
az staticwebapp backends show --name <name> --resource-group <res-group>
```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-Command -Module Az.Websites

# Retrieves details of a specific Static Web App in the specified resource group.
Get-AzStaticWebApp -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the build details for a specific Static Web App.
Get-AzStaticWebAppBuild -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the application settings for a specific build environment in a Static Web App.
Get-AzStaticWebAppBuildAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name> -EnvironmentName <EnvironmentName>

# Retrieves functions for a specific build environment in a Static Web App.
Get-AzStaticWebAppBuildFunction -ResourceGroupName <ResourceGroupName> -Name <Name> -EnvironmentName <EnvironmentName>

# Retrieves function app settings for a specific build environment in a Static Web App.
Get-AzStaticWebAppBuildFunctionAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name> -EnvironmentName <EnvironmentName>

# Retrieves the configured roles for a Static Web App.
Get-AzStaticWebAppConfiguredRole -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the custom domains configured for a Static Web App.
Get-AzStaticWebAppCustomDomain -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves details of the functions associated with a Static Web App.
Get-AzStaticWebAppFunction -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the app settings for the function app associated with a Static Web App.
Get-AzStaticWebAppFunctionAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves the secrets for a Static Web App.
Get-AzStaticWebAppSecret -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves general app settings for a Static Web App.
Get-AzStaticWebAppSetting -ResourceGroupName <ResourceGroupName> -Name <Name>

# Retrieves user details for a Static Web App with a specified authentication provider.
Get-AzStaticWebAppUser -ResourceGroupName <ResourceGroupName> -Name <Name> -AuthProvider <AuthProvider>

# Retrieves user-provided function apps associated with a Static Web App.
Get-AzStaticWebAppUserProvidedFunctionApp -ResourceGroupName <ResourceGroupName> -Name <Name>

```
{{#endtab }}
{{#endtabs }}


## Esempi per generare Web App

Puoi trovare un bel esempio per generare un'app web al seguente link: [https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github)

1. Forka il repository https://github.com/staticwebdev/react-basic/generate nel tuo account GitHub e chiamalo `my-first-static-web-app`
2. Nel portale Azure crea una Static Web App configurando l'accesso a GitHub e selezionando il nuovo repository forkato
3. Crealo, aspetta qualche minuto e controlla la tua nuova pagina!

## Escalation dei privilegi e Post Exploitation

Tutte le informazioni sull'escalation dei privilegi e sul post exploitation in Azure Static Web Apps possono essere trovate al seguente link:

{{#ref}}
../az-privilege-escalation/az-static-web-apps-privesc.md
{{#endref}}

## Riferimenti

- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)

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