Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
394 changes: 394 additions & 0 deletions PentestReport.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,394 @@
# 🛡️ Этап 5 — Pentest Report

## 📊 Общее резюме

В результате выявлены **критические уязвимости уровня HIGH и CRITICAL**, позволяющие:

- выполнять произвольный JavaScript в браузере пользователя
- получать доступ к внутренней инфраструктуре
- записывать файлы на сервере вне разрешённой директории
- перегружать систему (DoS)
- получать доступ к данным без аутентификации

⚠️ Приложение **не готово к production-использованию**.

---

## 🎯 Scope

Тестирование охватывало следующие компоненты:

- REST API endpoints:
- `/register`
- `/recordSession`
- `/totalActivity`
- `/inactiveUsers`
- `/monthlyActivity`
- `/userProfile`
- `/exportReport`
- `/notify`
- Внутренние сервисы:
- `UserAnalyticsService`
- `UserStatusService`

---

## 🧱 Asset Inventory

| Актив | Тип | Ценность | Причина |
|------|-----|----------|--------|
| Пользовательские данные | Данные | HIGH | Персональные данные |
| Сессии активности | Данные | HIGH | Аналитика и поведение |
| Файловая система | Инфраструктура | CRITICAL | Возможен доступ/перезапись |
| Внутренняя сеть | Инфраструктура | CRITICAL | SSRF атаки |

---

## ⚠️ Threat Modeling (STRIDE)

| Категория | Применимость | Пример |
|----------|-------------|-------|
| Spoofing | ✅ | Нет аутентификации |
| Tampering | ✅ | Изменение данных |
| Repudiation | ⚠️ | Нет логирования |
| Information Disclosure | ✅ | Ошибки и SSRF |
| DoS | ✅ | Нет ограничений |
| Elevation of Privilege | ⚠️ | Через SSRF |

---

# 🔴 Finding #1 — Reflected XSS

| Поле | Значение |
|------|----------|
| Компонент | `/userProfile` |
| CWE | CWE-79 |
| CVSS | 6.1 MEDIUM |
| Статус | Confirmed |

**Описание:**
Параметр `userName` напрямую вставляется в HTML без экранирования.

**PoC:**

POST /register?userId=evil&userName=<script>alert(1)</script>
GET /userProfile?userId=evil


**Impact:**
- выполнение JS
- кража сессии

**Fix:**
- HTML escaping
- CSP header

Шаги воспроизведения:

1. Отправить запрос на регистрацию пользователя с вредоносным payload:
POST /register?userId=evil&userName=<script>alert(1)</script>

2. Запросить профиль пользователя:
GET /userProfile?userId=evil

3. Открыть ответ в браузере

Ожидаемый результат:
HTML должен быть экранирован, скрипт не выполняется

Фактический результат:
JavaScript выполняется (alert)

---

# 🔴 Finding #2 — Path Traversal

| Поле | Значение |
|------|----------|
| Компонент | `/exportReport` |
| CWE | CWE-22 |
| CVSS | 8.6 HIGH |

**Описание:**
Путь к файлу формируется из пользовательского ввода.

**PoC:**

../../../../etc/passwd


**Impact:**
- запись файлов
- возможный RCE

**Fix:**
- whitelist файлов
- normalize path


Шаги воспроизведения:

1. Отправить запрос:
GET /exportReport?userId=test&filename=../../../../tmp/hacked.txt

2. Проверить статус ответа

Ожидаемый результат:
Сервер возвращает ошибку (400/403), запись запрещена

Фактический результат:
Сервер возвращает 200 OK и записывает файл вне разрешённой директории

---

# 🔴 Finding #3 — SSRF

| Поле | Значение |
|------|----------|
| Компонент | `/notify` |
| CWE | CWE-918 |
| CVSS | 9.1 CRITICAL |

**Описание:**
Сервер выполняет HTTP-запрос на произвольный URL.

**PoC:**

http://169.254.169.254


**Impact:**
- доступ к metadata
- обход firewall

**Fix:**
- блок private IP
- DNS allowlist

Вариант 1 — localhost
1. Отправить запрос:
POST /notify?userId=test&callbackUrl=http://localhost:7000

2. Наблюдать ответ сервера

Ожидаемый результат:
Запрос блокируется (400/403)

Фактический результат:
Сервер выполняет HTTP-запрос к localhost

Вариант 2 — metadata endpoint
1. Отправить запрос:
POST /notify?userId=test&callbackUrl=http://169.254.169.254

2. Проверить ответ

Ожидаемый результат:
Запрос блокируется

Фактический результат:
Сервер пытается обратиться к внутреннему IP
---

# 🔴 Finding #4 — DoS

| Поле | Значение |
|------|----------|
| CWE | CWE-400 |
| CVSS | 7.5 HIGH |

**Описание:**
- нет rate limiting
- возможны тяжёлые вычисления (CPU hotspot)

**Impact:**
- перегрузка CPU
- зависание сервера

Вариант 1 — большой input
1. Сформировать userId длиной 10000 символов
2. Отправить запрос:
GET /totalActivity?userId=<очень длинная строка>

Ожидаемый результат:
Сервер возвращает 400 Bad Request

Фактический результат:
Сервер обрабатывает запрос без ограничений
Вариант 2 — flood запросов
1. Выполнить 50+ запросов подряд:
GET /totalActivity?userId=test

2. Проверить ответы

Ожидаемый результат:
Появляется ограничение (429 Too Many Requests)

Фактический результат:
Все запросы обрабатываются без ограничений

---

# 🔴 Finding #5 — Broken Validation

| Поле | Значение |
|------|----------|
| CWE | CWE-20 |

**Описание:**
Нет проверки временных интервалов.

**Impact:**
- некорректная аналитика

Шаги воспроизведения:

1. Отправить запрос:
POST /recordSession?userId=test
&loginTime=2025-01-01T10:00:00
&logoutTime=2025-01-01T09:00:00

2. Проверить статус ответа

Ожидаемый результат:
Ошибка валидации (400)

Фактический результат:
Сервер принимает некорректную сессию

---

# 🔴 Finding #6 — Null Handling

| Поле | Значение |
|------|----------|
| CWE | CWE-476 |

**Описание:**

getUserSessions(userId).getLast()


→ может вызвать NPE

Шаги воспроизведения:

1. Не создавать сессии для пользователя
2. Выполнить запрос:
GET /monthlyActivity?userId=test&month=2025-01

Ожидаемый результат:
Корректный ответ (пустой результат или 400)

Фактический результат:
500 Internal Server Error (возможен NullPointerException)

---

# 🔴 Finding #7 — Missing Authentication

| Поле | Значение |
|------|----------|
| CWE | CWE-306 |
| CVSS | 9.8 CRITICAL |

**Описание:**
Все endpoints доступны без auth.

Шаги воспроизведения:

1. Выполнить запрос без авторизации:
GET /totalActivity?userId=test

2. Проверить статус ответа

Ожидаемый результат:
401 Unauthorized

Фактический результат:
200 OK — доступ разрешён без проверки

---

# 🔴 Finding #8 — Information Disclosure

| Поле | Значение |
|------|----------|
| CWE | CWE-209 |

**Описание:**
Возвращаются внутренние ошибки.

Шаги воспроизведения:

1. Отправить некорректный запрос:
POST /recordSession?userId=test&loginTime=invalid&logoutTime=invalid

2. Проверить тело ответа

Ожидаемый результат:
Общее сообщение об ошибке (без деталей)

Фактический результат:
Ответ содержит внутренние детали или текст исключения

---

# 🧪 Security Testing Strategy

Реализованы автоматические тесты:


src/test/java/.../pentest/


### Подход:
- тесты проверяют **безопасное поведение**
- при наличии уязвимости → тест падает
- после фикса → тест проходит

Шаги воспроизведения:

1. Отправить запрос:
POST /register?userId=' OR 1=1 --&userName=test

2. Проверить статус ответа

Ожидаемый результат:
400 Bad Request (некорректный ввод)

Фактический результат:
Сервер принимает вредоносный input
---

# 🛠️ Рекомендации (приоритет)

## 🔴 Critical
- Добавить authentication
- Исправить SSRF
- Исправить Path Traversal

## 🟠 High
- Валидация input
- Rate limiting

## 🟡 Medium
- Обработка ошибок
- Null safety

---

# 📌 Заключение

Приложение демонстрирует типичные уязвимости:

- отсутствие валидации
- доверие к пользовательскому вводу
- отсутствие базовых security-практик

📉 Уровень безопасности: **низкий**

📈 Требуется внедрение:
- secure coding practices
- input validation
- authentication & authorization
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/NSTTkgmb)
# Лабораторная работа №4 — Анализ и тестирование безопасности веб-приложения

## Цель
Expand Down
Loading