Перейти к содержимому
Guide

Топ-10 безопасности OWASP API: контрольный список с исправлениями

| 12 min read

Ознакомьтесь со всеми 10 рисками безопасности OWASP API (выпуск 2023 г.) с реальными сценариями атак, конкретными исправлениями и контрольным списком копирования для проверки безопасности.

Cybersecurity command center with multiple monitoring screens
Photo by Adi Goldstein on Unsplash

Ваш API обслуживает 10 000 запросов в час. Три из этих запросов исходят от злоумышленника, который меняет а order_id параметр и загружает каждую запись о клиенте в вашу базу данных. Вы находите когда это сделают ваши пользователи, в Твиттере.

В списке OWASP API Security Top 10 (издание 2023 г.) перечислены десять рисков, ответственных за большинство Нарушения API. В этом руководстве каждый риск рассматривается с объяснением в один абзац и реалистичной атакой. сценарий и конкретное решение. Если конечная точка API botoi помогает обнаружить или предотвратить риск, соответствующая конечная точка включена в рабочий curl команда.

API1:2023 Неисправная авторизация на уровне объекта (BOLA)

BOLA возникает, когда API возвращает данные на основе идентификатора объекта, не проверяя, является ли запрашивающий пользователь владеет этим объектом. Злоумышленник звонит GET /api/orders/1001, получает данные, затем выполняет итерацию через 1002, 1003, и так далее. Теперь каждая запись в таблице доступна. BOLA занимает первое место среди рисков API с момента составления первого списка безопасности API OWASP в 2019 году.

Сценарий атаки: Приложение для доставки еды раскрывает GET /api/orders/:id. Злоумышленник пишет цикл от 1 до 100 000 и загружает каждый заказ, включая адреса доставки. номера телефонов и реквизиты способа оплаты.

Вот уязвимый код:

// Vulnerable: no ownership check
app.get("/api/orders/:id", async (req, res) => {
  const order = await db.orders.findById(req.params.id);
  res.json(order); // Any user can read any order
});

И вот исправление:

// Fixed: verify the requesting user owns the resource
app.get("/api/orders/:id", async (req, res) => {
  const order = await db.orders.findById(req.params.id);

  if (!order) return res.status(404).json({ error: "Not found" });
  if (order.userId !== req.user.id) {
    return res.status(403).json({ error: "Forbidden" });
  }

  res.json(order);
});

Каждая конечная точка, которая принимает идентификатор от клиента, нуждается в проверке владения. Никаких исключений. Использование промежуточное программное обеспечение или фильтр запросов (например, WHERE user_id = ?), чтобы обеспечить это на уровне данных.

API2:2023 Сломанная аутентификация

Нарушенная аутентификация включает создание слабых токенов, отсутствие проверки токенов, подстановку учетных данных. атаки и конечные точки, которые принимают просроченные или подделанные токены. Злоумышленники нацелены на конечные точки входа в систему с помощью списки взломанных учетных данных или крадут токены из незащищенного хранилища.

Сценарий атаки: Злоумышленник получает список из 10 миллионов пар адресов электронной почты и паролей от нарушение данных. Они пишут сценарий, который проверяет каждую пару на соответствие вашим POST /api/login конечная точка. Ваш API не имеет ограничения на количество попыток входа в систему, поэтому злоумышленник скомпрометирует 2000 учетных записей за один раз. час.

Исправить: Принудительно ограничить скорость на конечных точках аутентификации (5 попыток в минуту на каждый IP-адрес). Требовать многофакторную аутентификацию для конфиденциальных операций. Сверьте учетные данные пользователя с известными нарушений, прежде чем разрешить создание учетной записи.

The API проверки нарушений Botoi скажет вам, есть ли адрес электронной почты фигурировал в известных утечках данных:

curl -s -X POST https://api.botoi.com/v1/breach/check \\
  -H "Content-Type: application/json" \\
  -d '{
    "email": "user@example.com"
  }'

Ответ:

{
  "success": true,
  "data": {
    "breached": true,
    "count": 3,
    "breaches": [
      { "name": "ExampleCorp", "date": "2024-01-15", "dataTypes": ["email", "password"] },
      { "name": "DataDump2023", "date": "2023-08-22", "dataTypes": ["email", "username"] },
      { "name": "LeakedDB", "date": "2022-11-03", "dataTypes": ["email", "phone"] }
    ]
  }
}

Вызов /v1/breach/check во время регистрации или сброса пароля. Если в электронном письме обнаружены нарушения, предложите пользователю выбрать более надежный и уникальный пароль и включить двухфакторную аутентификацию.

API3:2023 Авторизация на уровне свойств сломанного объекта

Этот риск сочетает в себе массовое присвоение и чрезмерное раскрытие данных. Массовое присвоение происходит, когда API привязывает поля тела запроса непосредственно к модели данных без фильтрации. Пользователь отправляет "role": "admin" в обновлении профиля и получает повышенные привилегии. Чрезмерное раскрытие данных происходит, когда API возвращает внутренние поля (идентификаторы базы данных, хешированные пароли, флаги администратора) клиенту никогда не должен видеть.

Сценарий атаки: Приложение SaaS позволяет пользователям обновлять свой профиль через PUT /api/users/:id. Бэкэнд принимает полное тело запроса и записывает его в базу данных. Злоумышленник добавляет "plan": "enterprise" по запросу и получает бесплатный доступ к премиум-функциям.

Исправить: Используйте явные списки разрешенных для полей, доступных для записи. Никогда не привязывайте необработанные данные запроса к вашему модель данных. Используйте отдельные DTO ответа, исключающие внутренние поля. Проверка каждого входящего свойства против схемы перед обработкой.

API4:2023 Неограниченное потребление ресурсов

API, которые принимают неограниченные запросы, позволяют злоумышленникам увеличить ваши счета за инфраструктуру и истощить базу данных. соединений или вызвать отказ в обслуживании. Это относится к отсутствующим ограничениям скорости и неограниченному запросу. параметры (например, ?limit=1000000), загрузки файлов без ограничения размера и конечные точки, которые запускать дорогостоящие фоновые задания.

Сценарий атаки: Конечная точка API генерирует отчеты в формате PDF. Злоумышленник отправляет 500 одновременные запросы, каждый из которых запрашивает 200-страничный отчет. Ваш рабочий пул заполняется и становится законным пользователи получают 503 ошибки в течение следующих 20 минут.

Исправить: Добавьте ограничение скорости для каждого пользователя и для каждого IP-адреса. Ограничить ограничения на нумерацию страниц на стороне сервера максимумы. Установите ограничения на размер загружаемых файлов. Используйте обработку на основе очередей для дорогостоящих операций.

// Express rate limiter per user
import rateLimit from "express-rate-limit";

const apiLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 30,             // 30 requests per minute per IP
  standardHeaders: true,
  legacyHeaders: false,
  message: { error: "Rate limit exceeded. Try again in 60 seconds." },
});

app.use("/api/", apiLimiter);

API5:2023 Неисправная авторизация на функциональном уровне

Недостатки авторизации на уровне функций позволяют обычным пользователям вызывать конечные точки администратора. Типичный образец: вызовы в админ-панель DELETE /api/admin/users/:id. Интерфейс скрывает кнопку от пользователи, не являющиеся администраторами, но сама конечная точка API не проверяет роли. Любой аутентифицированный пользователь, который обнаруживает URL-адрес, может удалять учетные записи.

Сценарий атаки: Разработчик находит /api/admin/export-all-users в пакете JavaScript. Они вызывают его со своим токеном обычного пользователя и загружают полную версию пользователя. база данных.

Исправить: Проверьте роль пользователя на уровне API для каждой конечной точки администратора. Не полагайтесь на интерфейс, чтобы скрыть функциональность. Маршруты администратора группы за промежуточным программным обеспечением, которое проверяет role === "admin" перед обработкой запроса.

API6:2023 Неограниченный доступ к конфиденциальным бизнес-потокам

Некоторые потоки API опасны в масштабе, даже если авторизован каждый отдельный запрос. Покупка предметы с ограниченным ассортиментом, создание бесплатных пробных учетных записей, отправка реферальных кодов; эти потоки сломаться при автоматизации. Бот регистрирует 10 000 бесплатных аккаунтов или покупает все билеты на флэш-распродаже. прежде чем реальный пользователь загрузит страницу.

Сценарий атаки: Реселлер кроссовок пишет бота, который звонит POST /api/checkout 500 раз за первую секунду ограниченного падения. Каждая пара продается ботам. Покупатели-люди видят «распродано» еще до завершения загрузки страницы.

Исправить: Добавляйте CAPTCHA или проверки выполнения работы в важные потоки. Отслеживать устройство отпечатки пальцев для обнаружения автоматизации. Установите ограничения на покупки для каждого пользователя. Используйте доступ на основе очередей для флэш-продажи вместо конечных точек в порядке очереди.

API7:2023 Подделка запросов на стороне сервера (SSRF)

SSRF происходит, когда API принимает URL-адрес от клиента и извлекает его на стороне сервера без проверка цели. Злоумышленник предоставляет http://169.254.169.254/latest/meta-data/ и ваш сервер возвращает учетные данные экземпляра AWS. Или они нацелены http://localhost:6379/ и взаимодействуйте с вашим экземпляром Redis.

Сценарий атаки: Интеграция веб-перехватчика позволяет пользователям указывать URL-адрес обратного вызова. Злоумышленник устанавливает обратный вызов на http://169.254.169.254/latest/meta-data/iam/security-credentials/ и получает учетные данные роли IAM вашего облачного провайдера в полезной нагрузке веб-перехватчика.

// Block internal network requests
const BLOCKED_RANGES = [
  /^10\\./, /^172\\.(1[6-9]|2\\d|3[01])\\./, /^192\\.168\\./,
  /^127\\./, /^0\\./, /^169\\.254\\./,
  /^localhost$/i, /^\\[::1\\]$/,
];

function isSafeUrl(urlString) {
  try {
    const url = new URL(urlString);
    const hostname = url.hostname;
    return !BLOCKED_RANGES.some((re) => re.test(hostname));
  } catch {
    return false;
  }
}

app.post("/api/fetch-url", async (req, res) => {
  const { url } = req.body;
  if (!isSafeUrl(url)) {
    return res.status(400).json({ error: "URL targets a blocked network range" });
  }
  // proceed with external fetch
});

Исправить: Проверьте и внесите в белый список целевые URL-адреса. Блокируйте частные диапазоны IP-адресов и облако конечные точки метаданных. Разрешите DNS перед отправкой запроса, чтобы предотвратить перепривязку DNS. Выполнить исходящий запросы из изолированного сегмента сети.

API8:2023 Неправильная конфигурация безопасности

Неправильная конфигурация — самая широкая категория риска. Он включает в себя отсутствующие ограничения CORS, подробную ошибку. сообщения, из-за которых происходит утечка трассировки стека, учетные данные по умолчанию на панелях администратора, включенные ненужные методы HTTP, TLS не применяется и отсутствуют заголовки безопасности. Любая отдельная неправильная конфигурация создает точку входа.

Сценарий атаки: API возвращает полные трассировки стека в ответах на производственные ошибки. Ан злоумышленник намеренно вызывает ошибки, читает трассировку стека, определяет версию ORM и базы данных, затем создает полезную нагрузку для внедрения на основе известных уязвимостей в этой версии.

Исправить: Удаление следов стека из производственных ответов. Настройте CORS, чтобы разрешить только ваши домены. Отключите методы HTTP, которые вы не используете. Применяйте TLS повсюду. Запустите автоматическую проверку заголовков безопасности. Очистите весь вывод HTML, чтобы предотвратить XSS.

The опубликованный API очистки HTML полоски вредоносные теги и атрибуты из HTML-кода, предоставленного пользователем:

curl -s -X POST https://api.botoi.com/v1/html-sanitize \\
  -H "Content-Type: application/json" \\
  -d '{
    "html": "<p>Hello</p><script>document.cookie</script><img onerror=alert(1) src=x>"
  }'

Ответ:

{
  "success": true,
  "data": {
    "sanitized": "<p>Hello</p><img src=\\"x\\">"
  }
}

The <script> тег и onerror атрибут удален. Безопасный HTML возвращается. Вызовите эту конечную точку перед сохранением или отображением любого HTML-кода, предоставленного пользователем.

API9:2023 Неправильное управление запасами

Старые версии API, забытые промежуточные конечные точки и недокументированные маршруты создают поверхность для атаки. не следить. Злоумышленники сканируют /v1/, /v2/, /api-dev/, и /internal/ пути. Они находят устаревшую конечную точку, в которой отсутствуют элементы управления безопасностью. вы добавили в текущую версию.

Сценарий атаки: Ваша команда отправила /v2/users с ролевым доступом контроль. Но /v1/users все еще работает в производстве без какого-либо разрешения. Злоумышленник обнаруживает путь v1 через общедоступный файл Swagger и извлекает всю таблицу пользователей.

Исправить: Поддерживайте полную инвентаризацию API. Списание старых версий; не оставляй их работает «на случай, если кто-то еще ими воспользуется». Обеспечьте каждую версию одним и тем же промежуточным программным обеспечением аутентификации. Сканировать ваша собственная инфраструктура для открытых путей на регулярной основе.

API10:2023 Небезопасное использование API

Ваш API вызывает сторонние сервисы: платежные системы, поставщики услуг электронной почты, API геокодирования. Если ты доверяйте их ответам без проверки, скомпрометированная или злонамеренная третья сторона может внедрить данные в вашу систему. Это включает в себя доверие к URL-адресам перенаправления, анализ непроверенного JSON или сохранение сторонние ответы без очистки.

Сценарий атаки: Ваше приложение получает данные компании из стороннего API-интерфейса. и хранит company_name поле прямо в вашей базе данных. API обогащения получает скомпрометирован, и злоумышленник внедряет <script> теги в названиях компаний. Каждый пользователь, который просматривает профиль компании на вашей информационной панели, выполняет сценарий.

Исправить: Проверяйте и очищайте все сторонние ответы перед сохранением или отображением. их. Используйте проверку схемы для входящих данных. Установите таймауты для внешних вызовов. Применить тот же ввод проверка сторонних данных, которые вы применяете к пользовательскому вводу.

Обнаружение раскрытия конфиденциальных данных в ответах API

Риски API1 и API3 часто приводят к тому, что конфиденциальные данные покидают ваш API. botoi API обнаружения личных данных сканирует текст на предмет Номера социального страхования, номера кредитных карт, адреса электронной почты, номера телефонов, IP-адреса и даты рождения. Запустите его в телах ответов API в интеграционных тестах, чтобы выявить случайные утечки данных перед развертыванием.

curl -s -X POST https://api.botoi.com/v1/pii/detect \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "Customer SSN is 123-45-6789 and card is 4111111111111111"
  }'

Ответ:

{
  "success": true,
  "data": {
    "found": true,
    "count": 2,
    "findings": [
      {
        "type": "ssn",
        "value": "123-45-6789",
        "start": 17,
        "end": 28,
        "masked": "***-**-6789"
      },
      {
        "type": "credit_card",
        "value": "4111111111111111",
        "start": 42,
        "end": 58,
        "masked": "************1111"
      }
    ]
  }
}

Если ваш ответ API вызывает обнаружение, ваша конечная точка возвращает данные, которые клиент не должен видеть. Исправьте запрос или DTO, чтобы исключить эти поля.

Шифрование конфиденциальных данных в состоянии покоя

Если ваш API хранит конфиденциальную конфигурацию, токены или учетные данные, зашифруйте их перед записью. в базу данных. API шифрования ботои обеспечивает шифрование AES-256-CBC:

curl -s -X POST https://api.botoi.com/v1/encrypt/encrypt \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "sensitive-api-token-abc123",
    "password": "your-secret-key"
  }'

Ответ:

{
  "success": true,
  "data": {
    "encrypted": "U2FsdGVkX1+abc...encrypted_output_here",
    "algorithm": "aes-256-cbc"
  }
}

Сохраните зашифрованный вывод. Расшифровать с помощью /v1/encrypt/decrypt только тогда, когда значение необходимо. Это ограничивает радиус взрыва, если злоумышленник получит доступ для чтения к вашей базе данных через Уязвимость BOLA или SQL-инъекции.

Контрольный список 10 лучших вопросов безопасности OWASP API

Распечатайте эту таблицу или добавьте ее в свой шаблон проверки безопасности. Проверяйте каждый элемент перед выпуском любого API.

Риск Проверять конечная точка Ботоя
API1 БЫЛ Каждая конечная точка, принимающая идентификатор объекта, проверяет право собственности.
API2 сломанная аутентификация Скорость входа ограничена; токены истекают; МИД о секретных операциях /v1/breach/check
Аутентификация свойства API3 Поля запроса внесены в разрешенный список; ответные DTO исключают внутренние компоненты /v1/pii/detect
Ограничение ресурсов API4 Ограничения скорости, ограничения на нумерацию страниц, ограничения на размер файла.
Функция аутентификации API5 Конечные точки администратора проверяют роль на уровне API, а не на внешнем интерфейсе.
Бизнес-процесс API6 CAPTCHA/proof-of-work для потоков с высокой стоимостью; ограничения на пользователя
API7 SSRF URL-адреса, предоставленные пользователем, проверены; частные диапазоны заблокированы
API8 неправильная конфигурация Никаких следов стека; CORS ограничен; HTML очищен /v1/html-sanitize
API9 инвентарь Старые версии API выведены из эксплуатации; все маршруты задокументированы
API10 Небезопасное потребление Ответы третьих сторон проверяются и обрабатываются перед хранением. /v1/html-sanitize

Куда идти дальше

Полная документация OWASP API Security Top 10 находится по адресу owasp.org/API-Security. Каждая страница риска включает методы обнаружения, примеры сценариев атак и ссылки на CWE.

Для автоматических проверок интегрируйте указанные выше конечные точки botoi в свой конвейер CI. Запустите обнаружение личных данных против приспособлений ответа API. Санировать сохраненный HTML при записи. Проверяйте электронную почту новых пользователей на предмет взлома базы данных во время регистрации. Это небольшие дополнения к вашему набору тестов, которые улавливают сканеры рисков. мисс.

FAQ

Что входит в десятку лучших по безопасности API OWASP?
Топ-10 безопасности API OWASP — это список десяти наиболее критических угроз безопасности API, поддерживаемый проектом Open Worldwide Application Security Project. Издание 2023 года охватывает нарушенную авторизацию на уровне объекта, нарушенную аутентификацию, нарушенную авторизацию на уровне свойств объекта, неограниченное потребление ресурсов, нарушенную авторизацию на уровне функций, неограниченный доступ к конфиденциальным бизнес-потокам, подделку запросов на стороне сервера, неправильную настройку безопасности, неправильное управление запасами и небезопасное использование API.
Как часто обновляется список 10 лучших по безопасности API OWASP?
OWASP выпустила первую десятку лучших API-безопасности в 2019 году и обновила ее в 2023 году. Фиксированного графика обновлений не существует. Команда проекта собирает данные об инцидентах безопасности, отчетах об ошибках и вкладах сообщества, а затем публикует новое издание, когда ландшафт угроз меняется настолько, что это оправдано.
Что такое BOLA и почему это риск API номер один?
BOLA (авторизация на уровне сломанного объекта) происходит, когда конечная точка API принимает идентификатор объекта от клиента и возвращает данные, не проверяя, что запрашивающий пользователь владеет этим объектом. Злоумышленник меняет идентификатор в запросе и получает доступ к данным другого пользователя. Он занимает первое место, потому что он широко распространен, его легко использовать и он часто раскрывает конфиденциальные записи в больших масштабах.
Могут ли автоматизированные инструменты выявить все 10 основных рисков безопасности API OWASP?
Нет. Автоматические сканеры выявляют неправильную конфигурацию (API8), отсутствие ограничений скорости (API4) и некоторые шаблоны внедрения (через API8). Но недостатки авторизации (API1, API3, API5) требуют понимания бизнес-логики, которого нет у сканеров. Для полного покрытия вам потребуется ручная проверка кода, тестирование на проникновение и проверки на уровне архитектуры.
Как определить приоритетность рисков OWASP API, которые необходимо устранить в первую очередь?
Начните с API1 (BOLA) и API2 (сломанная аутентификация), поскольку они приводят к прямой утечке данных. Затем обратитесь к API4 (неограниченное потребление ресурсов), чтобы предотвратить отказ в обслуживании. После этого проработайте оставшиеся риски, исходя из того, какие конечные точки обрабатывают наиболее конфиденциальные данные в вашем приложении.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.