Веб для тестирования на проникновение. Урок 1

Введение

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

Веб для тестирования на проникновение
Веб для тестирования на проникновение

Глобальная сеть

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

Модель интернет-безопасности

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

Риски веб-безопасности

Веб-приложения подвержены всем рискам, присущим обычным программам:

  • утечка информации;
  • репутационный ущерб;
  • потеря информации;
  • потеря денег.

Web-технологии

Архитектура

Большинство веб-приложений базируются на 3-х компонентах:

  1. Клиент: в большинстве случаев через веб-браузер.
  2. Веб-сервер, который будет получать запросы от клиента. Сервер приложений может также использоваться для обработки запросов, и в этом случае веб-сервер будет просто пересылать запросы на сервер приложений;
  3. Бэкэнд для хранения и последующего извлечения резервной информации – чаще всего в виде базы данных.

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

Front-end технологии

Большинство клиентских технологий используются ежедневно всеми пользователями Интернет: HTML, JavaScript, Flash … через свои браузеры (Chrome, Firefox, Internet Explorer, Safari …). Тем не менее, клиенты веб-приложений также могут оказаться «толстыми клиентами» для подключения к веб-службе, или просто скриптом.

Back-end технологии

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

Серверную сторону можно условно разделить на несколько подкатегорий:

  • веб-серверы — Apache, lighttpd, Nginx, IIS…
  • серверы приложений — Tomcat, JBoss, Oracle application server…
  • используемые языки программирования — PHP, Java, Ruby, Python, ASP, C #… Язык программирования также может использоваться, как часть фрэймворков Ruby-on-Rails, .Net MVC, Django и т.д.

Back-end база данных

Резервная копия информации может храниться как на том же веб-сервере, так и на другом. Это может объяснить странное поведение во время использования некоторых уязвимостей для проникновения.

Несколько примеров бэкэндов:

  • простые файлы.
  • реляционные базы данных — MySQL, Oracle, SQL Server, PostgreSQL.
  • другие базы данных — MongoDB, CouchDB.
  • каталоги – OpenLDAP, Active Directory и т.д.

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

Протокол HTTP

HTTP – это основа Интернета, поэтому очень важно иметь глубокое понимание данного протокола для тестирования веб-безопасности. Знание и понимание особенностей HTTP позволит найти уязвимости и использовать их.

Диалог клиент-сервер

HTTP представляет собой диалог между одним клиентом и одним сервером. Клиент (в нашем случае в качестве клиента выступает браузер) посылает запрос на сервер, а затем сервер отвечает на этот запрос. HTTP имеет преимущества текстового протокола, и поэтому его очень легко воспринимать, понимать и изучать. По умолчанию большинство веб-серверов доступно по порту TCP / 80. Когда ваш браузер подключается к сайту https://codeby.net/blogs/, он на самом деле соединяется по протоколу TCP с портом 80 на IP, соответствующим имени codeby.net

Наиболее распространены запросы браузера к серверу контента. Браузер посылает запрос, состоящий из следующих элементов:

  • метод HTTP, который позволит серверу понять, какого рода операцию браузер хочет выполнить;
  • ресурс, соответствующий тому, к которому клиент пытается получить доступ на сервере;
  • версия, которая позволит серверу понять, какая версия HTTP используется браузером;
  • опционально могут отправляться заголовки, дающие более подробную информацию на сервер — имя и версию браузера, предпочтительный для пользователя язык (например, английский, немецкий, французский и т.д.);
  • в зависимости от используемого метода HTTP, собственно тело запроса.

В качестве примера, приведем листинг http-запроса к сайту https://codeby.net:

GET /index.php HTTP/1.1
Host: codeby
User-Agent: Mozilla Firefox

Запросы

Методы

Существует множество методов HTTP:

  • метод GET: запрос контента – наиболее распространенный запрос, отправляемый браузерами;
  • метод POST используется для отправки большего количества данных; он используется в большинстве форм, а также для загрузки файлов.
  • метод HEAD очень схож с запросом GET; единственное различие состоит в ответе, который предоставляется сервером – в нем будет содержаться только заголовки, без тела запроса. Метод HEAD массово используется поисковыми роботами для проверки обновления страницы без загрузки полного ее содержимого.

Существует также множество других методов HTTP: PUT, DELETE, PATCH, TRACE. OPTIONS, CONNECT … О них можно прочитать в Википедии.

Параметры

Другой важной частью запроса являются параметры. Когда клиент получает доступ к странице http://codeby/article.php?id=1&name=2, на веб-сервер отправляется следующий запрос:

GET /article.php?id=1&name=2 HTTP/1.1
Host: codeby
User-Agent: Mozilla Firefox

Запросы POST похожи на GET, но в них параметры передаются в теле запроса. Например, следующая форма:


    [...] 
  
    
Username:
Password:

будет по факту выглядеть в браузере следующим образом:

Веб-тестирование на проникновение
Как видно, это форма входа в аккаунт

После того как форма будет заполнена следующими значениями:

  • имя пользователя — ‘admin’,
  • пароль — ‘Password123’.

И будет нажата кнопка «Отправить» (Submit), на сервер отправляется такой запрос:

POST /login.php HTTP/1.1
Host: codeby
User-Agent: Mozilla Firefox
Content-Length: 35
  
username=admin&password=Password123

Обратите внимание: если в тэге

использовался метод GET, то предоставляемые данные будут отправлены как часть URL и будут выглядеть следующим образом:

GET /login.php?username=admin&password=Password123 HTTP/1.1
Host: codeby
User-Agent: Mozilla Firefox

Если тэг формы содержит атрибут enctype=»multipart/form-data», то будет отправлен запрос другого вида:

POST /upload/example1.php HTTP/1.1
Host: codeby
Content-Length: 305
User-Agent: Mozilla/5.0 [...] AppleWebKit
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryfLW6oGspQZKVxZjA

------WebKitFormBoundaryfLW6oGspQZKVxZjA
Content-Disposition: form-data; name="image"; filename="myfile.html"
Content-Type: text/html

My file

------WebKitFormBoundaryfLW6oGspQZKVxZjA
Content-Disposition: form-data; name="send"

Send file
------WebKitFormBoundaryfLW6oGspQZKVxZjA--

Как видно из данного примера, заголовок Content-type отличается: Content-Type: multipart/form-data; boundary=—-WebKitFormBoundaryfLW6oGspQZKVxZjA.

«Webkit» используется в браузере Webkit, другие браузеры будут использовать вместо него случайным образом генерируемую длинную строку. Эта строка повторяется для каждой части составной информации. В последней части содержится строка, за которой следует —.

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

  • Имя файла: myfile.html.
  • Имя параметра: image.
  • Тип контента: text/html.
  • Содержимое файла: My file.

Также можно отправить параметры в виде массива (или хэш, в зависимости от синтаксического анализа, выполненного на стороне сервера). Например, можно использовать: /index.php?id[1]=0 для кодирования массива, содержащего значение 0.

Этот метод кодирования часто используется фреймворками для выполнения автоматического запроса к объектному отображению. Например, следующий запрос: user[name]=louis&user[group]=1 будет отображаться в объект User с атрибутом name равным louis и атрибутом group, отображенным как 1. Это автоматическое отображение иногда может использоваться с помощью mass-assignment атак (массовое присвоение). Отправляя дополнительные параметры, можно, если приложение не защищено от этого, менять атрибуты принимающего объекта. В нашем предыдущем примере, можно добавить в запрос user[admin]=1, и посмотреть, получит ли ваш пользователь права администратора.

Заголовки HTTP

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

Кроме того, большинство приложений используют лишь несколько HTTP заголовков:

  • Referer используется для определения источника переходов клиентов;
  • Cookie: для получения cookie;
  • User-Agent: для получения информации о браузере пользователя;
  • X-Forwarded-For: для получения IP-адреса источника (даже несмотря на то, что это не самый лучший способ).

Другие HTTP заголовки в основном используются веб-сервером, и работая с ними также можно найти уязвимости. Тем не менее, существует намного меньше шансов найти ошибку в веб-сервере, чем в веб-приложении.

Одним из наиболее важных заголовков является Host. Заголовок в основном используется веб-сервером для определения сайта, к которому хочет получить доступ пользователь. Когда на сервере расположено более одного веб-сайта, веб-сервер использует этот заголовок для формирования виртуального хостинга: даже если вы одновременно отправляете два запроса к разным сайтам, по заголовку Host сервер определит, какой контент отображать. Если вставить в заголовок хоста IP-адрес или недопустимое имя хоста, иногда можно перейти на другой веб-сайт, и получить дополнительную информацию.

Ответы

При отправке запроса, сервер возвращает HTTP ответ. К примеру, может прийти такой ответ:

HTTP/1.1 200 OK
Date: Sun, 03 Mar 2013 10:56:20 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze14
Content-Length: 6988
Content-Type: text/html



  
    
    WebWare "Веб для тестирования на проникновение"
    
    
    
[...]

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

  • 200 OK: запрос успешно обработан.
  • 302 Found используется для перенаправления пользователей. Например, когда они вылогиниваются, этот код отправляет их обратно на страницу входа в систему.
  • 401 Unauthorized: доступ ресурса ограничен.
  • 404 Not found: запрошенный клиентом ресурс не найден.
  • 500 Internal Server Error: ошибка при обработке запроса.

Некоторые ответы намного менее распространенные, например ответ 418: I’m a teapot (Я чайник).

За кодом состояния следуют HTTP заголовки.

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

  • Дата отправки запроса.
  • Заголовок Server, который предоставляет много информации об удаленном веб-сервере.
  • Заголовок X-Powered-By, который предоставляет еще больше информации.
  • В заголовке Content-Length содержатся сведения о величине отклика браузеру.
  • Заголовок Content-Type содержит сведения о том, чего ожидать браузеру. Этот заголовок меняет: например, если заголовок — text/html, браузер будет выводить ответ. Если это text/plain, браузер не должен пытаться выводить ответ.

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

  • файлы JavaScript.
  • CSS файлы.
  • Изображения.

HTTPs

HTTPs  — это тот же HTTP, но базирующийся на Secure Socket Layer (SSL). Часть SSL свидетельствует о том, что:

  • он обращается к правильному серверу: проверка подлинности;
  • обмен данными производится по защищенному каналу: шифрование.

Существует несколько версий SSL, причем некоторые считаются менее защищенными (SSLv1 и SSLv2).

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

Прослушивание HTTP-трафика

Есть 3 способа прослушивания HTTP-трафика:

  • прослушивание сети напрямую с помощью таких инструментов, как Wireshark или tcpdump.
  • через браузер; большинство браузеров имеют расширение, позволяющее пользователю увидеть, какой трафик передается и принимается.
  • путем настройки прокси между браузером и сервером.

Каждый из этих методов имеет свои преимущества и недостатки. Позже мы увидим, что все они зависят от того, используется ли протокол Secure Socket Layer (SSL), и хочет ли пользователь иметь возможность перехвата/изменения запроса.

Источник pentesterlab.com

2 комментария

  1. только я подумал, что давно статьи не выходили, а тут вот она :)))) Спасибо, что не бросаете проект !

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *