Введение
Счёт магазина содержит покупки клиента, цену и платёжный адрес. Клиент должен читать свои счета или счета, к которым ему явно предоставили доступ. Знание идентификатора не даёт разрешения на чтение.
Вам разрешено тестировать синтетический 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.

Перейдите на вкладку 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. Браузерный клиент сохраняет ответы скачивания в той же клиентской рабочей области. Проверка требует разрешённого скачивания общего счёта и просмотра закрытого счёта, а не файла объяснения.

Подтвердите раскрытие данных
На этом шаге сохраните настоящий закрытый файл и свяжите раскрытые данные с последствиями для бизнеса.
Чтобы начать этот шаг, выберите вкладку 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. Разрешённый тест завершён; исправление сервера остаётся отдельной задачей.
Резюме
Вы создали клиентскую сессию, прочитали свой счёт, отличили явный общий доступ от закрытого и сохранили настоящий ответ между аккаунтами. Вы проверили раскрытые данные и получившую их личность без доступа к серверу и без учётных данных пострадавшего.



