---
title: OWASP TOP 10 Day 2
tags: OWASP TOP 10
slideOptions:
transition: fade
center: true
parallaxBackgroundImage: 'https://hackmd.io/_uploads/SJhktzri2.png'
---
# OWASP TOP 10 Day 2
## Содержание:
- Идентификация, аутентификация и авторизация
- Идентификация
- Аутентификация и ее факторы
- Авторизация
- Виды аутентификации
- По паролю http auth
- По паролю form auth
- По сертификатам
- По одноразовым паролям
- По токенам
- Форматы токенов
- OAuth и OpenID Connect
- A01:2021 - Broken Access Control
- Типы контроля доступа
- Список распространенных проблем
- Снижение риска
- Дополнительные материалы
- A7:2021 - Identification and Authentication Failures
- Результат аутентификации
- Список распространенных проблем
- Уязвимости в механизмах аутентификации
- Снижение риска
- Упражнения
- A2: Cryptographic failures
- Personal Identifiable Information
- Чувствительные PII
- Нечувствительные PII
- Пароли и система учетных записей пользователей
- Атаки
- Соль
- Угрозы
- Примеры криптографически стойких медленных хеш-функций
- Рекомендации по хеш функциям
- Рекомендации по A02
- Дополнительные материалы
- A6: 2021 - Vulnerable and Outdate Components
- Типовые уязвимости и Известные уязвимости (CVE && CWE)
- CVSS
- Сканеры известных уязвимостей
- Сканеры уязвимых компонентов
- Инструменты анализа сторонних компонентов ПО (Software Composition Analysis)
- Эксплоиты к известным уязвимостям
- Рекомендации
- Дополнительные материалы
## OWASP 2021

## Идентификация, аутентификация и авторизация
- Идентификация — процедура, в результате выполнения которой для субъекта идентификации выявляется его идентификатор, однозначно определяющий этого субъекта в информационной системе.
- Аутентификация — процедура проверки подлинности, например проверка подлинности пользователя путем сравнения введенного им пароля с паролем, сохраненным в базе данных.
- Авторизация — предоставление определенному лицу или группе лиц прав на выполнение определенных действий.

### Идентификация
Процедура, в результате выполнения которой для субъекта идентификации выявляется его идентификатор, однозначно идентифицирующий этого субъекта в информационной системе. Для выполнения процедуры идентификации в информационной системе субъекту предварительно должен быть назначен соответствующий идентификатор (то есть проведена регистрация субъекта в информационной системе).
### Аутентификация и ее факторы
Процедура проверки подлинности
1) **Знание**: информация, известная конкретному пользователю.
2) **Владение**: что-то, что мы имеем — устройство аутентификации
3) **Свойство**: обладание пользователем каким-то уникальным признаком
### Авторизация
Предоставление определённому лицу или группе лиц прав на выполнение определённых действий; а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий
### Виды аутентификации
#### Basic auth

#### Digest auth

#### NTLM

#### Negotiate

#### Certificate

#### По одноразовым паролям
Одноразовый пароль (англ. one time password, OTP) — это пароль, действительный только для одного сеанса аутентификации. Действие одноразового пароля также может быть ограничено определенным промежутком времени. Преимущество одноразового пароля по сравнению со статическим в том, что пароль невозможно использовать повторно. Таким образом, злоумышленник, перехвативший данные из успешной сессии аутентификации, не может использовать скопированный пароль для получения доступа к защищаемой информационной системе.
* Аппаратные
* Случайно генерируемые
* Распечатка
Одноразовый пароль генерируется обычно с использованием одного из трех алгоритмов:
* HOTP — по событию
* TOTP — по времени
* OCRA — запрос/ответ
#### По токенам
##### Форматы токенов
1. Simple Web Token (SWT)
2. JSON Web Token (JWT)
3. Security Assertion Markup Language (SAML)
## A01:2021 - Broken Access Control
### Типы контроля доступа
* Вертикальный контроль доступа. (на функциональном уровне)

system-admin:
- /admin/create-user
- /admin/delete-user
manager:
- /manager/create-company
- /manager/assign-user-to-company
user:
- /user/create-comment
- /user/send-message-to-manager
* Горизонтальный контроль доступа. (на уровне объектов)

ДБО - /make_payment/card_id
* Контекстно-зависимый контроль доступа.

### Broken Access Control
Собирательная уязвимость, основными двумя частями которой являются:
- Missing Functional Level Access Control (MFLAC)
- Insecure Direct Ob ect Reference (IDOR) (Небезопасная прямая ссылка на объект) (Один пользователь получает доступ к файлам другого)
#### IDOR
Базовый пример:
http://example.com/profile?userId=543
А почему бы не попробовать
http://example.com/profile?userId=544 ?
**Примеры**
* bWAPP
* IDOR: Change Secret
* IDOR: Order Tickets
#### MFLAC
А доступны ли пользователю с определенной ролью функции, которые ему не должны быть доступны.
**Примеры**
* bWAPP
* IDOR: Session Mgmt. - Administrative Portals
* https://portswigger.net/web-security/access-control/lab-insecure-direct-object-references
* https://portswigger.net/web-security/access-control/lab-user-id-controlled-by-request-parameter-with-unpredictable-user-ids
* MFLAC https://portswigger.net/web-security/access-control/lab-user-role-controlled-by-request-parameter
### Список распространенных проблем
- Нарушение принципа наименьших привилегий или запрета по умолчанию
- Обход проверок контроля доступа путем модификации
- Небезопасные прямые ссылки на объект
- Доступ к API с отсутствующим контролем доступа для POST, PUT и DELETE
- Повышение привилегий
- Манипуляции с метаданными
- Неправильная конфигурация CORS
- Принудительный переход на аутентифицированные страницы в качестве неаутентифицированного пользователя или на привилегированные страницы в качестве обычного пользователя
### Снижение риска
Есть вещи, которые вы можете сделать, чтобы снизить риск нарушения контроля доступа:
- Используйте концепции с наименьшими привилегиями - применяйте роль, соответствующую задаче, и только в течение времени, необходимого для выполнения указанной задачи. (zerotrust)
- Проведите аудит своих серверов и веб-сайтов — кто, что, когда и почему делает.
- Отключайте точки доступа до тех пор, пока они не понадобятся, чтобы уменьшить окна доступа
- Удалите ненужные службы с вашего сервера.
- Проверьте приложения, доступные извне, и приложения, привязанные к вашей сети.
- Ограничьте или значительно увеличьте **интервал между неудачными попытками входа**. Регистрируйте все неудачные попытки и уведомляйте администраторов при обнаружении атак на учетные данные, методом подбора или любых других атак.
- Логгируйте неудачные попытки входа
- Не доверяйте данным от пользователей
- Используйте непредсказуемые идентификаторы объектов (uuid рекомендуется ver4(случайные идентификаторы))
- Реализуйте контроль доступа единообразно во всем веб-приложении
### Дополнительные материалы
- Серия регулярного подкаста с обсуждением основных атак на аутентификацию и угон аккаунтов: [https://t.me/cybersec_in_russian/5](https://t.me/cybersec_in_russian/5)
- [OWASP памятка по реализации механизмов аутентификации](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Authentication_Cheat_Sheet.md)
- [Device Cookie](https://owasp.org/www-community/Slow_Down_Online_Guessing_Attacks_with_Device_Cookies)
- [Snyk learn](https://learn.snyk.io/lesson/broken-access-control/)
### Упражнения (дополнительные)
Любые из
https://portswigger.net/web-security/access-control
## A07:2021 - Identification and Authentication Failures
### Результат аутентификации
В результате аутентификации веб-приложение может выдавать пользователю:
- Случайные сессионные идентификаторы;
При самостоятельной реализации:
- нужна достаточная энтропия (желательно > 256 бит);
- использовать надежный генератор псевдослучайных чисел
- Подписанные сессионные данные (например, JWT).
**использовать надежный секрет**.
### JWT problems
[https://portswigger.net/web-security/jwt](https://portswigger.net/web-security/jwt).
### Список распространенных проблем
- Допускает грубую силу или другие автоматические атаки.
- Разрешает использование стандартных, слабых или хорошо известных паролей
- Используются слабые или неэффективные процессы восстановления учетных данных и забытых паролей
- Используются хранилища данных с открытым текстом, зашифрованными или слабо хешированными паролями
- Отсутствует или неэффективна многофакторная аутентификация
- Раскрывает идентификатор сеанса в URL
- Повторное использование идентификатора сеанса после успешного входа в систему
- Некорректное аннулирование идентификаторов сеансов
### Уязвимости в механизмах аутентификации
- Уязвимости при входе в на основе пароля
- Возможные brute-force атаки
- Уязвимая защита от brute-force атак
- Уязвимости при многофакторной аутентификации
- Неправильная реализация
- Отсутствует проверка пользователя на разных этапах
- Отсуствует проверка перебора 2FA
- Уязвимости в других механизмах аутентификации
- Уязвимый компонент "сброс пароля"
- Уязвимый механизм поддержания сессии "запомни меня"
- Уязвимая смена пароля
### Снижение риска
- Если возможно, примените многофакторную аутентификацию (MFA) ко всем точкам доступа.
- Избавьтесь от учетных записей, которые вам не нужны или пользователю которых больше не требуется доступ (в том числе от стандартных учетных записей, особенно для администраторов).
- Установите **длину, сложность и периодичность смены паролей**.
- Реализуйте **проверку надежности паролей**, например, проверяя вновь создаваемые или изменяемые пароли по списку “10000 наихудших паролей”.
- Обеспечьте защиту регистрации, восстановления учетных данных и API от **атак методом энумерации**, используя во всех ответах одинаковые сообщения.
- Ограничьте или все чаще задерживайте неудачные попытки входа в систему
- Используйте серверные, надежные, встроенные менеджеры сессий, генерирующие после входа в систему новые, **случайные идентификаторы с высокой степенью энтропии**. Идентификаторы сессий не должны присутствовать в URL, а должны безопасно храниться и аннулироваться после выхода из системы, простоя или наступления абсолютного тайм-аута.
- Используйте соль и перец при работе с паролями (Описание далее)
- Добавляйте временную задержку, чтобы не было разницы в сравнении логина вместе с паролем и отдельно логина
### Упражнения
#### Упражнение 1
Некорректная реализация блокировки по IP от перебора грубой силой - [https://portswigger.net/web-security/authentication/password-based/lab-broken-bruteforce-protection-ip-block](https://portswigger.net/web-security/authentication/password-based/lab-broken-bruteforce-protection-ip-block) (Сложность: низкая)
#### Упражнение 2
Простой обход 2FA - [https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-simple-bypass](https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-simple-bypass) (Сложность: низкая)
#### Упражнение 3
Атака грубой силы на механизм “запомнить меня” - [https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie](https://portswigger.net/web-security/authentication/other-mechanisms/lab-brute-forcing-a-stay-logged-in-cookie) (Сложность: средняя)
### Additional links
https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/
## A02:2021 : Cryptographic failures
### Personal Identifiable Information
Информация, которая, будучи использована отдельно или вместе с другими соответствующими данными, может идентифицировать человека
#### Чувствительные PII
- Полное ФИО
- СНИЛС
- Водительские права
- Почтовый адрес (не электронный)
- Банковские данные
- Паспортная информация
- Финансовая информация
- Медицинские данные
#### Нечувствительные PII
- Почтовый индекс
- Раса
- Пол
- Дата и место рождения
- Регион
### Пароли и система учетных записей пользователей
Общая схема регистрации пользователя:
1. Создание учетной записи
2. Вычисление хеш-суммы
3. При попытке входа пользователя хеш сумма от введеннго пароля сравнивается с сохраненной хеш суммой
4. Если хеши совпадают - пользователю предоставляется доступ
### Атаки
- Метод полного перебора (брутфорс)
- Атаки по маске
- Словарные атаки
- Гибридные атаки
- Радужные таблицы
### Соль
Соль (также модификатор входа хэш-функции) — строка данных, которая передаётся хеш-функции вместе с входным массивом данных (прообразом) для вычисления хэша (образа).
```
hash("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
hash("hello" + "QxLUF1bgIAdeQX") = 9e209040c863f84a31e719795b2577523954739fe5ed3b58a75cff2127075ed1
hash("hello" + "bv5PehSMfV11Cd") = d1d3ec2e6f20fd420d50e2642992841d8338a314b8ea157c9e18477aaef226ab
hash("hello" + "YYLmfY6IehjZMQ") = a49670c3c18b9e079b9cfaf51634f563dc8ae3070db2c4a8544305df1b60f007
```
### Перец
Набор случайных символов, который добавляется к паролю и соли перед его хешированием. Перец может **храниться** в конфигурационных файлах приложения или может быть зашит в код.
```php
$pepper = "fOifew8Hufehwifhea78feg29HUIFEhfewjfe*FHehaoefahwojfw";
function registerUser($username,$password) {
$salt = openssl_random_pseudo_bytes(40);
$hash = hash_pbkdf2 ( 'sha256' , $password.$pepper , $salt , 10000 );
$sql = "INSERT INTO users VALUES ('".$username,."','".$salt."','".$hash."')";
$conn->execute($sql);
}
```
#### Угрозы
- Повторное использование соли
- Короткая соль
- Использование данных пользователя в качестве соли
|Language|Unsafe Functions|Cryptographically Secure Functions|
|---|---|---|
|C|`random()`, `rand()`|[getrandom(2)](http://man7.org/linux/man-pages/man2/getrandom.2.html)|
|Java|`java.util.Random()`|[java.security.SecureRandom](https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html)|
|PHP|`rand()`, `mt_rand()`, `array_rand()`, `uniqid()`|[random_bytes()](https://www.php.net/manual/en/function.random-bytes.php), [random_int()](https://www.php.net/manual/en/function.random-int.php) in PHP 7 or [openssl_random_pseudo_bytes()](https://www.php.net/manual/en/function.openssl-random-pseudo-bytes.php) in PHP 5|
|.NET/C#|`Random()`|[RandomNumberGenerator](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.randomnumbergenerator?view=net-6.0)|
|Objective-C|`arc4random()` (Uses RC4 Cipher)|[SecRandomCopyBytes](https://developer.apple.com/documentation/security/1399291-secrandomcopybytes?language=objc)|
|Python|`random()`|[secrets()](https://docs.python.org/3/library/secrets.html#module-secrets)|
|Ruby|`Random`|[SecureRandom](https://ruby-doc.org/stdlib-2.5.1/libdoc/securerandom/rdoc/SecureRandom.html)|
|Go|`rand` using `math/rand` package|[crypto.rand](https://golang.org/pkg/crypto/rand/) package|
|Rust|`rand::prng::XorShiftRng`|[rand::prng::chacha::ChaChaRng](https://docs.rs/rand/0.5.0/rand/prng/chacha/struct.ChaChaRng.html) and the rest of the Rust library [CSPRNGs.](https://docs.rs/rand/0.5.0/rand/prng/index.html#cryptographically-secure-pseudo-random-number-generators-csprngs)|
|Node.js|`Math.random()`|[crypto.randomBytes](https://nodejs.org/api/crypto.html#cryptorandombytessize-callback), [crypto.randomInt](https://nodejs.org/api/crypto.html#cryptorandomintmin-max-callback), [crypto.randomUUID](https://nodejs.org/api/crypto.html#cryptorandomuuidoptions)|
### Примеры криптографически стойких медленных хеш-функций
- Argon2
- bcrypt
- scrypt
- yescrypt
- PBKDF2
### Рекомендации по хеш функциям
- стараться НЕ использовать быстрые алгоритмы хэширования (MD5, SHA1, SHA256, SHA512, RipeMD, WHIRLPOOL, SHA3, etc.)
- если по каким-то причинам все же вынуждены, то используем не ниже SHA-256 и солим
- задействовать медленные криптостойкие алгоритмы (с использованием стречинга (stretching) - замедления)
- генерировать случайную соль
### Рекомендации по A02
- Классифицировать данные, обрабатываемые, хранимые или передаваемые приложением.
- Не храните конфиденциальные данные без необходимости.
- Обязательно шифруйте все конфиденциальные данные в состоянии покоя.
- Убедитесь в наличии современных и надежных стандартных алгоритмов, протоколов и ключей; используйте надлежащее управление ключами.
- Шифруйте все передаваемые данные с помощью безопасных протоколов, таких как TLSv1.3
- Отключите кэширование для ответов, содержащих конфиденциальные данные.
- Применяйте необходимые средства контроля безопасности в соответствии с классификацией данных.
- Не используйте для передачи конфиденциальных данных устаревшие протоколы, такие как FTP и SMTP.
- Храните пароли с использованием медленных криптографически стойких функций.
- Векторы инициализации должны быть выбраны с помощью криптографически стойкого генератор псевдослучайных чисел
- Ключи должны генерироваться криптографически случайным образом и храниться в памяти в виде массивов байтов.
- Убедитесь, что криптографическая случайность используется там, где это необходимо, и что она не была заложена предсказуемым образом или с низкой энтропией.
- Избегайте устаревших криптографических функций и старых стандартов PKCS, таких как MD5, SHA1, PKCS v1.5.
- Самостоятельно проверять эффективность конфигурации и настроек.

### Дополнительные материалы
https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html
## A06:2021 - Vulnerable and Outdate Components
### Типовые уязвимости и Известные уязвимости (CVE && CWE)
Типовые уязвимости - [https://cwe.mitre.org/](https://cwe.mitre.org/)
Известные уязвимости - [https://cve.mitre.org/](https://cve.mitre.org/)
### CVSS
CVSS(Common Vulnerability Scoring System) — открытый
стандарт для оценки степени опасности уязвимостей.
- Базовые метрики.
- Метрики эксплуатации
- Метрики воздействия
- Временные метрики
- Метрики окружения
### Сканеры известных уязвимостей
Выявить наличие известных уязвимостей ПО проще всего при помощи инструментов анализа компонентов, что позволяет получать информацию о версиях компонентов и их наличии в проекте.
Инструменты анализа компонентов могут использовать как полный доступ к коду проекта так и пытаться получать информации из банеров информационных систем, таких как веб-сайты, прокси серверы, содержимое отдельных страниц и пр.
- Nmap vulners
- Nessus
- Acunetix
- Burp Pro
### Сканеры уязвимых компонентов
#### Инструменты анализа сторонних компонентов ПО (Software Composition Analysis)
Программные решения типа Software Composition Analysis (SCA), предназначены для автоматизированного обнаружения рисков и устранения уязвимостей в коде, контроля использования внешних (готовых) библиотек.
Анализ состава программного обеспечения (SCA) является инструментом управления компонентами с открытым исходным кодом. Он генерирует отчет, в котором перечислены все компоненты с открытым исходным кодом в данном продукте - включая прямые и косвенные зависимости. Используя SCA, команда разработчиков может быстро отслеживать и анализировать любой компонент с открытым исходным кодом, включенный в проект.
Задачи:
- Инвентаризация всех открытых исходных кодов (OSS) и запатентованных компонентов, используемых на предприятии.
- Определение компонентов с уязвимостями безопасности, известными как Common Vulnerabilities and Exposures (CVE) (Общие уязвимости и воздействия)
- Идентифицировать компоненты с лицензиями, не соответствующими предполагаемому использованию компанией программного обеспечения.
- Обнаружение устаревших компонентов, которые больше не поддерживаются, чтобы их можно было заменить текущими версиями.
- Эффективное и быстрое распространение информации о выявленных рисках среди членов команды, которые могут принять меры по их устранению.
- Отслеживать смягчение выявленных рисков, связанных с безопасностью и лицензированием.
- Обеспечить механизм для непрерывного выполнения SCA
Плюсы:
- Находит уязвимости в опенсорсе без False-positive
- Доступ к исходникам ему не нужен
- Достаточно легко исправимые уязвимости
- Удобно интегрируется в SDLc
- Не важно какого объема ваш проект
Известные инструменты: [https://owasp.org/www-community/Component_Analysis](https://owasp.org/www-community/Component_Analysis)
### Эксплоиты к известным уязвимостям
- [SecurityFocus](https://www.securityfocus.com)
- [ExploitDB](https://www.exploit-db.com/)
- [VulDB](https://vuldb.com)
- [MITRE CVE](https://cve.mitre.org)
Скорее всего, вы уязвимы:
- Если вы не знаете версии всех используемых вами компонентов (как на стороне клиента, так и на стороне сервера). Сюда входят компоненты, которые вы используете напрямую, а также вложенные зависимости.
- Если программное обеспечение уязвимо, не поддерживается или устарело. Сюда входят ОС, сервер веб-приложений, система управления базами данных (СУБД), приложения, API и все компоненты, среды выполнения и библиотеки.
- Если вы не проводите регулярное сканирование на наличие уязвимостей и не подписываетесь на бюллетени безопасности, касающиеся используемых вами компонентов.
- Если вы не исправляете и не обновляете базовую платформу, фреймворки и зависимости своевременно и с учетом рисков. Обычно это происходит в средах, где исправление является ежемесячной или ежеквартальной задачей в рамках контроля изменений, в результате чего организации могут несколько дней или месяцев не подвергаться ненужному воздействию исправленных уязвимостей.
- Если разработчики программного обеспечения не проверяют совместимость обновленных, модернизированных или исправленных библиотек.
- Если вы не обеспечиваете безопасность конфигураций компонентов
### Рекомендации
- Удаление неиспользуемых зависимостей, ненужных функций, компонентов, файлов и документации.
- Постоянная инвентаризация версий компонентов как клиентской, так и серверной части (например, фреймворков, библиотек) и их зависимостей (OWASP Dependency Check)
- Постоянный мониторинг CVE и NVD, на предмет наличия уязвимостей в компонентах.
- Получайте компоненты только из официальных источников по защищенным ссылкам.
- Отслеживайте наличие библиотек и компонентов, которые не поддерживаются или не создают исправлений безопасности для старых версий.
## Дополнительные материалы
- [Сравнение SCA Nexus-IQ, Dependensy-Track, Dependency-Check](https://habr.com/ru/company/swordfish_security/blog/516660/)
- [Awesome DevSecOps RU](https://github.com/devops-ru/awesome-devsecops_ru)