Веб-безопасность/Введение в веб-технологии
ПО, которое необходимо (обязательно!) скачать/установить к семинару (всё работает под Windows/Linux/Mac Os):
- Ubuntu Linux 16.04 (виртуальная машина)
- Burp Suite Pro Community Edition: https://portswigger.net/burp/communitydownload
Содержание
Сеть
Сетевая модель OSI
Сетевая модель OSI — сетевая модель стека (магазина) сетевых протоколов OSI. Посредством данной модели различные сетевые устройства могут взаимодействовать друг с другом. Модель определяет различные уровни взаимодействия систем. Каждый уровень выполняет определённые функции при таком взаимодействии.
Есть несколько уровней этой модели:
- Физический уровень
- Канальный уровень
- Сетевой уровень
- Транспортный уровень
- Сеансовый уровень
- Уровень представления
- Прикладной уровень
Физический уровень
Физический уровень — нижний уровень модели, который определяет метод передачи данных, представленных в двоичном виде, от одного устройства (компьютера) к другому. Физический уровень определяет такие виды сред передачи данных как оптоволокно, витая пара, коаксиальный кабель, спутниковый канал передач данных и т. п. Протоколы физического уровня: IEEE 802.15 (Bluetooth), 802.11 Wi-Fi и т. п.
Канальный уровень
Канальный уровень предназначен для обеспечения взаимодействия сетей на физическом уровне и контроля ошибок, которые могут возникнуть. Полученные с физического уровня данные, представленные в битах, он упаковывает в кадры, проверяет их на целостность и, если нужно, исправляет ошибки (формирует повторный запрос повреждённого кадра) и отправляет на сетевой уровень. На этом уровне работают коммутаторы, мосты и другие устройства. Пример протокола, работающего на этом уровне - IEEE 802.3 (Ethernet).
Сетевой уровень
Сетевой уровень модели предназначен для определения пути передачи данных. Отвечает за трансляцию логических адресов и имён в физические, определение кратчайших маршрутов, коммутацию и маршрутизацию, отслеживание неполадок и «заторов» в сети. Работающие на этом уровне устройства (маршрутизаторы) условно называют устройствами третьего уровня (по номеру уровня в модели OSI). Наиболее важные протоколы данного уровня - IP/IPv4/IPv6, о них мы подробнее поговорим ниже.
Транспортный уровень
Транспортный уровень модели предназначен для обеспечения надёжной передачи данных от отправителя к получателю. Примеры протоколов, работающего на этом уровне - TCP (Transmission Control Protocol), UDP (User Datagram Protocol).
Сеансовый уровень
Сеансовый уровень модели обеспечивает поддержание сеанса связи, позволяя приложениям взаимодействовать между собой длительное время. Примеры протоколов, работающего на этом уровне - PPTP (Point-to-Point Tunneling Protocol), RPC (Remote Procedure Call Protocol).
Уровень представления
Уровень представления обеспечивает преобразование протоколов и кодирование/декодирование данных. Важный протокол данного уровня - SSL и TLS, которые обеспечивают шифрование в протоколе HTTPS (о нём ниже).
Прикладной уровень
Прикладной уровень — верхний уровень модели, обеспечивающий взаимодействие пользовательских приложений с сетью:
- позволяет приложениям использовать сетевые службы:
- удалённый доступ к файлам и базам данных,
- пересылка электронной почты;
- отвечает за передачу служебной информации;
- предоставляет приложениям информацию об ошибках;
- формирует запросы к уровню представления.
Важные протоколы данного уровня - HTTP и HTTPS. О них подробно мы поговорим ниже.
Сетевая модель TCP/IP
Кроме модели OSI используется так же модель TCP/IP.
TCP/IP — сетевая модель передачи данных, представленных в цифровом виде. Модель TCP/IP и модель OSI являются концептуальными моделями, используемыми для описания всех сетевых коммуникаций, в то время как TCP/IP сама по себе также является важным протоколом, используемым во всех операциях Интернета. Модель TCP/IP широко используется в описании сети и старше модели OSI, у них обоих много слоев.
Стек протоколов TCP/IP делится на 4 уровня:
- Уровень сетевого доступа
- Сетевой
- Транспортный
- Прикладной
Прикладной уровень соответствует сеансовый уровень , уровень представления и прикладной уровень, а уровню сетевого доступа - физический и канальный уровни.
Ethernet
Пример протокола уровня сетевого доступа - Ethernet. Это семейство технологий пакетной передачи данных между устройствами. Описывается семейством стандартов 802.3. Каждому устройству присваивается уникальный идентификатор - MAC-адрес.
Ip
На сетевом уровне чаще всего используется протокол IP. IP-адрес — уникальный сетевой адрес узла в компьютерной сети, построенной на основе стека протоколов TCP/IP. Используется IPv4 (32 бита ) и IPv6 (128 бит).
Маска подсети — битовая маска для определения по IP-адресу адреса подсети и адреса узла (хоста, компьютера, устройства) этой подсети.
IP-адрес: 11000000 10101000 00000001 00000010 (192.168.1.2)
Маска подсети: 11111111 11111111 11111110 00000000 (255.255.254.0)
Адрес сети: 11000000 10101000 00000000 00000000 (192.168.0.0)
Порт
Порт — натуральное число, заголовках протоколов транспортного уровня модели OSI. Используется для определения процесса-получателя пакета в пределах одного хоста. На прикладном уровне чаще всего используется протокол HTTP(S).
TCP
Протокол, предназначенный для управления передачей данных. Пакеты в TCP называются сегментами.
HTTP/HTTPS
HTTP (англ. HyperText Transfer Protocol — «протокол передачи гипертекста») — протокол прикладного уровня передачи данных. Так же есть протокол HTTPS (S - Secure) — расширение протокола HTTP для поддержки шифрования в целях повышения безопасности. Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке: Стартовая строка (англ. Starting line) — определяет тип сообщения; Заголовки (англ. Headers) — характеризуют тело сообщения, параметры передачи и прочие сведения; Тело сообщения (англ. Message Body) — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.
В стартовой строке могут быть следующие типы сообщений:
в случае запроса:
- GET - запрашивает представление указанного ресурса.
- HEAD - запрашивает заголовки, идентичные тем, что возвращаются, если указанный ресурс будет запрошен с помощью HTTP-метода GET
- OPTIONS - используется для описания параметров соединения с целевым ресурсом.
- DELETE - удаляет указанный ресурс.
- PUT - создает новый ресурс или заменяет представление целевого ресурса, данными представленными в теле запроса.
- PATCH - применяет частичную модификацию к ресурсу.
- POST - предназначен для отправки данных на сервер. Тип тела запроса указывается в заголовке Content-Type.
- CONNECT - запускает двустороннюю связь с запрошенным ресурсом.
- TRACE - выполняет проверку обратной связи по пути к целевому ресурсу, предоставляя полезный механизм отладки.
в случае ответа:
- 1xx - информирование о процессе передачи.
- 2xx - информирование о случаях успешного принятия и обработки запроса клиента. В зависимости от статуса, сервер может ещё передать заголовки и тело сообщения.
- 3xx - сообщает клиенту, что для успешного выполнения операции необходимо сделать другой запрос.
- 4xx - указание ошибок со стороны клиента.
- 5xx - информирование о случаях неудачного выполнения операции по вине сервера
Заголовки HTTP (англ. HTTP Headers) — это строки в HTTP-сообщении, содержащие разделённую двоеточием пару имя-значение. Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой.
Один из самых важных заголовков - cookie.
Cookie — небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере пользователя. Необходимо для: аутентификации пользователя; хранения персональных предпочтений и настроек пользователя; отслеживания состояния сеанса доступа пользователя; ведения статистики о пользователях; Вот выглядит запрос по URL https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 (Красным цветом выделена стартовая строка, синим - заголовки, фиолетовым - тело запроса)
GET /wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: WMF-Last-Access=14-Oct-2019; WMF-Last-Access-Global=14-Oct-2019; mwPhp7Seed=f2e; VEE=wikitext; PHP_ENGINE=php7; GeoIP=RU:MOW:Moscow:55.75:37.62:v4
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 14 Oct 2019 13:19:08 GMT
и вот как выглядит ответ на него:
HTTP/1.1 200 OK
Date: Mon, 14 Oct 2019 14:09:06 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 127493
...
<!DOCTYPE html>
<html class="client-nojs" lang="ru" dir="ltr">
<head>
<meta charset="UTF-8"/>
<title>Википедия — свободная энциклопедия</title>
...
HTML
HTML - стандартизированный язык разметки документов в интернете. Большинство веб-страниц имеют содержание разметки на языке HTML. Например, зайдём на сайт http://example.org/ посмотрим её HTML разметку: Важное, что сейчас нужно знать про HTML - теги. Вот примеры тега:
<strong>Текст между двумя тегами — открывающим и закрывающим.</strong> <a href="http://www.example.com">Здесь элемент содержит атрибут href, то есть гиперссылку.</a> </br>
Обычно используются парные теги — открывающий, или начальный (, <a href="http://www.example.com">), и закрывающий, или конечный (, </a>). Возможно также применение одиночного тега (
).
DNS
Для получения IP адреса сайта используется DNS. DNS - компьютерная распределённая система для получения информации о доменах. Доме́н — узел в дереве имён, вместе со всеми подчинёнными ему узлами (если таковые имеются), то есть именованная ветвь или поддерево в дереве имён. Структура доменного имени отражает порядок следования узлов в иерархии; доменное имя читается слева направо от младших доменов к доменам высшего уровня (в порядке повышения значимости): вверху находится корневой домен (имеющий идентификатор «.»(точка)), ниже идут домены первого уровня (доменные зоны), затем — домены второго уровня, третьего и т. д. (например, для адреса ru.wikipedia.org. домен первого уровня — org, второго — wikipedia, третьего — ru). DNS позволяет не указывать точку корневого домена. Поддомен — подчинённый домен (например, wikipedia.org — поддомен домена org, а ru.wikipedia.org — домена wikipedia.org). Теоретически такое деление может достигать глубины 127 уровней, а каждая метка может содержать до 63 символов, пока общая длина вместе с точками не достигнет 254 символов. Но на практике регистраторы доменных имён используют более строгие ограничения. Например, если у вас есть домен вида mydomain.ru, вы можете создать для него различные поддомены вида mysite1.mydomain.ru, mysite2.mydomain.ru и т. д.
Proxy
Прокси-сервер, иначе - сервер-посредник — промежуточный сервер (комплекс программ) в компьютерных сетях, выполняющий роль посредника между пользователем и целевым сервером (при этом о посредничестве могут как знать, так и не знать обе стороны), позволяющий клиентам как выполнять косвенные запросы (принимая и передавая их через прокси-сервер) к другим сетевым службам, так и получать ответы. Последнее определение, которое нам понадобится в дальнейшем - proxy-сервер. Прокси-сервер, иначе - сервер-посредник — промежуточный сервер (комплекс программ) в компьютерных сетях, выполняющий роль посредника между пользователем и целевым сервером (при этом о посредничестве могут как знать, так и не знать обе стороны), позволяющий клиентам как выполнять косвенные запросы (принимая и передавая их через прокси-сервер) к другим сетевым службам, так и получать ответы.
Инструменты
В данном курсе нам понадобятся следующие инструменты:
cURL
cURL — кроссплатформенная служебная программа командной строки, позволяющая взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL. cURL делает только GET запрос. пример запроса:
curl http://www.google.com/
netcat
netcat — утилита Unix, позволяющая устанавливать соединения TCP и UDP, принимать оттуда данные и передавать их. Можно делать как GET, так и POST запросы. пример запроса:
$ nc www.google.com 80 GET / HTTP/1.1 Host: www.google.com
ping
Утилита для проверки целостности и качества соединений в сетях на основе TCP/IP, а также обиходное наименование самого запроса.
home:~$ ping -i 5 -c 3 example.org
traceroute
Служебная компьютерная программа, предназначенная для определения маршрутов следования данных в сетях TCP/IP.
home:~$ traceroute example.org
Host
Утилита в UNIX-системах, предназначенная для обращения и получения информации DNS-серверов.
home:~$ host example.org
Burp Suit - Для анализа HTTP-взаимодействия между клиентом и сервером, а также для вмешательства в него удобен Burp Suite. Он может работать как HTTP-proxy, то есть получать от клиента запрос и пересылать его серверу, получать ответ сервера и передавать его клиенту. При этом Burp может показывать запросы и ответы пользователю, задерживать и изменять их. Кроме этого, он может формировать и отправлять новые HTTP-запросы сам ("вручную").
Burp
Рекомендуется использовать Burp Suite в связке с браузером Firefox. Для полноценной работы прокси-сервера с браузером нужно настроить следующее: включить и настроить сам прокси-сервер; перенаправить весь трафика браузера на прокси-сервер; добавить корневой сертификат прокси-сервера в список доверенных для возможности перехвата HTTPS-траффика. Настройка прокси-сервера В первую очередь нужно запустить Burp Suite, прокликав несколько раз кнопку "Next" и ей подобные. Во вкладке Proxy/Options убедиться в том, что стандартный слушающий порт активен (отметка в столбце Running) или выбрать новый (Add). Во вкладке Proxy/Intercept убедиться в том, что активный перехват трафика выключен (Intercept is off), в противном случае нажать на кнопку "Intercept is on". Настройка браузера Для добавления прокси-сервера в настройках браузера Firefox нужно поискать по ключевому слову "proxy" или "прокси", а затем добавить прокси-сервер http://localhost:8080 (или любой другой свободный порт, его можно настроить в Burp Suite, 8080 - стандартный). Затем в браузере перейти по ссылке на главную страницу самого прокси-сервера (работает только при перенаправлении трафика через прокси-сервер). И скачать корневой сертификат неких любителей портвейна (PortSwigger). После этого нужно добавить этот сертификат в браузер (для Firefox: поиск в настройках по "certificate" или "сертификат" и кнопка "Import" в Менеджере сертификатов). А потом убедиться, что PortSwigger CA появился в списке сертификатов. Иструкция по применению Теперь все готово для тестирования любого веб-приложения. Для нашего курса нам понадобятся только 2 инструмента из набора Burp Suite: Proxy; Repeater. Вкладка Proxy/Intercept позволяет изменять запросы, отправляемые бразуером "на лету", а затем наблюдать за отображением ответа на модифицированный запрос в браузере. В этой вкладке можно редактировать запросы как тест, а затем пересылать их дальше кнопкой "Forward". Вкладка Proxy/HTTP history отображает историю всех HTTP(s)-запросов, отправленных браузером, и ответов на них. Для того, чтобы можно было отредактировать и послать на сервер какой-то запрос из истории, нужно кликнуть правой кнопкой мыши на нужный запрос и выбрать пункт "Send to Repeater". После этого можно перейти во вкладку Repeater, редактировать выбранный запрос как тест и посылать его на сервер кнопкой "Go". В правой половине вкладки будет отображаться ответ от сервера на этот запрос.