Kraken
  • 🐙Привет!
    • 👋Добро пожаловать!
  • ✏️Крупицы знаний
    • 🌚Общие статьи
      • Как установить Kali Linux
      • Как поставить виртуальную Kali Linux
      • Что такое CVE
      • Обзор популярных алгоритмов хеширования
      • Модель OSI
      • Какие есть алгоритмы шифрования
      • Что такое TCP/IP
      • HSTS
      • Что такое хеширование и как его используют в ИБ
      • Скрипт для проверки данных SSL-сертификата
      • Шифруем файлы на Kali Linux с помощью OpenSSL
      • Как работает WPA2
      • О протоколе FTP
      • Что такое CVSS
      • Что такое политика одного источника (SOP)
      • О Cross-Origin Resource Sharing (CORS)
      • О Content Security Policy (CSP)
      • Что такое Bash
      • Веб-сокеты
      • MITRE ATT&CK
      • Начало в OSINT
      • Особенности и подходы к тестированию мобильных приложений
      • Что такое REST
      • Что такое API
      • Сравнение безопасности среды iOS и Android
      • CSS в ИБ
    • 🎪Карьера
      • Какие бывают роли у пентестеров и в чем их смысл
      • Какие есть виды пентеста
      • Что входит в пентест
      • Какие есть области знаний в веб-пентесте
      • Главные ошибки новичков в ИБ
    • 😰Уязвимости
      • Об атаке Pastejaking
      • Об уязвимости KRACK
      • Об уязвимости Regex DoS
      • Об атаке MITM
      • Что такое уязвимость нулевого дня
      • Атака на протокол STP
      • Защита протокола STP
      • Clickjacking
      • База при атаке на Wi-Fi
      • Атаки по сторонним каналам
      • DNS ребайндинг
    • ⚙️Инструменты
      • Лучшие сканеры открытых портов и инструменты проверки портов
      • Что такое OWASP ZAP и как он помогает защитить приложения?
      • О фреймворке WiFi Exploitation Framework (WEF)
      • WeBaCoo — поддерживаем доступ к взломанному веб-серверу
      • Socialscan — проверяем использование электронной почты и имен пользователей в соцсетях
      • Обзор инструментов Red Team
      • 11 инструментов для сканирования уязвимостей
      • Подборка инструментов для автоматизации атак на JWT
      • О Bulk_Extractor
      • О Unicornscan
      • О Maryam
      • О Picocrypt, утилите для шифрования данных
      • Анализируем трафик с ZUI (Zed User Interface)
      • Об инструменте SkipFish
      • Как получить уведомления на почту о входе по SSH
      • О сканере OpenSCAP
      • О Censys — инструменте для поиска уязвимых поддоменов
      • О Scanless — инструменте для анонимного сканирования открытых портов
      • О SearchSploit — инструменте для поиска эксплойтов
      • Выбираем менеджер паролей
      • О Maltego
      • Устанавливаем и используем Snyk CLI в Windows
      • Проверяем безопасность Docker-образов с помощью Trivy
      • Об инструменте SpiderFoot
      • Сканируем сети с помощью скриптов Bash
      • О фреймворке Volatility на Windows
      • Определяем тип WAF с помощью WafW00f
      • Об инструменте ReNgine
      • О Foremost — инструменте для восстановления данных
      • Chisel — инструмент для проброса портов
      • O Yersinia
      • Об Acunetix
      • O Netcat
      • O Samba
      • O John the Ripper
      • О Common User Passwords Profiler (CUPP)
      • О RainbowCrack
      • Shodan
      • MobSF
      • Netsparker
      • Fortify
      • Veracode
      • Rapid7 InsightVM
      • Aircrack-ng
  • 🛠️ИНСТРУМЕНТЫ
    • ⌨️Беспроводные атаки
      • Aircrack-Ng
    • 🔑Атаки на пароли
      • Crunch
      • John
      • CUPP
      • Hashcat
      • Hydra
    • 👁️Сбор Информации
      • Masscan
      • Dnsenum
      • Parsero
      • Nmap
  • 👨‍💻Пентест
    • Методология
    • 🖥️Аппаратный/Физический доступ
      • Физические атаки
      • Побег из КИОСКа
  • 👾MITRE
    • 🗺️Тактики
      • 🏢Предприятия
        • Разведка
      • 📱Мобильные устройства
      • 🏭ICS
    • 💀CTI
      • ☠️Группы
        • admin@338
        • Ajax Security Team
        • ALLANITE
        • Andariel
  • 📟Справочник по безопасной разработке
    • 👨‍🔬CLIENT SIDE
      • Cross-Site Scripting [XSS]
      • Cross-Site Request Forgery [CSRF]
      • Clickjacking
      • Open Redirects
    • 🖥️SERVER SIDE
      • SQL Injections [SQLi]
      • XML External Entity Injection [XXE]
      • OS Command Injection [Command Execution]
      • File Upload
      • Server-Side Request Forgery [SSRF]
      • Host Header Injection
      • Аутентификация
      • Directory Traversal
      • Template Injection [SSTI]
    • API
  • 🐝OWASP
    • Cross Site Scripting (XSS)
Powered by GitBook
On this page
  • 1. Введение:
  • 2. Общие рекомендации:
  • 2.1 Сообщения об ошибках:
  • 2.2. Имя пользователя и электронная почта:
  • 2.3. Пароли:
  • 2.4. CAPTCHA:
  • 2.5. Ведение журнала и мониторинг:
  • 3. Выводы:
  1. Справочник по безопасной разработке
  2. SERVER SIDE

Аутентификация

1. Введение:

Аутентификация играет фундаментальную роль в большинстве современных приложений, поэтому она также является одним из самых лакомых кусочков для злоумышленников. В контексте веб-приложений аутентификация традиционно осуществляется путем ввода имени пользователя или электронной почты, а также пароля (который, по здравому смыслу, должен быть секретным для каждого пользователя).

Мы также рассмотрим управление сеансами, поскольку этот процесс тесно связан с современной аутентификацией. Как правило, сеансы поддерживаются на стороне сервера, таким образом играя свою роль в распознавании того, как обрабатывать входящие запросы. Обычно они различаются идентификаторами сессий, которые должны быть уникальными для каждого пользователя и сессии. Здесь важно отметить, что хорошие "идентификаторы сессий" представляются в виде больших случайных чисел, чтобы у хакеров было как можно меньше шансов ими воспользоваться.

2. Общие рекомендации:

2.1 Сообщения об ошибках:

Использование общих и одинаковых сообщений об ошибках играет важную роль в защите от утечек информации в системе аутентификации. Разработчику также следует обратить внимание на использование одинаковых кодов ответов HTTP.

Взгляните на следующий пример:

...
// Validating the existence of a user with the specified email.
const existingUser = await User.findOne({ email });
if (!existingUser) {
    return res
        .status(401)
        .json({ errorMessage: "Invalid email." });
}

// Validating the password attributed to that User object with the passwordHash
// from the database.
const passwordCorrect = await bcrypt.compare(password, existingUser.passwordHash);
if (!passwordCorrect) {
    return res
        .status(401)
        .json({ errorMessage: "Password is invalid for the given email." });
}
...

Приведенный выше код явно не годится. Злоумышленник может наблюдать за вариациями сообщений об ошибках и начать атаку грубой силы, которая, возможно, приведет к утечке некоторых существующих электронных писем из целевой базы данных.

Чтобы правильно санировать ошибки, мы должны предоставлять как можно меньше информации, но при этом сообщать пользователю, что произошла ошибка, чтобы он мог предпринять дальнейшие действия.

Очень хорошей альтернативой может быть:

...
// Validating the existence of a user with the specified email.
const existingUser = await User.findOne({ email });
if (!existingUser) {
    return res
        .status(401)
        .json({ errorMessage: "Invalid email or password." });
}

// Validating the password attributed to that User object with the passwordHash
// from the database.
const passwordCorrect = await bcrypt.compare(password, existingUser.passwordHash);
if (!passwordCorrect) {
    return res
        .status(401)
        .json({ errorMessage: "Invalid email or password." });
}
...

2.2. Имя пользователя и электронная почта:

Убедитесь, что ваши имена пользователей/идентификаторы пользователей не зависят от регистра. Пользователь 'bobi' и пользователь 'Bobi' должны относиться к одной и той же учетной записи. Это можно обеспечить с помощью "нижнего регистра" пользовательского ввода перед сохранением его в базе данных. Можно даже назначить случайно сгенерированное имя пользователя, обеспечив тем самым некую безопасность данных вместо заданных пользователем.

Важно НИКОГДА не разрешать вход в конфиденциальные учетные записи (т.е. внутренние учетные записи компании).

Если вам действительно необходимо публично отображать идентификационные данные пользователя, например, имя пользователя, вы можете создать поле Display Name в его профиле/аккаунте, чтобы НИКОГДА не сливать само имя пользователя.

2.2.1. Проверка электронной почты:

Если вы собираетесь отправить письмо с вашего сайта, не зная, является ли оно действительным, вам необходимо проверить адрес на соответствие реально работающему аккаунту электронной почты. Отправка писем на непроверенные адреса, такие как те, которые можно временно сгенерировать и использовать в Интернете, быстро внесет вас в черный список вашего поставщика услуг электронной почты, так как он заподозрит вас в возможности рассылки спама.

Сначала проверив формат письма, а затем просмотрев MX-запись для данного домена, мы можем легко создать очень эффективный валидатор электронной почты. Именно здесь играет свою роль ссылка для проверки электронной почты. Чтобы быть на 100 % уверенным в том, что письмо действительно, разработчик должен отправить одно из таких писем "Verify your account", которое затем должно быть проверено с помощью токена, уникального для каждого вновь созданного аккаунта.

import dns.resolver
import re

def checkFormat(email):
  #email regex 
  regex = '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b'
  if re.search(regex, email):
    return True
  else:
    return False

def checkEmailValid(email):
  if checkFormat(email):
    domain = email.split("@")[1] # 'bobi.io'
    for _ in dns.resolver.query(domain, 'MX'):
      return True
  return False

email = "vlad@bobi.io"
checkEmailValid(email) # True

2.3. Пароли:

Само собой разумеется, что пароли должны быть СТРОГИМИ. Я предполагаю, что вы уже знакомы с большинством правил хорошей практики использования ПАРОЛЕЙ, однако вот список наиболее важных, которые следует соблюдать:

  • Очень важно установить МИНИМАЛЬНУЮ ДЛИНУ - не менее 8-10 символов. Все, что меньше, считается ненадежным. Кроме того, вы можете установить МАКСИМАЛЬНУЮ ДЛИНУ около 60 символов, поскольку, скорее всего, алгоритм хэширования, который вы будете использовать для безопасного хранения пароля, имеет ограничение около 64 символов.

  • Разрешите использовать любые символы (включая Юникод и пробельные символы).

  • Вы даже можете попробовать использовать API HaveIBeenPwned, чтобы проверить, был ли вводимый пароль взломан или нет.

const hibp = require ('haveibeenpwned')();

hibp.pwnedpasswords.byPassword ('securepassword', (err, count) => {
  if (!count) {
    console.log ('Great! Password is not found.');
  } else {
    console.log ('Oops! Password was found ' + count + ' times!');
  }
});

2.3.1. Забыли пароль?

Как уже говорилось ранее, сообщения об ошибках обеспечивают важный уровень защиты от злоумышленников, который часто упускается из виду. Учитывая это, важно рассмотреть следующие ответные сообщения.

Вместо: "Мы только что отправили вам ссылку для сброса пароля".

Вы можете выбрать следующее: "Если этот адрес электронной почты есть в нашей базе данных, мы отправим вам письмо для сброса пароля".

2.4. CAPTCHA:

Одним из первых средств защиты от брутфорса является CAPTCHA, если использовать ее эффективным образом. Поскольку хакеры уже нашли обходные пути для некоторых CAPTCHA, эту технику следует использовать скорее для отсрочки атаки, чем для ее полного предотвращения.

2.5. Ведение журнала и мониторинг:

Включите протоколирование и мониторинг функций аутентификации для обнаружения атак/неудач в режиме реального времени.

  • Убедитесь, что все сбои регистрируются и проверяются.

  • Обеспечьте регистрацию и проверку всех сбоев паролей.

  • Убедитесь, что все блокировки учетных записей регистрируются и проверяются.

3. Выводы:

На данный момент наиболее важными аспектами правильной аутентификации являются: обеспечение того, чтобы сообщения об ошибках содержали как можно меньше краткой информации, правильное подтверждение и даже проверка существования адреса электронной почты, а также применение политики "безопасного пароля", чтобы было мало возможностей для атаки методом брутфорса.

Last updated 1 year ago

📟
🖥️