ЛУЧШИЙ САЙТ ДЛЯ ВЕБ-РАЗРАБОТЧИКОВ
Кибербезопасность. Уроки для начинающих

Кибербезопасность. Веб-приложения


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


HTTP протокол

HTTP - это протокол-носитель, который позволяет браузерам и приложениям получать такой контент, как HTML (язык гипертекстовой разметки), CSS (каскадные таблицы стилей), изображения и видео.


URL-адреса, параметры и схема запроса

Для доступа к веб-приложению мы используем URL-адрес (Унифицированный указатель ресурсов), например: https://www.google.com/search?q=w3schools+cyber+security&ie=UTF-8

URL-адрес google.com содержит домен, скрипт, к которому осуществляется доступ, и параметры запроса.

Скрипт, к которому мы обращаемся, называется /search. Символ / указывает, что он содержится в верхнем каталоге на сервере, где обслуживаются файлы. Символ ? указывает входные параметры скрипта, а символ & разграничивает различные входные параметры. В данном URL входные параметры:

  • q со значением кибербезопасности w3schools
  • т.е. со значением UTF-8

Значение этих входных данных определяется приложением веб-серверов.

Иногда вы увидите просто / или /? указывающие, что скрипт был настроен для обслуживания ответа на этот адрес. Обычно этот скрипт представляет собой что-то вроде индексного файла, который улавливает все запросы, если не указан конкретный скрипт.

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

  • HTTP
  • HTTPS
  • FTP
  • SSH
  • SMB

HTTP Заголовки

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

Пример запроса к http://google.com

GET /search?q=w3schools+cyber+security&ie=UTF-8 HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8
Referer: https://w3schools.com/
Accept-Encoding: gzip, deflate
Cookie: cookie1=value1;cookie2=value2

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

Заголовок Объяснение
GET /search... HTTP/1.1 GET - это глагол, который мы используем для доступа к приложению. Подробно объяснено в разделе HTTP-глаголы. Мы также видим путь и параметры запроса и версию HTTP.
Host: google.com Этот заголовок указывает целевую службу, которую мы хотим использовать. Сервер может иметь несколько сервисов, как описано в разделе VHOSTS.
User-Agent Клиентское приложение, которым в большинстве случаев является браузер, может идентифицировать себя по версии, движку и операционной системе.
Accept Определяет, какой контент может принимать клиент
Referer: https://w3schools.com/ Если клиент кликнул ссылку с другого веб-сайта, используется заголовок Referer, чтобы указать, откуда пришел клиент.
Accept-Encoding: gzip, deflate Можно ли сжать или закодировать контент? Это определяет, что мы можем принять
Cookie Файлы cookie - это значения, отправленные сервером в предыдущих запросах, которые клиент отправляет обратно в каждом последующем запросе. Подробно объяснено в разделе Состояние

На этот запрос сервер ответит заголовками и содержимым. Примеры заголовков показаны ниже:

HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: <cookie value>
<website content>

Заголовок и содержимое ответа - вот что определяет то, что мы увидим в браузере. Заголовки ответа HTTP объясняются следующим образом:

Заголовок Объяснение
HTTP/1.1 200 OK Код ответа HTTP. Подробно объяснено в разделе "Коды ответа HTTP".
Content-Type: text/html Задает тип возвращаемого содержимого, например HTML, JSON или XML
Set-Cookie: Любые особые значения, которые клиент должен запомнить и вернуть в следующем запросе.

HTTP глаголы

При доступе к веб-приложению клиент получает инструкции о том, как отправлять данные в веб-приложение. Приложение принимает множество глаголов.

!Verb Используется для
GET Обычно используется для получения значений через параметры запроса
POST Используется для отправки данных в сценарий через значения в теле запроса, отправленного на веб-сервер. Обычно это включает создание, загрузку или отправку большого количества данных
PUT Часто используется для загрузки или записи данных на веб-сервер
DELETE Укажите ресурс, который следует удалить
PATCH Может использоваться для обновления ресурса новым значением

Они используются, как того требует веб-приложение. Веб-сервисы Restful (REST) особенно хороши при использовании полного массива HTTP-глаголов для определения того, что следует делать на бэкэнде.


Коды ответа HTTP

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

Код Объяснение
200 Приложение вернулось нормально
301 Сервер просит клиента навсегда запомнить перенаправление в новое место, где клиент должен получить доступ
302 Временно перенаправить. Клиенту не нужно сохранять этот ответ
400 Клиент сделал неверный запрос
403 Клиенту не разрешен доступ к этому ресурсу. Требуется авторизация
404 Клиент попытался получить доступ к несуществующему ресурсу
500 Ошибка сервера при попытке выполнить запрос

REST

Rest-сервисы, иногда называемые службами RESTful, в полной мере используют HTTP-глаголы и HTTP-коды ответа для облегчения использования веб-приложения. Службы RESTful часто используют части URL-адреса в качестве параметра запроса, чтобы определить, что происходит в веб-приложении. REST обычно используется API ("Application Programming Interfaces" - "Интерфейсы прикладного программирования").

URL-адреса REST будут вызывать функции, основанные на различных элементах URL-адреса.

Пример URL-адреса REST: http://example.com/users/search/w3schools

Этот URL-адрес будет вызывать функциональность как часть URL-адреса вместо параметров запроса. Мы можем расшифровать URL как:

Параметр Комментарий
users Доступ к пользовательской части функциональности
search Доступ к функции поиска
w3schools Пользователь для поиска

Сессии & Состояние

Не существует встроенного способа для сервера идентифицировать возвращающегося посетителя в HTTP. Чтобы веб-сервер мог идентифицировать пользователя, секретное значение должно быть передано Клиенту и от него в каждом запросе. Обычно это делается с помощью файлов cookie в заголовках, однако распространены и другие способы, например, с помощью параметров GET и POST или других заголовков. Передача состояния через параметры GET не рекомендуется, поскольку такие параметры часто регистрируются на сервере или в посредниках, таких как прокси.

HTTP Сессии

Вот несколько распространенных примеров файлов cookie, которые позволяют приложению на веб-сервере контролировать сеансы и состояние:

  • PHPSESSID
  • JSESSIONID
  • ASP.NET_SessionID

Эти значения представляют определенное состояние на сервере, часто называемое сеансом. Это состояние представляет такие вещи, как:

  • Каким пользователем вы вошли в систему?
  • Привилегии и разрешения

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

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

  • JWT ("JSON Web Tokens")
  • ASP.Net ViewState

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

Консоль разработчика

В Google Chrome файлы cookie были идентифицированы на вкладке "Приложение" выше.

Примечание: Можете ли вы догадаться, почему файлы cookie были замаскированы на скриншоте, чтобы вы не могли их прочитать?

Виртуальные хосты

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

Virtual Hosts


URL кодирование

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

Кодировка URL заменяет небезопасные символы знаком % и двумя шестнадцатеричными цифрами. Например:

  • Процент заменяется на %25
  • Пробел заменяется на %20
  • Кавычки заменены на %22

CyberChef - отличный инструмент для анализа текста и выполнения таких операций, как декодирование URL. Вы можете попробовать его в своём браузере здесь: https://gchq.github.io/CyberChef/

Примечание: Поиграйте с Cyber Chef и посмотрите, сможете ли вы узнать, что содержится в следующем сообщении в символах, закодированных в URL: %48 %65 %6c %6c %6f %20 %64 %65 %61 %72 %20 %77 %33 %73 %63 %68 %6f %6f %6c %73 %20 %73 %74 %75 %64 %65 %6e %74 %2e %20 %48 %6f %70 %65 %20 %79 %6f %75 %20 %61 %72 %65 %20 %6c %65 %61 %72 %6e %69 %6e %67 %20 %73 %6f %6d %65 %74 %68 %69 %6e %67 %20 %74 %6f %64 %61 %79 %21

JavaScript

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

JavaScript также участвует во многих атаках на веб-приложения и клиентские приложения, такие как браузеры.


Шифрование с помощью TLS

Протокол HTTP не поддерживает шифрование передаваемых данных, поэтому для поддержки шифрования добавляется оболочка HTTP. Это обозначается буквой S после HTTP, т.е. HTTPS.

Раньше использовалось шифрование SSL ("Secure Sockets Layer" - "Уровень защищенных гнезд"), но с тех пор оно устарело. Вместо этого для обеспечения шифрования обычно используется TLS ("Transport Layer Security" - "Безопасность транспортного уровня").