Проверьте границу владения счетами

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Счёт магазина содержит покупки клиента, цену и платёжный адрес. Клиент должен читать свои счета или счета, к которым ему явно предоставили доступ. Знание идентификатора не даёт разрешения на чтение.

Вам разрешено тестировать синтетический Invoice Desk от имени Alex. Начните с обычного доступа, сравните общий и закрытый счета и сохраните закрытый ответ, чтобы показать нарушение границы владения. Работа заканчивается проверкой, без исправления сервера. Разрешены только предоставленные учебные объекты.

Установите свой обычный доступ

На этом шаге войдите как Alex и получите собственный счёт, прежде чем тестировать другой аккаунт.

Чтобы начать этот шаг, выберите вкладку Invoice Desk в интерфейсе лабораторной работы.

Перейдите на вкладку Invoice Desk. На схеме клиент отправляет запросы, а сервер API отвечает на них. API — интерфейс запросов приложения. Статус API: ready основан на настоящем запросе проверки состояния. Таблица описывает ожидаемые правила доступа:

ID счёта Владелец Доступ предоставлен Может ли Alex читать?
inv-104 alex Никому Да: владелец
inv-208 morgan Никому Нет: закрытый
inv-315 riley alex Да: явный общий доступ

Введите на портале имя alex и пароль shop-alex-42, выберите Sign in. Ожидайте Signed in as alex. Введите inv-104 в Invoice ID и выберите View invoice. Поле owner должно содержать alex.

Invoice Desk показывает вход Alex и просмотр его собственного счёта

Перейдите на вкладку Client Terminal. Это изолированная клиентская рабочая область /home/student/project, а не сервер. Адрес invoice-api:8000 обозначает сервер внутри учебной сети, а не публичную цель. curl отправляет HTTP-запросы из терминала. HTTP — используемый здесь протокол запросов и ответов; GET запрашивает чтение ресурса. Путь после адреса указывает ресурс. -i включает статус и заголовки ответа.

Без сессии ожидается 401 Unauthorized: требуется вход.

Перед выполнением следующей команды перейдите на вкладку Client Terminal.

curl -i http://invoice-api:8000/api/invoices/inv-104

Вход в браузере не выполняет вход для curl. Сессия — серверная запись о вошедшем пользователе; случайный cookie связывает последующие запросы с этой записью. Следующая команда отправляет объект JSON — формат с именованными полями. -H задаёт заголовок с указанием JSON, -d передаёт данные входа и выбирает POST, -c сохраняет полученный cookie в session.txt. Одинарные кавычки объединяют пробелы и двойные кавычки в один аргумент оболочки.

curl -sS -c session.txt -H 'Content-Type: application/json' -d '{"username":"alex","password":"shop-alex-42"}' http://invoice-api:8000/api/login

-sS скрывает индикатор прогресса, но показывает ошибки соединения. В account ожидается alex. -b отправляет сохранённый cookie. Проверьте пользователя сессии:

curl -sS -b session.txt http://invoice-api:8000/api/me

Запросите свой счёт:

curl -sS -b session.txt http://invoice-api:8000/api/invoices/inv-104

Прочитайте invoice_id, owner, item и total_usd: Alex купил Desk lamp за 38.00. Пустой список shared_with, [], означает, что другим доступ не предоставляли. Это нормальное поведение. Проверка использует реальный ответ сервера для Alex, полученный через терминал или портал.

Если после входа возникает 401, повторите команду входа в этом терминале и запрос с -b session.txt. Ошибка соединения означает другое: HTTP-ответ не пришёл. Проверьте адрес и API: ready.

Запросите другой счёт

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

Чтобы начать этот шаг, выберите вкладку Client Terminal в интерфейсе лабораторной работы.

Аутентификация отвечает «Кто вы?», авторизация — «Может ли этот человек читать этот счёт?». Успешный вход устанавливает только первое. Сначала скачайте законно предоставленный общий счёт. Скачивание остаётся GET-запросом; /download выбирает ответ для сохранения с теми же полями JSON.

Перед выполнением следующей команды перейдите на вкладку Client Terminal.

curl -sS -b session.txt http://invoice-api:8000/api/invoices/inv-315/download

Владелец — riley, но shared_with содержит alex. Доступ разрешён. Другой владелец сам по себе не доказывает ошибку.

Предскажите закрытый случай: inv-208 принадлежит Morgan и никому не открыт, поэтому Alex должен получить отказ, обычно 403 Forbidden. Сервис также может использовать 404 Not Found, скрывая существование закрытого объекта. Здесь 404 обозначает и неизвестный ID. 200 OK означает успешный запрос; тело показывает раскрытые данные.

-v выводит настоящий исходящий запрос и входящие заголовки, включая учебный cookie сессии. Не распространяйте этот вывод за пределами работы. Выполните:

curl -v -b session.txt http://invoice-api:8000/api/invoices/inv-208

Найдите GET /api/invoices/inv-208 и HTTP/1.0 200 OK. В теле указаны владелец morgan, пустой список общего доступа, Studio microphone и адрес 82 Cedar Lane. Сервер передал Alex закрытый объект. Вы изменили путь объекта, а не личность сессии. Предсказуемые ID упростили тест; причиной раскрытия стала отсутствующая проверка разрешений.

Перейдите на вкладку Invoice Desk, чтобы повторить оба запроса: Download invoice для inv-315 и View invoice для inv-208. Браузерный клиент сохраняет ответы скачивания в той же клиентской рабочей области. Проверка требует разрешённого скачивания общего счёта и просмотра закрытого счёта, а не файла объяснения.

Invoice Desk показывает, что Alex может просматривать закрытый счёт Morgan

Подтвердите раскрытие данных

На этом шаге сохраните настоящий закрытый файл и свяжите раскрытые данные с последствиями для бизнеса.

Чтобы начать этот шаг, выберите вкладку Client Terminal в интерфейсе лабораторной работы.

Для закрытого счёта используйте /download. -o записывает байты ответа в файл вместо вывода. Сохраните полный ответ как private-invoice.json в текущей клиентской области:

Перед выполнением следующей команды перейдите на вкладку Client Terminal.

curl -sS -b session.txt -o private-invoice.json http://invoice-api:8000/api/invoices/inv-208/download

cat выводит файл для чтения:

cat private-invoice.json

Ожидается тот же счёт Morgan: invoice_id inv-208, владелец morgan, сумма 129.00 и платёжный адрес. Если вы сохранили ошибку 401 или общий счёт, при необходимости войдите снова и скачайте заданный закрытый счёт; -o заменяет файл.

Другой вариант — перейти на вкладку Invoice Desk. Войдя как Alex, введите inv-208 и выберите Download invoice. Браузерный клиент передаёт настоящий запрос API и сохраняет неизменённый ответ в /home/student/project/private-invoice.json. Прочитать файл можно, вернувшись на вкладку Client Terminal. Оба способа дают один и тот же результат.

Запустите проверку. Она сравнивает сохранённые байты с заданным счётом и проверяет серверную запись скачивания под сессией Alex. Скопированное утверждение, выдуманный счёт, разрешённый общий счёт или файл без соответствующего скачивания клиента не подтверждают результат.

Практическое последствие — раскрытие покупок и платёжного адреса другого клиента. Сервер должен проверять владельца или явный общий доступ для каждого запрошенного объекта, включая скачивания. Скрытые ссылки и трудноподбираемые ID не заменяют эту проверку. Это проблема авторизации объектов, описанная в OWASP BOLA. Разрешённый тест завершён; исправление сервера остаётся отдельной задачей.

Резюме

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