<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://course.secsem.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D0%B5%D0%B1-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C%2F%D0%90%D1%82%D0%B0%D0%BA%D0%B8_SSRF</id>
	<title>Веб-безопасность/Атаки SSRF - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://course.secsem.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D0%B5%D0%B1-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C%2F%D0%90%D1%82%D0%B0%D0%BA%D0%B8_SSRF"/>
	<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B5%D0%B1-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C/%D0%90%D1%82%D0%B0%D0%BA%D0%B8_SSRF&amp;action=history"/>
	<updated>2026-05-21T16:05:28Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://course.secsem.ru/w/index.php?title=%D0%92%D0%B5%D0%B1-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C/%D0%90%D1%82%D0%B0%D0%BA%D0%B8_SSRF&amp;diff=332&amp;oldid=prev</id>
		<title>Lgeek19: Новая страница: «=Микросервисная архитектура= Архитектурный стиль микросервисов — это подход, при котор…»</title>
		<link rel="alternate" type="text/html" href="https://course.secsem.ru/w/index.php?title=%D0%92%D0%B5%D0%B1-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C/%D0%90%D1%82%D0%B0%D0%BA%D0%B8_SSRF&amp;diff=332&amp;oldid=prev"/>
		<updated>2020-10-27T09:44:15Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «=Микросервисная архитектура= Архитектурный стиль микросервисов — это подход, при котор…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Микросервисная архитектура=&lt;br /&gt;
Архитектурный стиль микросервисов — это подход, при котором единое приложение строится как набор небольших сервисов, каждый из которых работает в собственном процессе и коммуницирует с остальными используя легковесные механизмы, как правило HTTP. Сами по себе эти сервисы могут быть написаны на разных языках и использовать разные технологии хранения данных. Такой подход противопоставляется монолитному стилю, при котором вся логика по обработке запросов выполняется в единственном процессе.&lt;br /&gt;
[[Файл:Mono-micro.png]]&lt;br /&gt;
&lt;br /&gt;
При построении приложения с микросервисной архитектурой недостаточно установить защиту только на входе.&lt;br /&gt;
[[Файл:Micro-1.png|500px]]&lt;br /&gt;
[[Файл:Micro-2.png|500px]]&lt;br /&gt;
&lt;br /&gt;
При разработке ставятся следующие задачи:&lt;br /&gt;
* взаимная аутентификация микросервисов;&lt;br /&gt;
* авторизация запросов к микросервисам;&lt;br /&gt;
* защищенный транспорт.&lt;br /&gt;
&lt;br /&gt;
==Аутентификация и авторизация==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Аутентификация&amp;#039;&amp;#039;&amp;#039; - процедура проверки подлинности пользователя.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Авторизация&amp;#039;&amp;#039;&amp;#039; - процедура проверки наличия прав на действие.&lt;br /&gt;
&lt;br /&gt;
=Схемы=&lt;br /&gt;
&lt;br /&gt;
Существует следующая традиционная схема URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;схема&amp;gt;:[//[&amp;lt;логин&amp;gt;[:&amp;lt;пароль&amp;gt;]@]&amp;lt;хост&amp;gt;[:&amp;lt;порт&amp;gt;]][/&amp;lt;URL‐путь&amp;gt;][?&amp;lt;параметры&amp;gt;][#&amp;lt;якорь&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этой записи:&lt;br /&gt;
* схема - схема обращения к ресурсу; в большинстве случаев имеется в виду сетевой протокол;&lt;br /&gt;
* логин - имя пользователя, используемое для доступа к ресурсу;&lt;br /&gt;
* пароль - пароль указанного пользователя;&lt;br /&gt;
* хост - полностью прописанное доменное имя хоста в системе DNS или IP-адрес хоста;&lt;br /&gt;
* порт - порт хоста для подключения;&lt;br /&gt;
* URL-путь - уточняющая информация о месте нахождения ресурса; зависит от протокола;&lt;br /&gt;
* параметры - строка запроса с передаваемыми на сервер (методом GET) параметрами. Начинается с символа ?, разделитель параметров — знак &amp;amp;;&lt;br /&gt;
* якорь - строка, которая относится к ресурсу, который подчинен другому первичному ресурсу; пример: https://course.secsem.ru/wiki/Веб-безопасность/Введение_в_веб-технологии#Ip.&lt;br /&gt;
&lt;br /&gt;
Кроме стандартной схемы HTTP/HTTPS существуют следующие стандартные протоколы.&lt;br /&gt;
* схема GOPHER - сетевой протокол распределённого поиска и передачи документов;&lt;br /&gt;
* схема TFTP - используется главным образом для первоначальной загрузки бездисковых рабочих станций (ПК без несъёмных средств для долговременного хранения);&lt;br /&gt;
* схема File - потенциальное обращение к диску;&lt;br /&gt;
* схема FTP, SFTP, LDAP и т.д.&lt;br /&gt;
&lt;br /&gt;
=SSRF=&lt;br /&gt;
Атака SSRF - Server Side Request Forgery - возможна в случае наличия уязвимости ПО, позволяющей злоумышленнику спровоцировать сервер на отправку запроса на произвольный адрес.&lt;br /&gt;
Рассмотрим веб-чат, который позволяет прикреплять к сообщениям картинки-карточки, добавляя ее URL. Причем карточки формируются на бекенде.&lt;br /&gt;
Предполагается, что при загрузке карточки приложение будет обращаться по указанному URL и формировать карточку.&lt;br /&gt;
[[Файл:Chat-1.png|700px]]&lt;br /&gt;
&lt;br /&gt;
Но злоумышленник может предоставить в качестве URL картинки некий внутренний адрес, таким образом получив несанкционированный доступ к сканированию внутренней сети компании и отправке HTTP-запросов во внутреннюю сеть (где микросервисная архитектура).&lt;br /&gt;
[[Файл:Chat-2.png|700px]]&lt;br /&gt;
&lt;br /&gt;
==Payloads==&lt;br /&gt;
Рассмотрим некоторые полезные нагрузки которые могут быть использованы при SSRF.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;произвольные HTTP GET запросы с отображением ответа&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** localhost;&lt;br /&gt;
** внутренние ресурсы:&lt;br /&gt;
*** Gitlab;&lt;br /&gt;
*** Redmine;&lt;br /&gt;
*** Jenkins и т.п.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;произвольные HTTP GET запросы «слепой случай»&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** код ошибки;&lt;br /&gt;
** время отклика.&lt;br /&gt;
* если удастся перехватить запрос, то в нем могут быть полезны&lt;br /&gt;
** user-agent - стек технологий;&lt;br /&gt;
** дополнительные заголовки при взаимодействии микросервисов;&lt;br /&gt;
** cookie или JW token - при большом везении.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;прочее&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** MySQL (Port-3306);&lt;br /&gt;
** FastCGI(Port-9000);&lt;br /&gt;
** WSGI (Port-9000);&lt;br /&gt;
** Memcached (Port-11211);&lt;br /&gt;
** Redis (Port-6379);&lt;br /&gt;
** Zabbix (Port-10050);&lt;br /&gt;
** SMTP (Port-25)&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
Рассмотрим приложение, код которого расположен ниже.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Check if the &amp;#039;url&amp;#039; GET variable is set&lt;br /&gt;
* Example - http://localhost/?url=http://testphp.vulnweb.com/images/logo.gif&lt;br /&gt;
*/&lt;br /&gt;
if (isset($_GET[&amp;#039;url&amp;#039;])){&lt;br /&gt;
$url = $_GET[&amp;#039;url&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Send a request vulnerable to SSRF since&lt;br /&gt;
* no validation is being done on $url&lt;br /&gt;
* before sending the request&lt;br /&gt;
*/&lt;br /&gt;
$image = fopen($url, &amp;#039;rb&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Send the correct response headers&lt;br /&gt;
*/&lt;br /&gt;
header(&amp;quot;Content-Type: image/png&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Dump the contents of the image&lt;br /&gt;
*/&lt;br /&gt;
fpassthru($image);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Злоумышленник имеет полный контроль над параметром URL, он может делать произвольные запросы к любому веб-сайту и к ресурсам на сервере. Рассмотрим несколько примеров запросов.&lt;br /&gt;
Запрос к Apache HTTP Servers жертвы.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /?url=http://localhost/server-status HTTP/1.1&lt;br /&gt;
Host: example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Атакующий может получить доступ к внутренним сервисам, например матаданным экземпляра облачной службы.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /?url=http://169.254.169.254/latest/meta-data/ HTTP/1.1&lt;br /&gt;
Host: example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Кроме того атакующий может обратиться к нестандартной схеме.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /?url=file:///etc/passwd HTTP/1.1&lt;br /&gt;
Host: example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
При использовании приложением curl, то атакующий может использовать схему URL dict: // для отправки запросов любому хосту на любом порту и отправки пользовательских данных.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET /?url=dict://localhost:11211/stat HTTP/1.1&lt;br /&gt;
Host: example.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Обход фильтрации==&lt;br /&gt;
В качестве простых средств защиты можно проверять схему в ссылке и работать только с HTTP/HTTPS и также проверять адрес в ссылке и блокировать запросы на внутренние подсети (192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 127.0.0.0/8...) Но этого недостаточно, есть различные способы обхода подобной фильтрации.&lt;br /&gt;
===Собственные DNS записи===&lt;br /&gt;
Возможно создавать собственные DNS записи, указывающие на локальные адреса.&lt;br /&gt;
[[Файл:Localtest.png]]&lt;br /&gt;
===DNS rebinding===&lt;br /&gt;
Основная идея DNS rebinding - обмануть SOP. Алгоритм:&lt;br /&gt;
# регистрация домена (attacker.com) + контроль над DNS-сервером&lt;br /&gt;
## ответы имеют короткое время жизни&lt;br /&gt;
## предотвращение кэширования&lt;br /&gt;
# жертва переходит на вредоносный домен&lt;br /&gt;
## DNS-сервер возвращает настоящий IP сервера с вредоносным кодом (JS)&lt;br /&gt;
# вредоносный скрипт исполняется&lt;br /&gt;
# новый запрос DNS для данного домена&lt;br /&gt;
## ответ: attacker.com находится на новом IP (напр. внутренний)&lt;br /&gt;
# получен доступ к внутренней структуре (SOP)&lt;br /&gt;
===Перенаправление===&lt;br /&gt;
Создание внешнего ресурса, цель которого - перенаправить на внутренний ресурс. Возможно изменение схемы. &lt;br /&gt;
Запрос:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://hackers-normal-site.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ответ:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HTTP/1.1 302 Found&lt;br /&gt;
Date: Fri, 24 Aug 2018 12:15:36 GMT&lt;br /&gt;
Location:&lt;br /&gt;
http://169.254.169.254/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Альтернативные представления===&lt;br /&gt;
* многие библиотеки поддерживают сокращения: 127.0.0.1 и 127.1 для них – одно и то же;&lt;br /&gt;
* многие библиотеки поддерживают отличные от десятичного представления октетов: 127.0.0.1 и 0177.1 для них – одно и то же;&lt;br /&gt;
* многие библиотеки поддерживают смешанные представления октетов: 127.127.0.1 и 0x7f.0177.1 для них – одно и то же;&lt;br /&gt;
* например, для cURL нет разницы между 127.0.0.1 и 127.1, и 0177.1, и 0x7f.1, и 2130706433.&lt;br /&gt;
===IPv6===&lt;br /&gt;
Не стоит забывать про Ipv6. Возможно он поддерживается и тогда&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
127.0.0.1 == 0:0:0:0:0:0:0:1 == [::1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Неоднозначные URL===&lt;br /&gt;
Использование разных стеков технологий может привести к разночтению URL защитой и бекендом.&lt;br /&gt;
[[Файл:Ambiguous-URL.png]]&lt;br /&gt;
==Защита==&lt;br /&gt;
Для уменьшения опасности SSRF стоит:&lt;br /&gt;
* ограничить доступ к внутренней инфраструктуре для потенциально подверженных SSRF серверов:&lt;br /&gt;
** ввести межсервисную аутентификацию;&lt;br /&gt;
** использовать внешний прокси;&lt;br /&gt;
* ограничить поддерживаемые схемы;&lt;br /&gt;
* отключить поддержку перенаправлений или проверять каждый шаг;&lt;br /&gt;
* валидировать доменные имена;&lt;br /&gt;
* разобраться как используемая библиотека обрабатывает адреса.&lt;br /&gt;
=Ссылки=&lt;br /&gt;
* [https://drive.google.com/file/d/1FrWf8Penp85zmGdOSq7H3m_nqgd9L_zB/view?usp=sharing Презентация]&lt;br /&gt;
* [https://yadi.sk/d/o4cFtxls-WlUAw?w=1 Видео]&lt;br /&gt;
* [https://docs.google.com/document/d/1v1TkWZtrhzRLy0bYXBcdLUedXGb9njTNIJXa3u9akHM/edit SSRF Bible]&lt;/div&gt;</summary>
		<author><name>Lgeek19</name></author>
	</entry>
</feed>