Информационная безопасность
OWASP Top 10
2017 год: Equifax взломан через Apache Struts уязвимость (injection в OGNL). Утекли данные 147 миллионов американцев. 2019: Capital One - SSRF через WAF, 100 миллионов записей. OWASP Top 10 - это не академический список, это реальные уязвимости реальных систем, которые стоят миллиарды долларов и репутацию компаний.
- **Equifax (2017):** Apache Struts RCE через OGNL injection, 147M записей, $575M штраф FTC
- **Capital One (2019):** SSRF через WAF -> AWS IAM credentials -> S3 с данными 100M клиентов
- **LinkedIn (2012):** 6.5M хешей паролей MD5 без соли - все взломаны за дни
Injection: SQL, Command, LDAP
2010 год, онлайн-магазин. Поле поиска: `телефон`. URL становится `?q=телефон`. Хакер вводит `' OR '1'='1`. SQL-запрос превращается в `SELECT * FROM products WHERE name='' OR '1'='1'` - и возвращает все товары. Меняет на `'; DROP TABLE products;--` - таблица исчезает. **SQL Injection** - это когда пользовательские данные интерпретируются как код.
- **SQL Injection:** конкатенация строк в SQL-запросах -> использовать prepared statements / ORM
- **Command Injection:** вызов shell с пользовательским вводом -> `subprocess.run([...], shell=False)`
- **LDAP Injection:** спецсимволы в LDAP-фильтрах -> экранировать через библиотеку
- **Template Injection:** пользовательский ввод в шаблонизатор (Jinja2, Pebble) -> никогда не рендерить пользовательский ввод как шаблон
**ORM не защищает автоматически.** `db.query(f'SELECT * FROM users WHERE id={id}')` - инъекция даже с ORM. Защищает только параметризация: `User.objects.filter(id=id)` или `db.query('SELECT * WHERE id = :id', {'id': id})`.
Какой из вариантов защищает от SQL injection?
Broken Authentication
Слабая аутентификация - не всегда взлом пароля. Иногда достаточно просто угадать session ID, который состоит из timestamp. Или воспользоваться функцией «Забыл пароль», которая отправляет пароль в открытом виде. **Broken Authentication** охватывает весь спектр ошибок в механизмах проверки личности.
- **Rate limiting** на `/login`: заблокировать после 5 неудачных попыток
- **Bcrypt/Argon2** для паролей - не MD5/SHA1 (слишком быстрые для брутфорса)
- **Session ID** из `secrets.token_hex(32)` - не timestamp и не UUID v1
- **Logout** должен инвалидировать сессию на сервере, не только удалять cookie
- **MFA** (многофакторная аутентификация) - даже взломанный пароль не даёт доступ
Пользователь вышел из аккаунта. Cookie `session_id` удалена из браузера. Сессия безопасно завершена?
Sensitive Data Exposure
2019 год: база данных 540 миллионов пользователей Facebook утекла с AWS S3 - бакет был публичным. Данные не были зашифрованы. Sensitive Data Exposure - это не только про взлом; часто это просто отсутствие шифрования там, где оно должно быть, и избыточный сбор данных.
**Data minimization:** не собирай данные которые не нужны. Нет данных - нет утечки. GDPR требует иметь явное обоснование для каждого поля персональных данных.
Приложение хранит номера кредитных карт в БД. Как правильно организовать хранение?
XXE и SSRF атаки
XML пришёл с XML-парсером, который умеет загружать внешние ресурсы. **XXE (XML External Entity)** - это когда XML из пользовательского ввода содержит ссылку на `/etc/passwd`, и сервер покорно его читает и возвращает. **SSRF (Server-Side Request Forgery)** - шире: любая возможность заставить сервер выполнить HTTP-запрос к произвольному адресу, включая внутреннюю сеть.
**defusedxml** - Python-библиотека, которая отключает опасные XML-фичи: external entities, billion laughs атаку (экспоненциальное раскрытие entities), quadratic blowup. Замените `xml.etree.ElementTree` на `defusedxml.ElementTree` без изменений API.
Сервер на AWS получил SSRF-запрос к `http://169.254.169.254/latest/meta-data/iam/credentials`. Что произойдёт?
OWASP Top 10: главные угрозы
- **Injection:** пользовательские данные интерпретируются как код -> параметризованные запросы, shell=False
- **Broken Authentication:** слабые сессии, MD5 пароли, нет rate limiting -> bcrypt/Argon2, secrets.token_hex, MFA
- **Sensitive Data Exposure:** plaintext в БД и логах, лишние данные -> шифрование, токенизация, data minimization
- **XXE/SSRF:** XML загружает файлы, сервер делает запросы во внутреннюю сеть -> defusedxml, IP whitelist
Связанные темы
OWASP Top 10 пересекается со специфическими атаками и механизмами аутентификации.
- SQL Injection: детальный разбор — Injection - самая опасная из OWASP Top 10
- CSRF, SSRF, CORS — SSRF и CORS детально разобраны здесь
- JWT, OAuth 2.0, OpenID Connect — Современные механизмы аутентификации решают Broken Auth проблемы
Вопросы для размышления
- Почему параметризованные запросы защищают от SQL injection лучше чем экранирование символов?
- Как data minimization снижает риски не только утечки, но и compliance (GDPR)?
- В чём разница между XXE и SSRF? Могут ли они использоваться в комбинации?