- Регистрация
- 13 Июн 2025
- Сообщения
- 6
- Реакции
- 2
- Баллы
- 3
Сегодня разберём SSRF — уязвимость, которая позволяет злоумышленнику заставить сервер делать HTTP-запросы от своего имени.Всем привет!
Что такое SSRF?
Server-Side Request Forgery — это когда злоумышленник может отправить с сервера произвольный запрос (например, к внутренней сети или облачным метаданным).
Чем опасен SSRF?
- Чтение внутренних сервисов (базы данных, Redis, Jenkins)
- Обход файервола (атака на localhost или 127.0.0.1)
- Кража данных из облачных метаданных (AWS, Google Cloud, Azure)
- Взаимодействие с уязвимыми внутренними API
Пример уязвимого кода
Допустим, есть сервис, который загружает изображение по URL:
Код:
python
from flask import Flask, request
import requests
app = Flask(__name__)
@app.route('/fetch_image')
def fetch_image():
url = request.args.get('url') # Уязвимость!
response = requests.get(url)
return response.content
Злоумышленник может передать вместо URL:
-
Код:
http://localhost/admin
-
Код:
file:///etc/passwd
-
Код:
http://169.254.169.254/latest/meta-data/
Реальные сценарии атак
1. Облачные метаданные (AWS, Azure, GCP)
В облачных сервисах есть специальные IP-адреса для управления виртуальными машинами:
- AWS:
Код:
http://169.254.169.254/latest/meta-data/
Код:
http://metadata.google.internal/computeMetadata/v1/
Код:
http://169.254.169.254/metadata/instance
Если сервер работает в облаке, злоумышленник может украсть ключи API, токены IAM и даже получить shell.
2. Атака на внутренние сервисы
Если сервер находится в корпоративной сети, можно:
- Сканировать порты (
Код:
http://internal-db:3306
- Эксплуатировать уязвимые внутренние сервисы (Redis, Jenkins, MongoDB)
- Провести RCE через уязвимые внутренние API
3. Blind SSRF (слепая атака)
Если ответ не возвращается, но запрос выполняется, можно:
- Использовать DNS-логгеры (Burp Collaborator, interact.sh)
- Запускать таймерные атаки (например,
Код:
http://internal-service:8080?delay=5000ms
Как защититься?
1. Валидация URL
- Запрещать
Код:
localhost
Код:
127.0.0.1
Код:
file://
Код:
gopher://
Код:
python
allowed_domains = ['example.com', 'trusted-cdn.net']
if not any(url.startswith(f'http://{domain}') for domain in allowed_domains):
raise ValueError("URL not allowed")
2. Использование "защищённых" HTTP-клиентов
- Python:
Код:
requests
Код:
no_proxy=True
Код:
axios
Код:
followRedirects
3. Облачные защиты
- AWS:
Код:
IMDSv2
Код:
X-aws-ec2-metadata-token
- Kubernetes: Ограничение доступа к
Код:
metadata-dns
4. WAF и сетевые ограничения
- Блокировать запросы к внутренним IP-адресам
- Использовать Cloudflare, AWS Shield
Вывод
SSRF — одна из самых недооценённых уязвимостей. Она может привести к полному компрометированию инфраструктуры, особенно в облачных средах.