# Az - Static Web Apps

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

## Informations de base sur les applications Web statiques

Azure Static Web Apps est un service cloud pour héberger **des applications web statiques avec CI/CD automatique à partir de dépôts comme GitHub**. Il offre une distribution de contenu mondiale, des backends sans serveur et HTTPS intégré, ce qui le rend sécurisé et évolutif. Cependant, même si le service est appelé "statique", cela ne signifie pas qu'il est complètement sûr. Les risques incluent des CORS mal configurés, une authentification insuffisante et une altération du contenu, ce qui peut exposer les applications à des attaques comme XSS et des fuites de données si elles ne sont pas correctement gérées.

### Authentification de déploiement

> [!TIP]
> Lorsqu'une application statique est créée, vous pouvez choisir la **politique d'autorisation de déploiement** entre **jeton de déploiement** et **workflow GitHub Actions**.

- **Jeton de déploiement** : Un jeton est généré et utilisé pour authentifier le processus de déploiement. Quiconque avec **ce jeton suffit pour déployer une nouvelle version de l'application**. Une **action GitHub est déployée automatiquement** dans le dépôt avec le jeton dans un secret pour déployer une nouvelle version de l'application chaque fois que le dépôt est mis à jour.
- **Workflow GitHub Actions** : Dans ce cas, une action GitHub très similaire est également déployée dans le dépôt et le **jeton est également stocké dans un secret**. Cependant, cette action GitHub a une différence, elle utilise l'action **`actions/github-script@v6`** pour obtenir l'IDToken du dépôt et l'utiliser pour déployer l'application.
- Même si dans les deux cas l'action **`Azure/static-web-apps-deploy@v1`** est utilisée avec un jeton dans le paramètre `azure_static_web_apps_api_token`, dans ce second cas, un jeton aléatoire avec un format valide comme `12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345` suffit pour déployer l'application car l'autorisation est effectuée avec l'IDToken dans le paramètre `github_id_token`.

### Authentification de base de l'application Web

Il est possible de **configurer un mot de passe** pour accéder à l'application Web. La console web permet de le configurer pour protéger uniquement les environnements de staging ou à la fois les environnements de staging et de production.

Voici à quoi ressemble une application web protégée par mot de passe au moment de la rédaction :

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

Il est possible de voir **si un mot de passe est utilisé** et quels environnements sont protégés avec :
```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"
```
Cependant, cela **ne montrera pas le mot de passe en texte clair**, juste quelque chose comme : `"password": "**********************"`.

### Routes & Rôles

Les routes définissent **comment les requêtes HTTP entrantes sont traitées** au sein d'une application web statique. Configurées dans le fichier **`staticwebapp.config.json`**, elles contrôlent la réécriture d'URL, les redirections, les restrictions d'accès et l'autorisation basée sur les rôles, garantissant un traitement approprié des ressources et la sécurité.

Quelques exemples :
```json
{
"routes": [
{
"route": "/",
"rewrite": "/index.html"
},
{
"route": "/about",
"rewrite": "/about.html"
},
{
"route": "/api/*",
"allowedRoles": ["authenticated"]
},
{
"route": "/admin",
"redirect": "/login",
"statusCode": 302
}
],
"navigationFallback": {
"rewrite": "/index.html",
"exclude": ["/api/*", "/assets/*"]
}
}
```
Notez qu'il est possible de **protéger un chemin avec un rôle**, alors, les utilisateurs devront s'authentifier à l'application et se voir attribuer ce rôle pour accéder au chemin. Il est également possible de **créer des invitations** accordant des rôles spécifiques à des utilisateurs spécifiques se connectant via EntraID, Facebook, GitHub, Google, Twitter, ce qui peut être utile pour élever les privilèges au sein de l'application.

> [!TIP]
> Notez qu'il est possible de configurer l'application de sorte que **les modifications du fichier `staticwebapp.config.json`** ne soient pas acceptées. Dans ce cas, il peut ne pas suffire de simplement modifier le fichier depuis Github, mais aussi de **changer le paramètre dans l'application**.

L'URL de staging a ce format : `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` comme : `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`

### Identités gérées

Azure Static Web Apps peut être configuré pour utiliser **des identités gérées**, cependant, comme mentionné dans [cette FAQ](https://learn.microsoft.com/en-gb/azure/static-web-apps/faq#does-static-web-apps-support-managed-identity-), elles ne sont prises en charge que pour **extraire des secrets d'Azure Key Vault à des fins d'authentification, pas pour accéder à d'autres ressources Azure**.

Pour plus d'informations, vous pouvez trouver un guide Azure sur l'utilisation d'un secret de coffre dans une application statique à https://learn.microsoft.com/en-us/azure/static-web-apps/key-vault-secrets.

## Énumération

{% tabs %}
{% tab title="az cli" %}
{% code overflow="wrap" %}
```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 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>
```
{% endcode %}
{% endtab %}

{% tab title="Az PowerShell" %}
{% code overflow="wrap" %}
```powershell
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>

```
{% endcode %}
{% endtab %}
{% endtabs %}


## Exemples pour générer des applications Web

Vous pouvez trouver un bel exemple pour générer une application web dans le lien suivant : [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. Forkez le dépôt https://github.com/staticwebdev/react-basic/generate vers votre compte GitHub et nommez-le `my-first-static-web-app`
2. Dans le portail Azure, créez une Static Web App en configurant l'accès GitHub et en sélectionnant le nouveau dépôt forké précédemment
3. Créez-le, attendez quelques minutes et vérifiez votre nouvelle page !

## Escalade de privilèges et post-exploitation

Toutes les informations sur l'escalade de privilèges et la post-exploitation dans Azure Static Web Apps peuvent être trouvées dans le lien suivant :

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

## Références

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