WEB PENTEST / API SECURITY

API Security Pentest — GraphQL Mass Assignment + BOLA на финтеч-платформе

Полный разбор: массовое назначение атрибутов в GraphQL мутациях, BOLA (Broken Object Level Authorization) на REST эндпоинтах, обход авторизации и rate limiting. 47 эндпоинтов, CVSS 8.6, фикс за 48 часов.

47API эндпоинтов
12уязвимостей
3Critical
5High
48чTime to Fix

1. Разведка и маппинг поверхности атаки

Начало — пассивный сбор: Swagger/OpenAPI схемы через /api/docs, /graphql introspection, GitHub dorks для утечек схем. Активный фаззинг katana -u target.com -d 3 -jc выявил 47 уникальных эндпоинтов (23 REST, 24 GraphQL).

Ключевой фокус — операции изменения состояния: mutation в GraphQL, POST/PUT/PATCH/DELETE в REST. Найдено 31 мутация и 19 state-changing REST эндпоинтов.

bash
# Рекон API
katana -u https://api.target.com -d 3 -jc -o recon.json

# Фаззинг эндпоинтов с авторизованным токеном
ffuf -u https://api.target.com/FUZZ -w /wordlists/api-endpoints.txt \
  -mc 200,201,403 -H "Authorization: Bearer $TOKEN"

# GraphQL Introspection
curl -X POST https://api.target.com/graphql \
  -H "Content-Type: application/json" \
  -d '{"query":"{__schema{types{name fields{name type{name kind ofType{name}}}}}}"}'

2. GraphQL Mass Assignment (Critical)

В мутации updateUserProfile принимался объект input: UserProfileInput! без валидации разрешенных полей. Бэкенд (Prisma ORM) делал update({ where, data: input }) — массовое назначение всех переданных полей.

Добавив в запрос role: "ADMIN", isVerified: true, balance: 999999 — получили эскалацию привилегий и манипуляцию балансом.

graphql
mutation UpdateProfile($input: UserProfileInput!) {
  updateUserProfile(input: $input) {
    id
    email
    role
    isVerified
    balance
  }
}

# Variables
{
  "input": {
    "firstName": "Hacker",
    "role": "ADMIN",           # <-- Injection
    "isVerified": true,        # <-- Injection
    "balance": 999999          # <-- Injection
  }
}

Эскалация привилегий

Обычный пользователь → ADMIN через один запрос

💰

Финансовый ущерб

Манипуляция балансом, обход лимитов вывода

🔓

Обход верификации

isVerified: true без KYC/AML чеков

3. BOLA — Broken Object Level Authorization (Critical)

REST эндпоинт GET /api/v2/transactions/{id} проверял только наличие валидного JWT, но не владение ресурсом. Перебор id (UUID v4, но предсказуемый через timestamp-часть) дал доступ к чужим транзакциям: суммы, получатели, карты (masked), IP.

Аналогичная проблема в PATCH /api/v2/cards/{id} — можно было привязать чужую карту к своему аккаунту.

bash
# Перебор ID транзакций (PoC)
for i in {1..100}; do
  curl -s -H "Authorization: Bearer $VICTIM_TOKEN" \
    https://api.target.com/api/v2/transactions/$i | jq .amount
done

# Результат: 200 OK на чужих ID, полные данные карт/счетов

4. Rate Limit Bypass + Auth Confusion

Rate limiting на /auth/login и /auth/otp/send был по IP. Используя заголовки X-Forwarded-For, X-Real-IP, CF-Connecting-IP — обходили лимиты. Дополнительно: /auth/refresh принимал refresh token от любого клиента (нет привязки к device_id), позволяя угнать сессию через утечку токена в логах прокси.

5. Итоговые находки (Summary)

Mass Assignment → PrivEsc BOLA на транзакциях BOLA на картах Rate Limit Bypass (headers) Refresh Token Replay GraphQL DoS (batched queries) Excessive Data Exposure (PII в ответах) Missing Security Headers (API) Info Disclosure via GraphQL Introspection Weak CORS Policy

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

Allow-list полей в GraphQL mutations (input validation + Prisma $validate)
RBAC проверки на каждом REST эндпоинте: user.owns(resource)
Rate limit по user_id (не IP) + device fingerprint для auth эндпоинтов
Refresh token rotation + binding к device_id + revocation на подозрительной активности
GraphQL depth/cost analysis + отключение introspection в проде

Все 3 Critical и 5 High закрыты за 48 часов. Перепроверка (retest) — 0 findings. Клиент прошёл PCI DSS ASV сканирование с первого раза.

Хотите такой же аудит вашего API?

Найдём Mass Assignment, BOLA, Broken Auth, Rate Limit bypass до того, как это сделают злоумышленники.

Заказать пентест API