# Az Static Web Apps

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

## Static Web Apps Basiese Inligting

Azure Static Web Apps is 'n wolkdienste vir die aanbied van **statische web apps met outomatiese CI/CD vanaf repositories soos GitHub**. Dit bied globale inhoudsaflewering, serverless agtergronde, en ingeboude HTTPS, wat dit veilig en skaalbaar maak. Tog, selfs al word die diens "statisch" genoem, beteken dit nie dat dit heeltemal veilig is nie. Risiko's sluit verkeerd geconfigureerde CORS, onvoldoende outentisering, en inhoudsmanipulasie in, wat apps aan aanvalle soos XSS en datalekke kan blootstel as dit nie behoorlik bestuur word nie.

### Ontplooiing Outentisering

> [!TIP]
> Wanneer 'n Statische App geskep word, kan jy die **ontplooiing outentigingsbeleid** tussen **Ontplooiingstoken** en **GitHub Actions werkvloei** kies.

- **Ontplooiingstoken**: 'n Token word gegenereer en gebruik om die ontplooiingsproses te outentiseer. Enigeen met **hierdie token is genoeg om 'n nuwe weergawe van die app te ontplooi**. 'n **Github Action word outomaties ontplooi** in die repo met die token in 'n geheim om 'n nuwe weergawe van die app te ontplooi elke keer as die repo opgedateer word.
- **GitHub Actions werkvloei**: In hierdie geval word 'n baie soortgelyke Github Action ook in die repo ontplooi en die **token word ook in 'n geheim gestoor**. Hierdie Github Action het egter 'n verskil, dit gebruik die **`actions/github-script@v6`** aksie om die IDToken van die repository te kry en dit te gebruik om die app te ontplooi.
- Selfs al word in albei gevalle die aksie **`Azure/static-web-apps-deploy@v1`** met 'n token in die `azure_static_web_apps_api_token` param gebruik, is 'n willekeurige token met 'n geldige formaat soos `12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345` net genoeg om die app te ontplooi aangesien die outentisering met die IDToken in die `github_id_token` param gedoen word.

### Web App Basiese Outentisering

Dit is moontlik om 'n **wagwoord te konfigureer** om toegang tot die Web App te verkry. Die webkonsol laat toe om dit te konfigureer om slegs staging omgewings of beide staging en die produksie omgewing te beskerm.

So lyk 'n wagwoord beskermde web app op die tyd van skryf:

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

Dit is moontlik om te sien **of enige wagwoord gebruik word** en watter omgewings beskerm word met:
```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"
```
However, this **won't show the password in clear text**, just something like: `"password": "**********************"`.

### Routes and Roles

Routes definieer **hoe inkomende HTTP versoeke hanteer word** binne 'n statiese webtoepassing. Geconfigureer in die **`staticwebapp.config.json`** lêer, beheer hulle URL herskrywing, herleidings, toegangbeperkings, en rolgebaseerde outorisering, wat behoorlike hulpbronhantering en sekuriteit verseker.

Some example:
```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/*"]
}
}
```
Let op hoe dit moontlik is om 'n **pad met 'n rol te beskerm**, dan sal gebruikers moet autentiseer by die app en daardie rol toegeken moet word om toegang tot die pad te verkry. Dit is ook moontlik om **uitnodigings te skep** wat spesifieke rolle aan spesifieke gebruikers toeken wat via EntraID, Facebook, GitHub, Google, Twitter aanmeld, wat nuttig kan wees om voorregte binne die app te verhoog.

> [!TIP]
> Let daarop dat dit moontlik is om die App so te konfigureer dat **veranderings aan die `staticwebapp.config.json`** lêer nie aanvaar word nie. In hierdie geval mag dit nie genoeg wees om net die lêer van Github te verander nie, maar ook om **die instelling in die App te verander**.

Die staging URL het hierdie formaat: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` soos: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`

### Snippets

Dit is moontlik om HTML-snippets binne 'n statiese web app te stoor wat binne die app gelaai sal word. Dit kan gebruik word om **kwaadwillige kode** in die app in te voeg, soos 'n **JS-kode om geloofsbriewe te steel**, 'n **keylogger**... Meer inligting in die voorregte verhoging afdeling.

### Managed Identities

Azure Static Web Apps kan gekonfigureer word om **managed identities** te gebruik, egter, soos genoem in [this FAQ](https://learn.microsoft.com/en-gb/azure/static-web-apps/faq#does-static-web-apps-support-managed-identity-) word hulle slegs ondersteun om **geheime uit Azure Key Vault vir autentisering doeleindes te onttrek, nie om toegang tot ander Azure hulpbronne te verkry nie**.

Vir meer inligting kan jy 'n Azure-gids vind oor hoe om 'n vault geheim in 'n statiese app te gebruik in 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 }}


## Voorbeelde om Web Apps te genereer

Jy kan 'n mooi voorbeeld vind om 'n web app te genereer in die volgende skakel: [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. Fork die repository https://github.com/staticwebdev/react-basic/generate na jou GitHub-rekening en noem dit `my-first-static-web-app`
2. Skep 'n Static Web App in die Azure-portaal deur die Github-toegang te konfigureer en die voorheen geforkte nuwe repository te kies
3. Skep dit, en wag 'n paar minute, en kyk na jou nuwe bladsy!

## Privilege Escalation en Post Exploitation

Alle inligting oor privilege escalation en post exploitation in Azure Static Web Apps kan in die volgende skakel gevind word:

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

## Verwysings

- [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}}
