---
# System prepended metadata

title: Web App Pentest - 0x0B SSRF
tags: [CSR - Web App Pentest]

---

---
title: Web App Pentest - 0x0B SSRF
tags: CSR - Web App Pentest
slideOptions:
  transition: 'fade'
  parallaxBackgroundImage: 'https://i.imgur.com/YClZ1aY.jpg'
---

<style>
.reveal {
  font-size: 36px;
}
</style>


## SSRF
## Server Side Request Forgery

---

## A10:2021-Server-Side Request Forgery

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

---

## SSRF

Реализация атаки SSRF может позволить:
* выполнять запросы на недоступные из внешней сети ресурсы
* сканировать внутреннюю сеть
* обходить проверки и ограничения

---

## SSRF

Возникает когда атакующий может передать в параметрах URL-адрес или DNS-имя + порт или другие "координаты" сервиса и уязвимое веб-приложение использует их для выполнения запроса.

---

## SSRF

<обзор docker-compose,
пример базовый, задание Simple>

---

## SSRF

<пример elasticsearch>

- `http://host:9200/_cat/indices` - список индексов
- `http://host:9200/index1/_search` - вывод данных в индексе

Документации: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html

---

## SSRF

Атакующий может отправлять запросы на ресурсы внутренней сети и анализировать ответы или время получения ответа.

<Пример Blind SSRF: Сканирование портов>

---

## SSRF - адреса
Серые IP адреса

IP:
- 192.168.X.Y
- 172.X.0.Y
- 10.X.0.X

Также нужно попробовать DNS-имена из листов.

---

## SSRF - CRLF injection

Чтобы мы могли добавлять команды в текстовые протоколы или заголовки/тело в HTTP-запросы нам нужна возможность добавлять новые строки.

---

## SSRF - CRLF injection

Если цель - HTTP, и запрос мы контролируем не полностью, то мы можем отправить два запроса в одном TCP-соединении.

HTTP-заголовок:
`Connection: keep-alive`

Если он установлен, веб-приложение не будет разрывать соединение и выполнит второй HTTP-запрос в том же соединении.
<пример с запросом на internal_web>

---

## SSRF - CRLF injection

<пример - удаление индекса в `elasticsearch`>

---



## SSRF - схемы

Возможно полезные схемы:
* file://
* data://
* php://

---

## SSRF - защита (1 идея)

Веб-приложения для защиты от обращений к внутренним ресурсам могут проверять IP-адреса передаваемых URL, убеждаться что они не локальные.

<пример>

---


## SSRF - упражнение

<Попасть в админскую секцию /admin.php через ssrf_check.php>

---


## SSRF - DNS rebinding

Веб-приложение выполняет 2 DNS запроса, один для проверки, другой для отправки запроса. Мы можем передать контролируемое доменное имя, DNS-ответы для которого будут изменяться.

---

## SSRF - DNS rebinding

http://1u.ms/ - ресурс, позволяющие реализовать такую атаку

<пример обхода ssrf_check.php - читаем internal_web>

---


## SSRF - материалы

[SSRF bible](https://cheatsheetseries.owasp.org/assets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet_SSRF_Bible.pdf)
[A New Era of SSRF (video)](https://www.youtube.com/watch?v=D1S-G8rJrEk)
[A New Era of SSRF (slides)](https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf)

---

## SSRF - Blind

SSRF называется слепым, если мы не видим ответ от сервера.

https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/

---

## SSRF - Windows

Атакующий может заставить веб-сервер перейти по ссылке по протоколу SMB или по HTTP и затребовать SMB-аутентификацию. 
В результате:
* хэш netntlm машины
* SMB-relay

---

## SSRF - Защита

- По возможности избегайте необходимости запросов по контролируемым пользователем координатам;
- Если все же программируем, то: 
    - Разберите URL на части, далее используйте только эти части
    - Разрезолвите домен, далее используйте IP, не используйте домен
    - Подставьте нужный домен в заголовок Host при запросе
    - Не забудьте отключить редиректы

---

## SSRF - Hardening

- Создайте специальный изолированный контейнер, который не будет иметь доступ во внутреннюю сеть и поднимите на нем микросервис
- Отключите ненужные вам схемы

---