Перевод статьи: s0cket7 — Open Redirect Vulnerability
Этот пост рассказывает об уязвимостях Open/Unvalidated Redirects и Forwards. Вы узнаете, что они из себя представляют, как их найти, как их использовать и как их исправить.
Перенаправление означает, что веб-сайт может перенаправить запрос ресурсов на другой URL/конечную точку. Предположим, что вы отправляете запрос на apple.com, а apple.com может перенаправить вас на другой сайт (new-apple.com), так что вы окажетесь на new-apple.com, даже если исходный запрос был сделан для apple .com. Это называется «перенаправление». Существуют различные типы перенаправлений в HTTP.
Стандартные коды статусов перенаправлений — 3xx
Перенаправление может происходить на стороне сервера (Server-Side) или на стороне клиента (Client-Side).
Server-Side: Запрос на перенаправление отправляется на сервер, затем сервер уведомляет браузер о перенаправлении на URL-адрес, указанный в ответе.
Client-Side: Браузер получает уведомление о перенаправлении на указанный URL-адрес напрямую, без вмешательства сервера.
Open redirect (Открытое перенаправление) это то, что написано в названии: Открытое (Open) перенаправление (Redirects) на любой веб-сайт.
Ну, это плохо с самого начала, подумайте об этом на мгновение, что если apple.com, ДОВЕРЕННЫЙ веб-сайт, позволяет вам перенаправить на любой другой веб-сайт. Тогда злонамеренный пользователь может просто перенаправить apple.com на attacker.com, и люди все время будут думать что они находятся на apple.com, полагая, что ему доверяют, но на самом деле это не так. Поэтому разрешать перенаправления на любой веб-сайт без проверки или без надлежащего уведомления пользователя — это плохо.
Допустим, есть «хорошо известный» веб-сайт — https://example.com/. И давайте предположим, что есть ссылка, как
https://example.com/signup?redirectUrl=https://example.com/login
Эта ссылка на страницу регистрации, после регистрации вы будете перенаправлены на https://example.com/login, который указан в URL-адресе в GET параметре redirectUrl.
Что произойдет, если мы изменим example.com/login на attacker.com?
https://example.com/signup?redirectUrl=https://attacker.com/
Посещая этот URL, если после регистрации мы будем перенаправлены на attacker.com, это означает, что у нас есть открытая уязвимость перенаправления. Это классический открытый редирект и часто используется для фишинга.
Это происходит из-за недостаточной проверки перенаправления в серверной части, что означает, что сервер неправильно проверяет, находится ли URL-адрес перенаправления в своем белом списке или нет. Вот несколько примеров уязвимого кода
<?php
$url_to_redirect = $_GET['redirect_url'];
header('Location: ' . $url_to_redirect);
die();
Здесь код php слепо захватывает URL-адрес из параметра redirect_url и перенаправляет на этот URL-адрес, используя HTTP-заголовок Location.
response.sendRedirect(request.getParameter("u"));
Здесь jsp-страница берет URL-адрес из параметра u и слепо перенаправляет его на указанный URL-адрес.
window.location.href = "https://attacker.com";
Мы можем назначить строку URL для location.href объекта window
. Это приведет к перенаправлению. Если там нет проверок, значит, это уязвимость.
<meta http-equiv="refresh" content="0;URL='http://attacker.com/'" />
Метатеги HTML могут обновлять сайт с заданным URL-адресом в качестве содержимого (content), а также вы можете указать время задержки перед обновлением.
inurl:redirectUrl=http site:target.com
target.com/?redirect_url=https://attacker.com
.target.com//attacker.com
.javascript:confirm(1)
.https://attacker%E3%80%82com
.target.com@%E2%80%AE@attacker.com
.https:attacker.com
.http:/\/\attacker.com
или https:/\attacker.com
.redirect_url=.jp
в результате перенаправляется на target.com.jp
который отличаются от target.com
.t𝐀rget.com
или 𝐀ttacker.com
(‘𝐀’ это “\uD835\uDC00”).Предположим, что целью является example.com. Он имеет страницу восстановления пароля по адресу example.com/forgot-password. Вы вводите адрес электронной почты и нажимаете кнопку «Forgot Password», и вам будет отправлено письмо со ссылкой для сброса пароля, и эта ссылка может выглядеть следующим образом
https://example.com/reset-password/some-random-token?redirect=https://example.com/login
Если мы вмешаемся в параметр redirect и изменим его на
https://example.com/reset-password/some-random-token?redirect=https://attacker.com/login
Это перенаправляет пользователя на злую страницу входа в систему, если исходная и пользователь могут быть фишинговыми.
Если вы ничего не знаете о SSRF, вы можете поискать об этом в Google. В любом случае, допустим, у нас есть цель — example.com, и вы обнаружили ошибку SSRF на https://example.com/?get-image=https://images.example.com/cat.jpg. По сути, мы хотим заставить сервер сделать запрос от нашего имени. Мы можем изменить значение параметра get-image, и сервер сделает запрос к этой конечной точке. Но в этом случае он ограничивает запросы своим собственным (под) доменом (ами), например images.example.com. Это означает, что вы можете сделать запрос на * .example.com (Любой поддомен) в качестве сервера и не можете получить доступ ни к чему вне этой области. Допустим, вы также обнаружили ошибку Open Redirect на https://test.example.com/redirect_url=https://www.example.com/, теперь вы можете связать их вместе, чтобы заставить SSRF работать для любого домена, например
Сначала мы используем уязвимость Open Redirect, изменяя параметр redirect_url
https://test.example.com/?redirect_url=https://www.attacker.com/
Затем мы можем использовать это с SSRF, добавив открытый URL-адрес Open Redirect сверху в качестве параметра get-image.
https://example.com/?get-image=https://test.example.com/?redirect_url=https://www.attacker.com/
Теперь это заставит сервер сделать запрос на один из его собственных поддоменов (test.example.com), а затем он будет перенаправлен на attacker.com, чтобы сработала ошибка SSRF.
------------- -------------------- ----------------
==> | get-image | ==> | test.example.com | ==> { REDIRECTS } ==> | attacker.com |
------------- -------------------- ----------------
Подобно этому, открытые перенаправления могут использоваться по-разному, я не могу обсуждать все их, это зависит только от вашей цели.
“Вы ограничены только вашим воображением.”
Список всех уникальных отчетов об Open Redirect Reports на HackerOne, которые я смог найти на первых 20 страницах результатов Google.
Этот список может быть не уникальным, очистите дубликаты и отсортируйте их.
Вот и все, ребята. Спасибо за чтение. Хорошего дня 🙂
– s0cket7
Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…
Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…
Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…
Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…
Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…
Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…
View Comments
C разделителем @ - это не уязвимость сайта, браузерные косяки.Смотрите спецификацию RFC 1738