mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 19:11:41 -08:00
198 lines
10 KiB
Markdown
198 lines
10 KiB
Markdown
# Az Static Web Apps
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
## Osnovne informacije o statičkim web aplikacijama
|
|
|
|
Azure Static Web Apps je cloud usluga za hostovanje **statičkih web aplikacija sa automatskim CI/CD iz repozitorijuma kao što je GitHub**. Pruža globalnu isporuku sadržaja, serverless backend, i ugrađeni HTTPS, čineći je sigurnom i skalabilnom. Međutim, čak i ako se usluga naziva "statičkom", to ne znači da je potpuno sigurna. Rizici uključuju pogrešno konfigurisane CORS, nedovoljnu autentifikaciju i manipulaciju sadržajem, što može izložiti aplikacije napadima poput XSS i curenja podataka ako se ne upravlja pravilno.
|
|
|
|
### Autentifikacija prilikom implementacije
|
|
|
|
> [!TIP]
|
|
> Kada se kreira statička aplikacija, možete odabrati **politiku autorizacije implementacije** između **tokena za implementaciju** i **GitHub Actions radnog toka**.
|
|
|
|
- **Token za implementaciju**: Token se generiše i koristi za autentifikaciju procesa implementacije. Svako ko ima **ovaj token je dovoljno da implementira novu verziju aplikacije**. **Github Action se automatski implementira** u repozitorijumu sa tokenom u tajni da bi se implementirala nova verzija aplikacije svaki put kada se repozitorijum ažurira.
|
|
- **GitHub Actions radni tok**: U ovom slučaju, vrlo sličan Github Action se takođe implementira u repozitorijumu i **token se takođe čuva u tajni**. Međutim, ovaj Github Action ima razliku, koristi **`actions/github-script@v6`** akciju da dobije IDToken repozitorijuma i koristi ga za implementaciju aplikacije.
|
|
- Čak i ako se u oba slučaja koristi akcija **`Azure/static-web-apps-deploy@v1`** sa tokenom u `azure_static_web_apps_api_token` parametru, u ovom drugom slučaju, nasumični token sa validnim formatom kao što je `12345cbb198a77a092ff885781a62a15d51ef5e3654ca11234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345` je dovoljno da se implementira aplikacija jer se autorizacija vrši sa IDToken-om u `github_id_token` parametru.
|
|
|
|
### Osnovna autentifikacija web aplikacije
|
|
|
|
Moguće je **konfigurisati lozinku** za pristup web aplikaciji. Web konzola omogućava da se konfiguriše da štiti samo staging okruženja ili i staging i produkcijsko.
|
|
|
|
Ovako izgleda web aplikacija zaštićena lozinkom u trenutku pisanja:
|
|
|
|
<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Moguće je videti **da li se koristi neka lozinka** i koja okruženja su zaštićena sa:
|
|
```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"
|
|
```
|
|
Međutim, ovo **neće prikazati lozinku u čistom tekstu**, već nešto poput: `"password": "**********************"`.
|
|
|
|
### Rute i Uloge
|
|
|
|
Rute definišu **kako se obrađuju dolazni HTTP zahtevi** unutar statičke web aplikacije. Konfigurisane u **`staticwebapp.config.json`** datoteci, kontrolišu preusmeravanje URL-a, preusmeravanja, ograničenja pristupa i autorizaciju zasnovanu na ulogama, obezbeđujući pravilno rukovanje resursima i bezbednost.
|
|
|
|
Neki primeri:
|
|
```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/*"]
|
|
}
|
|
}
|
|
```
|
|
Napomena kako je moguće **zaštititi putanju sa ulogom**, tada će korisnici morati da se autentifikuju u aplikaciju i dobiju tu ulogu da bi pristupili putanji. Takođe je moguće **napraviti pozivnice** koje dodeljuju specifične uloge specifičnim korisnicima koji se prijavljuju putem EntraID, Facebook-a, GitHub-a, Google-a, Twitter-a, što može biti korisno za eskalaciju privilegija unutar aplikacije.
|
|
|
|
> [!TIP]
|
|
> Napomena da je moguće konfigurisati aplikaciju tako da **promene u `staticwebapp.config.json`** datoteci nisu prihvaćene. U ovom slučaju, možda neće biti dovoljno samo promeniti datoteku sa GitHub-a, već i **promeniti podešavanje u aplikaciji**.
|
|
|
|
URL za testiranje ima ovaj format: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` kao: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`
|
|
|
|
### Snippets
|
|
|
|
Moguće je čuvati HTML snippete unutar statičke web aplikacije koja će biti učitana unutar aplikacije. Ovo se može koristiti za **ubacivanje malicioznog koda** u aplikaciju, kao što je **JS kod za krađu kredencijala**, **keylogger**... Više informacija u sekciji o eskalaciji privilegija.
|
|
|
|
### Managed Identities
|
|
|
|
Azure Static Web Apps mogu biti konfigurisane da koriste **managed identities**, međutim, kao što je pomenuto u [ovom FAQ](https://learn.microsoft.com/en-gb/azure/static-web-apps/faq#does-static-web-apps-support-managed-identity-), one su podržane samo za **izvlačenje tajni iz Azure Key Vault-a u svrhe autentifikacije, a ne za pristup drugim Azure resursima**.
|
|
|
|
Za više informacija možete pronaći Azure vodič o korišćenju tajne iz vault-a u statičkoj aplikaciji na 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 }}
|
|
|
|
|
|
## Primeri za generisanje Web Aplikacija
|
|
|
|
Možete pronaći lep primer za generisanje web aplikacije na sledećem linku: [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. Forkujte repozitorijum https://github.com/staticwebdev/react-basic/generate na vaš GitHub nalog i nazovite ga `my-first-static-web-app`
|
|
2. U Azure portalu kreirajte Static Web App konfigurišući pristup Github-u i birajući prethodno forkovani novi repozitorijum
|
|
3. Kreirajte ga, sačekajte nekoliko minuta i proverite vašu novu stranicu!
|
|
|
|
## Eskalacija privilegija i Post Eksploatacija
|
|
|
|
Sve informacije o eskalaciji privilegija i post eksploataciji u Azure Static Web Apps mogu se pronaći na sledećem linku:
|
|
|
|
{{#ref}}
|
|
../az-privilege-escalation/az-static-web-apps-privesc.md
|
|
{{#endref}}
|
|
|
|
## Reference
|
|
|
|
- [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}}
|