Представь — у тебя есть валидный JWT, но только права обычного юзера. А что если одним HTTP-запросом получить админские права? Или вообще обойтись без токена там, где он нужен?
💡 Идеальные условия
▪️API с микросервисной архитектурой
▪️Kubernetes + Nginx ingress (Kong, Apache APISIX, F5 NGINX)
▪️URL вида
api.example.com/service-name/endpoint или api.example.com/customer-service, а не user.example.com или customer.example.com▪️Централизованная аутентификация/авторизация (например, JWT проверяется именно на ingress, а не каждым сервисом)
⤵️ Пошаговый гайд
1. Проверяем архитектуру — ищем Nginx в ошибках, отправив запрос к несуществующему сервису:
curl --path-as-is https://api.example.com/sdalksjdeiu1/customer-serivice/endpoint1
2. Тестируем нормализацию
../ и ..%2F:curl --path-as-is https://api.example.com/sdalksjdeiu1/../customer-serivice/endpoint1
curl --path-as-is https://api.example.com/sdalksjdeiu1/..%2F/customer-serivice/endpoint1
curl --path-as-is https://api.example.com/sdalksjdeiu1/..%252Fcustomer-serivice/endpoint1
3. Находим публичный сервис:
▪️Ищем эндпоинты без аутентификации
▪️Обычно это
/health, /status, /public-api4. Эксплуатируем:
4.1. Возьми рабочий запрос к защищенному сервису, например
/protected-service/protected?a=1 и измени на /public-service/..%2Fprotected-service/protected?a=1, но отправь его без токена.4.2. Сделайте токен недействительным и отправь запрос из п. 4.1.
4.3. Подожди и сделай токен просроченным и отправь запрос из пункта 4.1.
👉 Что важно помнить
▪️Если авторизация децентрализована (каждый сервис сам решает, пускать ли), уязвимость не сработает.
▪️Если всё централизовано и ingress ошибается в нормализации — шанс на баг есть.
🔥 Повышение привилегий
В приложении реализован централизованный контроль доступа, который проверяет, к какой группе/роли принадлежит юзер.
✨ В этой ситуации попробуй следующие шаги:
2.1. Найди эндпоинт, к которому ты не можешь получить доступ.
2.2. Возьми действительный запрос с доказательством аутентификации (например, JWT).
2.3. Отправь запрос к эндпоинту из п. 2.1, но используя path traversal, описанный ранее.
