D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0

Окес (◑‿◐). Итак, вы нашли в веб-приложении функцию, извлекающую внешние ресурсы. Вы можете извлекать контент со всех видов внешних сайтов, и нет никаких ограничений на тип файла, который вы можете запросить ...Наконец, вы понимаете, что настало время для SSRF! Вы начинаете вводить магические цифры: 127.0.0.1 (=localhost). Но через секунду сервер выдаёт неожиданный ответ:
Код: Скопировать в буфер обмена
Код:
Error. Requests to this address are not allowed. Please try again.
Перевод: Ошибка. Запросы на этот адрес не допускаются. Пожалуйста, попробуйте еще раз.
Ну, фрак. (Шутеечка от автора)
(Если вы не знакомы с SSRF или нуждаетесь в переподготовке, вот первая (https://medium.com/@vickieli/intro-to-ssrf-f0a55c754f5a) и вторая (https://medium.com/@vickieli/exploiting-ssrfs-b3a29dd7437) часть серии о SSRF.)
Механизмы защиты SSRF
Компании действительно осознали риск атак SSRF. В результате большинство внедрило некоторую форму защиты SSRF в своих веб-приложениях. Существуют два основных типа механизмов защиты SSRF: черные и белые списки.
Черные списки относятся к запрещённой практике для определенных адресов и приводит к блокировки запроса, если черный список был получен в качестве входных данных.
Белые списки означают, что сервер будет разрешать только те запросы, которые содержат URL-адреса в заранее заданном списке, и будет отклонять все остальные запросы.
Обход белых списков
Белые списки, как правило, труднее обойти, потому что они по умолчанию более защищены, чем черные списки. Но это возможно, если в доменах из белого списка есть уязвимость открытого перенаправления (Open Redirect).
Если вы можете найти открытое перенаправление, вы можете запросить URL-адрес из белого списка, который перенаправляет вас на внутренний URL-адрес.
Если белый список не реализован правильно (например, с помощью плохо сконструированного регулярного выражения), его также можно обойти, используя субдомен или каталог в качестве доменного имени в белом списке (например ,tims.com.attacker.com или attacker.com/victim. com).

Обход чёрных списков
Если вы столкнулись с черным списком, существует множество способов обмана сервера:
Обман с перенаправлением
Заставьте сервер запросить URL-адрес, которым вы управляете, который перенаправляет на черный список. Например, вы можете разместить файл со следующим содержимым на вашем веб-сервере:
Код: Скопировать в буфер обмена
<?php header(“location: http://127.0.0.1"); ?>
Допустим, этот файл размещен по адресу http://attacker.com/redirect.php. Таким образом, когда вы делаете запрос целевого сервера http://attacker.com/redirect.php, целевой сервер фактически перенаправляется на http://127.0.0.1 внутренний адрес с ограниченным доступом.
Измените запись A / AAAA для домена, которым вы управляете, и сделайте так, чтобы он указывал на внутренние адреса сети жертвы. Например, скажем, http://attacker.com - это ваш поддомен. Вы можете создать собственное сопоставление имени хоста с IP-адресом и разрешить http://subdomain.attacker.com использование 127.0.0.1. Теперь, когда целевой сервер запрашивает http://attacker.com, он подумает, что ваш домен расположен по адресу 127.0.0.1, и запросит данные с этого адреса!
Использование адресов IPv6
Попробуйте использовать адреса IPv6 вместо IPv4. Механизмы защиты, реализованные для IPv4, возможно, они не были реализованы для IPv6.
Переключение кодировки
Существует много разных способов кодирования URL-адреса или адреса, который не изменяет способ интерпретации сервером своего местоположения, но могут позволить ему ускользнуть из-под контроля черного списка. К ним относятся шестнадцатеричное (hex), восьмеричное (octal), двойное (dword) кодирование, URL-кодирование и смешанное кодирование.
Шестнадцатеричное кодирование
Шестнадцатеричное кодирование - это способ представления символов в формате base 16 (символы в диапазоне от 0 до F), а не в base 10 (десятичное, символы в диапазоне от 0 до 9). Оказывается, что серверы могут понимать IP-адреса, когда они в шестнадцатеричном коде. Чтобы преобразовать десятичный форматированный IP-адрес в шестнадцатеричный, вам необходимо рассчитать каждый раздел IP-адреса в его шестнадцатеричный эквивалент. (Или, может быть, просто используйте калькулятор ...) Вот пример:
Код: Скопировать в буфер обмена
27.0.0.1 translates to 0x7f.0x0.0x0.0x1
«0x» в начале каждого раздела обозначает его как шестнадцатеричное число.
Восьмеричное кодирование
Восьмеричное кодирование - это способ представления символов в формате base 8. Аналогично тому, как вы переводите адрес в шестнадцатеричный формат, вы переводите IP-адрес в восьмеричную форму, пересчитывая каждый раздел IP-адреса. Например:
Код: Скопировать в буфер обмена
127.0.0.1 translates to 0177.0.0.01
В этом случае ведущие нули необходимы, чтобы передать, что этот раздел является восьмеричным числом.
Кодировка DWord
«Dword» означает «двойное число», которое представляет собой 32-разрядное целое число. IP-адрес - это в основном 32-битное число, разделенное на четыре Октала (Восьмеричных числа) (группы по восемь битов) и записанное в десятичном формате. Например, 127.0.0.1 на самом деле является десятичным представлением 01111111.00000000.00000000.00000001. И когда мы переводим все число (01111111000000000000000000000001) в одно десятичное число, мы получаем IP-адрес в формате dword!
Так что же такое 127.0.0.1 в dword? Это ответ для 127 * 256³ + 0 * 256² + 0 * 256¹ + 1 * 256⁰, получилось 2130706433. (Используйте обычный калькулятор! Или просто используйте конверт чисел.) Это означает, что если вы введете http: / / 2130706433 вместо http://127.0.0.1 , то ответ останется прежним! Довольно круто, верно?
Кодировка URL
Каждый отдельный символ в URL-адресе может быть представлен своим назначенным шестнадцатеричным номером, если ему предшествует символ%. Например, слово «localhost» может быть представлено его эквивалентом в кодировке URL, «% 6c% 6f% 63% 61% 6c% 68% 6f% 73% 74». Поэтому, когда сервер блокирует запросы ко внутренним именам хостов, таким как «localhost», попробуйте использовать его закодировнный URL-адрес!
Смешанное кодирование
Время смешивать и сочетать ( ͡° ͜ʖ ͡°) ! Вы также можете использовать комбинацию методов кодирования, чтобы попытаться обмануть сервер: возможно, это сработает?
Код: Скопировать в буфер обмена
127.0.0.1 translates to 0177.0.0.0x1
Заключение
Это лишь небольшая часть обходных путей, которые злоумышленник может иметь в своем арсенале, и я уверен, что существует гораздо больше творческих способов победить защиту и добиться выполнения SSRF.
Счастливого взлома!
В следующий раз мы поговорим о некоторых интересных случаях c SSRF.
Это Пакет, спасибо за прочтения данного перевода, удачи и пока!
neopaket
Оригинальная статья: https://medium.com/@vickieli/bypassing-ssrf-protection-e111ae70727b