Hacker 101: видеокурс-введение в веб-безопасность + практические задания

безопасность

Интересуетесь веб-безопасностью? Тогда вы по адресу. Вы можете просмотреть видеокурс, который постепенно объясняет основные понятия, или же разобрать отдельные уязвимости в соответствующем разделе. Если вы новичок в веб-безопасности, то рекомендуется первый вариант. Кроме того, здесь вы найдёте разные задания, которые сможете выполнять по ходу изучения тем и применять на практике полученные знания.

Также рекомендуем посмотреть другие материалы по веб-безопасности: защита веб-приложений и курс по сетевой безопасности.

Прим. перев.  Видео на английском языке, некоторые из них дублируются между разделами.

Видеокурс для новичков

Введение

В этом видео мы заглянем в мозг хакера, поговорим о курсе и о том, как вы сможете применить полученные знания к реальным ситуациям.

Что вы изучите:

  • Необходимые инструменты;
  • Думаем как хакер;
  • Дисбаланс атакующего-защитника;
  • Упрощённая оценка угрозы и установление приоритетов;
  • Как писать хорошие баг-репорты;
  • Отражённый XSS (Cross-Site Scripting — «межсайтовый скриптинг»).

Погружаемся в веб

В этом видео мы поговорим о том, как работает веб с точки зрения безопасности.

Что вы изучите:

  • Основы HTTP;
  • Защита cookie;
  • Парсинг HTML;
  • MIME-сниффинг;
  • Сниффинг кодировки;
  • Правило ограничения домена;
  • CSRF (Межсайтовая подделка запроса).

XSS и авторизация

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

Что вы изучите:

  • XSS (Межсайтовый скриптинг):
    • Виды XSS:
      • Хранимые;
      • Отражённые;
      • DOM;
    • Обнаружение;
    • Эксплуатация;
    • Предотвращение;
  • Обход авторизации и принудительный просмотр:
    • Обнаружение;
    • Эксплуатация;
    • Предотвращение.

SQL и прочие инъекции

В этом видео речь пойдет о нескольких важных уязвимостях: SQL-инъекции, обходе каталога и командной инъекции.

Что вы изучите:

  • SQLi (SQL-инъекция):
    • Как она работает;
    • Базовая эксплуатация;
    • Предотвращение;
  • Слепая SQLi:
    • Что это такое;
    • Виды слепых SQLi;
    • Эксплуатация;
  • Обход каталога:
    • Что это такое;
    • Эксплуатация;
    • Предотвращение.
  • Командная инъекция
    • Что она из себя представляет
    • Возможная ситуация
    • Эксплуатация
    • Предовтращение

Фиксация сессии

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

Что вы изучите:

  • Фиксация сессии:
    • Что это такое;
    • Обнаружение;
    • Предотвращение.

Кликджекинг

В этом видео мы поговорим о кликджекинге – атаке, которая может обманом заставить вас что-либо сделать.
Что вы изучите:

  • Кликджекинг:
    • Что это такое;
    • Как это работает;
    • Как от этого защититься.

Уязвимости внедрения файлов

В этом видео речь пойдёт о локальном и удалённом внедрении файлов.

Что вы изучите:

  • Внедрение файлов:
    • LFI (Локальное внедрение файлов);
    • RFI (Удалённое внедрение файлов);
    • Обнаружение;
    • Эксплуатация;
    • Предотвращение.

Уязвимости загрузки файлов

В этом видео мы поговорим об ошибках, связанных с загрузкой файлов, широкой, но критичной категорией уязвимостей.
Что вы изучите:

  • Загрузка файлов:
    • Как работают многокомпонентные POST-запросы;
    • Атаки на основе имён файлов;
    • Атаки MIME;
    • Прячем данные в PNG-файлах;
    • Предотвращение.

Уязвимости нуль-терминаторов

В этом видео мы поговорим об уязвимостях нуль-терминаторов. Этот тип уязвимости не всегда понятен, но недооценивать его не стоит.
Что вы изучите:

  • Нуль-терминаторы:
    • Чем являются;
    • Каким образом относятся к сетевой безопасности;
    • Как проверить наличие таких уязвимостей;
    • Как их эксплуатировать

Непроверенные перенаправления

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

Что вы изучите:

  • Непроверенные перенаправления:
    • Что это такое;
    • Обнаружение;
    • Эксплуатация;
    • Предотвращение.

Хранение паролей

В этом видео мы обсудим методы безопасного хранения паролей и то, на что стоит обратить внимание.

Что вы изучите:

  • Использование Bcrypt (или Scrypt);
  • Цели обеспечения безопасности паролей;
  • Почему не стоит использовать такие алгоритмы, как MD5 и SHA1;
  • Что использовать взамен.

Криптография: основы

В этом видео речь пойдёт о ключевых понятиях в криптографии.

Что вы изучите:

  • XOR и его важность в криптографии;
  • Шифр Вернама;
  • Виды шифров:
    • Симметричный:
      • Потоковый;
      • Блочный;
    • Асимметричный;
  • Режимы шифрования:
    • ECB (Electronic Codebook, режим электронной кодовой книги);
    • CBC (Cipher block chaining, режим сцепления блоков шифротекста);
  • Хеши;
  • MAC (Message authentication code, имитовставка):
    • HMAC (Hash-based MAC).

Криптографические атаки

В этом видео мы поговорим о ряде атак, которые вы можете применять на криптосистемах в реальной жизни.

Что вы изучите:

  • Повторное использование ключа потокового шифра;
  • Перестановка блоков ECB;
  • Расшифровка ECB;
  • Дополнение (padding) и атака, связанная с дополнением (padding oracle attack);
  • Атака удлинением сообщения.

Криптография: подведение итогов

Это последнее видео из серии о криптографии. В нём мы дадим некоторые советы и рекомендации.

Что вы изучите:

  • Режим ECB:
    • Обнаружение;
    • Определение размера блока;
    • Определение смещения данных;
  • Обнаружение и эксплуатация padding oracle, PadBuster;
  • Общие советы;
  • Криптографические задачи для закрепления знаний.

Подробнее об уязвимостях

Кликджекинг

Видеоурок по теме:

Описание

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

Для проверки на кликджекинг можно попробовать встроить целевую страницу в iframe следующим образом:

<iframe src="http://example.com" width="500" height="500"></iframe>

Влияние на безопасность

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

Как защититься

Все страницы приложений должны устанавливать заголовок X-Frame-Options, который определяет, как можно встраивать страницу в iframe. SAMEORIGIN позволит встраивать только страницы одного источника; DENY полностью запретит встраивание. Это позволит предотвратить кликджекинг во всех современных веб-браузерах.

Более того, вы также можете настроить политику безопасности контента с директивой frame-ancestors, указывающей на разрешённые хосты, чтобы предотвратить кликджекинг. Настройка frame-ancestors: none, например, полностью запрещает встраивать страницу.

Командная инъекция

Видеоурок по теме:

Описание

Такие атаки происходят, когда пользовательский ввод используется для создания команд для выполнения.

Влияние на безопасность

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

Как защититься

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

Межсайтовая подделка запроса (CSRF)

Видеоурок по теме:

Описание

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

<iframe style="display:none" name="csrf-frame"></iframe>
<form method='POST' action='http://example.com/new-password' target="csrf-frame" id="csrf-form" style="display:none">
	<input type='hidden' name='username' value='example'>
    <input type='hidden' name='password' value='password1234'>
	<input type='submit' value='submit'>
</form>
<!-- Автоматическая отправка формы после загрузки страницы -->
<script>document.getElementById("csrf-form").submit()</script>

Форма отправляет POST-запрос на http://example.com/new-password, содержащий логин жертвы, и устанавливает новый пароль для этой учетной записи. Функциональная часть скрыта и выполняется автоматически при просмотре страницы.

Влияние на безопасность

Если злоумышленник заставит жертву перейти по URL-адресу, который им контролируется, то он сможет выполнять действия, несущие угрозу конфиденциальности данных жертвы. Любое действие, не требующее токенов CSRF, сможет быть выполнено злоумышленником.

Как защититься

При создании сессий для пользователей следует генерировать случайную строку (CSRF-токен) и связывать её с этим сеансом. При выполнении пользователем действий этот токен должен отправляться на сервер вместе с другими данными запроса и сравниваться с токеном, расположенным на сервере. Если выявлено несоответствие, то запрос должен быть отклонён.

Обход каталога

Видеоурок по теме:

Описание

Атаки обхода каталога происходят, когда данные, доступные атакующему, используются для составления путей каталога без проверки. Чаще всего это происходит, когда ../ (переход в родительский каталог) разрешено использовать в качестве компонента пути (например, https://example.com/?path=../../../file). Объединив эти компоненты, часто можно получить доступ к каждому файлу в системе.

Влияние на безопасность

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

Как защититься

По возможности пользовательский ввод не должен использоваться при составлении путей. Однако, если это необходимо, пользовательский ввод быть профильтрован; никакие разделители (\ в Windows, / в большинстве других систем) не должны допускаться для пользовательского ввода.

Локальное / удалённое внедрение файлов

Видеоурок по теме:

Описание

Уязвимости внедрения файлов возникают, когда веб-приложение создаёт путь к исполняемому коду с использованием управляемой злоумышленником переменной, что позволяет ему решать, какой код будет выполняться. Такие уязвимости свойственны динамическим языкам вроде PHP.

Влияние на безопасность

В зависимости от типа атаки, злоумышленник может запустить код на сервере из локального или удалённого файла. Если уязвимость локальна, злоумышленник не сможет запустить собственный код.

Как защититься

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

Некорректная обработка авторизации

Видеоурок по теме:

Описание

При неправильной авторизации приложение не проверяет правильность доступа пользователей к функциям, предоставляя им доступ к данным.

Влияние на безопасность

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

Как защититься

Приложение должно строго проверять авторизацию пользователя до предоставления доступа к каждой функции. Это включает в себя не только уровни доступа (например, обычный пользователь или администратор), но и доступ к конкретным данным.

Небезопасное хранение паролей

Видеоурок по теме:

Описание

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

  • Уникален для каждой задачи. Даже при использовании одного и того же пароля хеши не должны повторяться. Это предотвращает компрометацию одного хеша пароля от компрометации всех остальных экземпляров того же пароля;
  • Медленное создание / проверка – это предотвращает или сильно ограничивает атаки на пароли методом полного перебора;
  • Неприступен для радужных таблиц – это отнимает у атакующих возможность всё вычислить и быстро взломать пароль.

Без соблюдения всех этих требований пароли уязвимы для атаки. Не стоит использовать хеш-функции, такие как MD5 и семейство SHA, для хеширования паролей – они быстрые и могут быть легко взломаны с помощью инструментов вроде hashcat.

Влияние на безопасность

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

Как защититься

Использование надёжного алгоритма хранения паролей (алгоритм генерации ключа), таких как bcrypt, PBKDF2 и Argon2, является оптимальным решением этой проблемы, поскольку они медленные и потому требуют большей вычислительной мощности для взлома, чем алгоритм быстрого хеширования (например, MD5). Имейте в виду, что для PBKDF2 рекомендуется устанавливать большое количество циклов.

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

Неправильная обработка нуль-терминаторов

Видеоурок по теме:

Описание

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

Влияние на безопасность

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

Как защититься

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

Уязвимость padding oracle

Видеоурок по теме:

Описание

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

Влияние на безопасность

Знания факта, получается ли при расшифровке шифротекста открытый текст с корректным дополнением, достаточно атакующему для проведения успешной атаки на шифрование в режиме CBC. Если злоумышленник может подавать какому-то сервису шифротексты, а тот будет возвращать ему информацию, корректно ли дополнение, — он сможет вскрыть любой шифротекст.

Как защититься

Сервер должен всегда отправлять одинаковую ошибку, вне зависимости от того, что её вызвало. Кроме того, все зашифрованные данные должны содержать механизм проверки целостности вроде HMAC. Это предотвратит любые уязвимости, связанные с подделкой шифротекста.

Отражённый XSS

Видеоурок по теме:

Описание

Отражённый XSS происходит, когда пользовательский ввод проверяется ненадлежащим образом или не очищается перед вставкой на страницу.

Влияние на безопасность

Если злоумышленник может заставить жертву перейти по определенному URL-адресу (например, https://example.com/?param= <script> alert (1) </ script>), он, возможно, сможет выполнить произвольный JavaScript на странице. Это позволяет злоумышленнику выполнять любые действия в качестве пользователя, выкачивать данные и многое другое.

Как защититься

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

Фиксация сессии

Видеоурок по теме:

Описание

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

Влияние на безопасность

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

Как защититься

Когда пользователь входит в приложение или выходит из него, он должен получать новый идентификатор сеанса. Это предотвратит атаки фиксации сеанса, а также несколько других менее распространённых атак. Кроме того, идентификаторы сеансов никогда не должны передаваться или использоваться в строках запросов; это предотвращает утечку сеанса и помогает избежать его фиксации.

Хранимый XSS

Видеоурок по теме:

Описание

Хранимый XSS происходит, когда пользовательский ввод хранится в базе данных, файле или в другом месте и затем отправляется в браузер без надлежащей проверки и очистки.

Влияние на безопасность

Хранимый XSS позволяет злоумышленнику выполнять произвольный JavaScript на странице. Это даёт ему возможность выполнять любые действия в качестве пользователя, выкачивать данные и многое другое.

Как защититься

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

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

Повторное использование ключа потокового шифра

Видеоурок по теме:

Описание

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

Сообщение 1

Сообщение 2

Ключ

Зашифрованное сообщение 1

Зашифрованное сообщение 2

После применения XOR на обоих зашифрованных сообщениях

Влияние на безопасность

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

Как защититься

Не используйте ключи для шифрования повторно, если можете без этого обойтись. Однако в тех случаях, когда вам это необходимо, для обеспечения безопасности нужно использовать специальный одноразовый код. Для алгоритмов, которые его не поддерживают (например, RC4), рекомендуется применять XOR на коде и ключе перед использованием последнего.

Захват поддомена

Описание

Уязвимости захвата поддомена возникают, когда поддомен (subdomain.example.com) указывает на страницу сервиса (например, страницы GitHub, Heroku и т.д.), которая была удалена или перемещена. Например, если subdomain.example.com указывал на GitHub-страницу и пользователь решил удалить свою страницу, злоумышленник может создать свою страницу, добавить файл CNAME, содержащий subdomain.example.com, и завладеть этим поддоменом.

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

безопасность

Влияние на безопасность

Успешный захват поддомента позволяет злоумышленнику перенаправлять вас с поддомена на свой сайт. Кроме того, если поддомен является дочерним доменом базового имени сервиса, то злоумышленник может читать и устанавливать файлы cookie и для базового имени, например subdomain.example.com может устанавливать cookie для example.com.

Как защититься

Всегда удаляйте записи DNS в поддомене, указывающем на удалённые службы, чтобы исключить возможность захвата.

Непроверенные перенаправления

Видеоурок по теме:

Описание

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

http://example.com/?return_to=http://example.com/home

Злоумышленник может контролировать значение параметра return_to и перенаправлять вас куда захочет.

http://example.com/?return_to=http://evil.com

Вот пример, чтобы вы поняли, как это работает:

https://httpbin.org/redirect-to?url=https://tproger.ru

URL выглядит так, словно он ведёт на httpbin.org, но на самом деле он перенаправляет нас на tproger.ru.

Влияние на безопасность

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

Как защититься

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

Упражнения

Уровень 0. Взламываем банк

В этом упражнении вам предоставляется интерфейс банковского счета. В нём присутствует множество уязвимостей, о которых мы уже говорили, а также несколько, которые будут вам в новинку.

Подсказка: логическая ошибка в приложении является хорошим местом для старта.

Перейти к упражнению

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

Уровень 1. Взламываем соцсеть

В этом упражнении вам на растерзание предоставлена простая социальная сеть.

Подсказка: обратите внимание на первый пост.

Перейти к упражнению

Уровень 2. Взламываем свой профиль

В этом упражнении вам предоставляется интерфейс управления и просмотра профиля.

Подсказка: вспомните наши разговоры о XSS.

Перейти к упражнению

Уровень 3. Взламываем CMS

В этом упражнении вы увидите базовый интерфейс CMS. Быть администратором – весело!

Подсказка: обратите внимание на JavaScript.

Перейти к упражнению

Уровень 4. Взламываем новостной агрегатор

Ваш агрегатор новостей. Можете поделиться с нами какими-нибудь хорошими ссылками?

Подсказка: то, что вы авторизованы, ещё не значит, что вам всё дозволено.

Перейти к упражнению

Уровень 5. Репозиторий с документами

Время читать книги!

Перейти к упражнению

Уровень 6. Студенческий центр

Пора вести списки студентов!

Перейти к упражнению

Уровень 7. Стража

Попробуйте получить недостающие учётные данные.

Перейти к упражнению

Уровень 8. Обмен документами

В этом упражнении вы можете загружать свои файлы.

Перейти к упражнению

Перевод статьи «Welcome to Hacker101!»

Ещё интересное для вас:
Тест: чьё это рабочее место? Угадываем айтишников по их столам
Тест: что вы знаете о работе мозга?
Тест: какой язык программирования вам стоит выбрать для изучения?