Тестирование безопасности эволюционировало из специализированной ниши в ключевую компетенцию для QA-инженеров. С утечками данных, стоящими компаниям миллионы и непоправимо вредящими репутации, ответственность за выявление уязвимостей безопасности теперь распространяется за пределы специализированных команд безопасности на всех, кто вовлечен в разработку программного обеспечения. Это всеобъемлющее руководство снабжает QA-инженеров практическими знаниями об основах тестирования безопасности, распространенных уязвимостях и инструментах, необходимых для обнаружения и валидации проблем безопасности.
Понимание Security Testing в контексте QA
Security testing — это практика выявления уязвимостей, угроз и рисков в программных системах, которые могут привести к несанкционированному доступу, утечкам данных, компрометации системы или отказу в обслуживании. В отличие от функционального тестирования, которое валидирует, что функции работают как задумано, тестирование безопасности исследует, что происходит, когда функции используются не по назначению, обходятся или эксплуатируются.
Менталитет Security Testing
Эффективное тестирование безопасности требует смены мышления от традиционного QA-подхода:
Традиционный QA менталитет:
- “Эта функция работает как задокументировано?”
- “Что происходит, когда я следую happy path?”
- “Могут ли легитимные пользователи достигать своих целей?”
Security (как обсуждается в Penetration Testing Basics for QA Testers) testing менталитет:
- “Как можно злоупотребить этой функцией?”
- “Что происходит, когда я умышленно предоставляю вредоносный ввод?”
- “Могу ли я обойти аутентификацию или авторизацию?”
- “Какие чувствительные данные раскрыты?”
- “Что произойдет, если я манипулирую API-вызовами или браузерными запросами?”
Security (как обсуждается в OWASP ZAP Automation: Security Scanning in CI/CD) Testing vs. Penetration Testing
Security (как обсуждается в SQL Injection and XSS: Finding Vulnerabilities) testing — это широкая категория, включающая:
- Статический анализ (code review, SAST-инструменты)
- Динамический анализ (runtime testing, DAST-инструменты)
- Обзоры конфигурации
- Моделирование угроз
- Валидация соответствия
Penetration testing (или ethical hacking) — это специфический тип тестирования безопасности, где тестировщики активно пытаются эксплуатировать уязвимости для демонстрации реальных сценариев атак.
Как QA-инженер, вы в первую очередь будете фокусироваться на автоматизированном сканировании безопасности, базовой идентификации уязвимостей и регрессионном тестировании безопасности.
OWASP Top 10: Фундамент тестирования безопасности
OWASP Top 10 — это дефинитивный документ осведомленности о безопасности веб-приложений. Опубликованный Open Web Application Security Project (OWASP), он представляет наиболее критичные риски безопасности для веб-приложений на основе данных от сотен организаций и тысяч приложений.
OWASP Top 10 (издание 2021)
A01:2021 – Broken Access Control
Что это: Broken Access Control происходит, когда пользователи могут действовать за пределами своих намеренных разрешений — получать доступ к данным других пользователей, модифицировать данные, которые не должны, или выполнять административные функции без надлежащей авторизации.
Распространенные проявления:
- Insecure Direct Object References (IDOR): URL типа
/api/users/12345
, где изменение ID раскрывает данные других пользователей - Missing function-level access control: Админ-панели, доступные обычным пользователям
- Forced browsing: Доступ к страницам путем угадывания URL (например,
/admin
,/reports
) - Elevation of privilege: Обычные пользователи получают права админа через манипуляцию параметрами
Как тестировать:
- Тестировать вертикальный контроль доступа: Войдите как пользователь с низкими привилегиями и попытайтесь получить доступ к админ-функциям
- Тестировать горизонтальный контроль доступа: Как Пользователь A, попытайтесь получить доступ к ресурсам Пользователя B, манипулируя ID или токенами
- Тестировать forced browsing: Попытайтесь получить доступ к ограниченным URL напрямую без аутентификации
- Тестировать манипуляцию параметрами: Измените
role=user
наrole=admin
в запросах
Пример тестового случая:
# Нормальный запрос как Пользователь 12345
GET /api/users/12345/profile HTTP/1.1
Authorization: Bearer <user_12345_token>
# Атака: Попытка получить доступ к профилю Пользователя 99999
GET /api/users/99999/profile HTTP/1.1
Authorization: Bearer <user_12345_token>
# Ожидаемый защищенный ответ: 403 Forbidden
# Уязвимый ответ: 200 OK с данными Пользователя 99999
A02:2021 – Cryptographic Failures
Что это: Сбои, связанные с криптографией (или её отсутствием), которые раскрывают чувствительные данные. Это включает данные, передаваемые без шифрования, слабые алгоритмы шифрования, неправильное управление ключами и отсутствие шифрования в состоянии покоя.
Как тестировать:
- Проверить принудительное использование HTTPS: Попытайтесь получить доступ к приложению через HTTP — оно должно перенаправлять на HTTPS
- Проверить валидность сертификата: Используйте инструменты разработчика браузера или SSL Labs
- Инспектировать хранимые данные: Проверьте cookies, local storage, session storage на чувствительные данные
- Проверить хранение паролей: Убедитесь, что пароли хэшируются сильными алгоритмами (bcrypt, Argon2, PBKDF2)
A03:2021 – Injection
Что это: Недостатки инъекции возникают, когда недоверенные данные отправляются интерпретатору как часть команды или запроса.
SQL Injection углубленно:
SQL Injection возникает, когда пользовательский ввод включается в SQL-запросы без надлежащей санитизации или параметризации.
Уязвимый код (Python):
# УЯЗВИМО - Никогда так не делайте!
username = request.form['username']
password = request.form['password']
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
cursor.execute(query)
Атакующий payload:
Username: admin' --
Password: anything
# Результирующий запрос:
SELECT * FROM users WHERE username='admin' -- ' AND password='anything'
# Символы -- комментируют остаток запроса, обходя проверку пароля
Как тестировать SQL Injection:
# Login bypass
' OR 1=1--
admin' --
' OR 'x'='x
# Union-based injection
' UNION SELECT NULL, NULL, NULL--
' UNION SELECT username, password, NULL FROM users--
# Blind SQL injection (time-based)
'; IF (1=1) WAITFOR DELAY '00:00:05'--
Защищенный код (параметризованный запрос):
# БЕЗОПАСНО - Всегда используйте параметризованные запросы
username = request.form['username']
password = request.form['password']
query = "SELECT * FROM users WHERE username=? AND password=?"
cursor.execute(query, (username, password))
A04:2021 – Insecure Design
Что это: Недостатки безопасности в дизайне и архитектуре приложения, до написания любого кода.
Примеры:
- Отсутствие rate limiting на сбросе пароля, позволяющее brute force
- Вопросы восстановления учетных данных, которые легко угадываются
- Недостатки бизнес-логики
A05:2021 – Security Misconfiguration
Что это: Небезопасные конфигурации по умолчанию, неполные настройки, открытое облачное хранилище, неправильно настроенные HTTP-заголовки, подробные сообщения об ошибках, раскрывающие чувствительную информацию.
Как тестировать:
- Проверить учетные данные по умолчанию: Попробуйте
admin/admin
,admin/password123
- Зондировать открытые админ-панели:
/admin
,/administrator
,/phpmyadmin
- Вызвать ошибки: Отправьте некорректный ввод для раскрытия stack traces
- Проверить HTTP security headers: Используйте SecurityHeaders.com
Важные security headers:
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
A06:2021 – Vulnerable and Outdated Components
Что это: Использование библиотек, фреймворков или других программных компонентов с известными уязвимостями.
Как тестировать:
# Проверить npm-зависимости на уязвимости
npm audit
# Проверить Python-пакеты
pip-audit
A07:2021 – Identification and Authentication Failures
Что это: Сбои в механизмах аутентификации, позволяющие злоумышленникам компрометировать пароли, ключи или сессионные токены.
Как тестировать:
- Протестировать политику паролей: Попытайтесь использовать слабые пароли типа
123456
,password
- Протестировать защиту от brute force: Попытайтесь множественные неудачные логины
- Управление сессиями: Проверьте, что сессионные токены случайны, безопасны и истекают
A08:2021 – Software and Data Integrity Failures
Что это: Код и инфраструктура, которые не защищают от нарушений целостности.
A09:2021 – Security Logging and Monitoring Failures
Что это: Недостаточное логирование, обнаружение, мониторинг и реагирование на события безопасности.
A10:2021 – Server-Side Request Forgery (SSRF)
Что это: SSRF возникает, когда веб-приложение получает удаленный ресурс без валидации URL, предоставленного пользователем.
Cross-Site Scripting (XSS): Типы и тестирование
Cross-Site Scripting (XSS) позволяет злоумышленникам внедрять вредоносные скрипты в веб-страницы, просматриваемые другими пользователями.
Типы XSS
Reflected XSS
Вредоносный скрипт отражается от веб-сервера, обычно в результатах поиска, сообщениях об ошибках.
Пример:
GET /search?q=<script>alert('XSS')</script>
Stored XSS
Вредоносный скрипт постоянно хранится на целевом сервере.
DOM-Based XSS
Уязвимость существует в клиентском коде, а не в серверном коде.
Тестирование XSS
Базовые XSS payloads:
<script>alert('XSS')</script>
<img src=x onerror=alert('XSS')>
<svg/onload=alert('XSS')>
<iframe src="javascript:alert('XSS')">
Продвинутые XSS payloads:
# Вариация регистра
<ScRiPt>alert('XSS')</sCrIpT>
# HTML-кодирование
<img src=x onerror="alert('XSS')">
# Использование backticks
<img src=x onerror=`alert('XSS')`>
Cross-Site Request Forgery (CSRF)
CSRF обманывает аутентифицированных пользователей для выполнения нежелательных действий в веб-приложении, где они в данный момент аутентифицированы.
Как работает CSRF:
- Пользователь входит на легитимный сайт (bank.com)
- Пользователь посещает вредоносный сайт (attacker.com)
- Вредоносный сайт запускает запрос к bank.com
- Браузер автоматически включает аутентификационные cookies
- Bank.com обрабатывает запрос, как если бы пользователь его инициировал
Тестирование CSRF
Проверка CSRF-токенов:
<form action="/transfer" method="POST">
<input type="hidden" name="csrf_token" value="random_token">
<button type="submit">Transfer</button>
</form>
Тестирование CSRF-защиты:
- Отправить формы без CSRF-токена
- Использовать CSRF-токен из другой сессии
- Использовать истекшие CSRF-токены
Инструменты Security Testing
OWASP ZAP (Zed Attack Proxy)
OWASP ZAP — самый популярный в мире бесплатный инструмент тестирования безопасности.
Ключевые функции:
- Перехватывающий прокси
- Автоматизированный сканер для распространенных уязвимостей
- Активное и пассивное сканирование
- Spider/crawler для картирования структуры приложения
- Fuzzer для тестирования валидации ввода
Начало работы с ZAP:
# Установка
brew install --cask owasp-zap # macOS
apt install zaproxy # Ubuntu/Debian
Базовый workflow:
1. Настроить браузер использовать ZAP как прокси (localhost:8080)
2. Просматривать приложение нормально
3. Запустить автоматизированное сканирование
4. Просмотреть находки во вкладке Alerts
5. Сгенерировать отчет
Burp Suite
Burp Suite — индустриальный стандарт для тестирования безопасности веб-приложений.
Ключевые функции:
- Мощный перехватывающий прокси
- Сканер (только Professional edition)
- Repeater для манипуляции и переотправки запросов
- Intruder для автоматизированных атак
- Decoder для кодирования/декодирования данных
Настройка прокси Burp:
1. Burp Suite → Proxy → Options → Interface: 127.0.0.1:8080
2. Браузер → Настройки прокси → Ручной: localhost:8080
3. Импортировать CA-сертификат Burp в браузер
Другие полезные инструменты
Nikto - Сканер веб-серверов
nikto -h https://example.com
SQLMap - Автоматизированный инструмент SQL injection
sqlmap -u "https://example.com/page?id=1" --dbs
Nmap - Сканер сетей
nmap -sV -sC example.com
Security Testing в CI/CD-пайплайнах
Интеграция тестирования безопасности в CI/CD гарантирует раннее обнаружение уязвимостей.
# .github/workflows/security.yml
name: Security Scan
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run Bandit
run: |
pip install bandit
bandit -r . -f json -o bandit-report.json
- name: ZAP Baseline Scan
uses: zaproxy/action-baseline@v0.6.1
with:
target: 'https://staging.example.com'
Лучшие практики
1. Принять security-first менталитет
- Думайте как злоумышленник
- Ставьте под вопрос предположения о границах доверия
2. Тестировать рано и часто
- Интегрировать security testing в каждый спринт
- Использовать security testing инструменты в CI/CD
3. Оставаться в курсе уязвимостей
- Следовать обновлениям OWASP Top 10
- Подписываться на security-новостные рассылки
4. Сотрудничать с security-командами
- Посещать security-тренинги
- Участвовать в bug bounty программах
5. Документировать и отслеживать находки
- Использовать консистентные оценки серьезности
- Предоставлять четкие шаги воспроизведения
6. Тестировать в non-production окружениях сначала
- Никогда не тестировать в production без явной авторизации
- Использовать выделенные security testing окружения
7. Понимать юридические и этические границы
- Только тестировать системы, на которые у вас есть авторизация
- Следовать практикам ответственного раскрытия
Заключение
Тестирование безопасности больше не опционально — это фундаментальная ответственность современной QA-инженерии. Развитие компетенции в понимании OWASP Top 10, тестировании распространенных уязвимостей и использовании инструментов типа OWASP ZAP и Burp Suite значительно повысит вашу ценность как QA-инженера и улучшит security posture приложений, которые вы тестируете.
Безопасность — это непрерывное путешествие, а не конечный пункт назначения. Начните с малого, сфокусируйтесь на наиболее критичных уязвимостях сначала и прогрессивно наращивайте свою экспертизу в security testing.