Перейти к содержанию

Тестирование HTTP-методов

Резюме

HTTP предлагает несколько методов, которые могут использоваться для выполнения действий на веб-сервере (в стандарте HTTP/1.1 они называются методами, но их также часто описывают как глаголы). Хотя методы GET и POST являются наиболее распространенными для доступа к информации, предоставляемой веб-сервером, HTTP допускает использование нескольких других (менее известных) методов. Некоторые из них могут быть использованы в недобросовестных целях, если веб-сервер неправильно настроен.

RFC 7231 – Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content определяет следующие допустимые методы HTTP-запросов или глаголов:

  • GET
  • HEAD
  • POST
  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE

Однако большинству веб-приложений нужно только реагировать на запросы GET и POST, получая пользовательские данные в строке запроса URL или прикрепленными к запросу соответственно. Стандартные ссылки в стиле <a href=""></a> и формы, определенные без метода, вызывают запрос GET; данные формы, отправленные через <form method='POST'></form>, вызывают запросы POST. JavaScript и AJAX-запросы могут отправлять методы, отличные от GET и POST, но обычно в этом нет необходимости. Поскольку другие методы используются так редко, многие разработчики не знают, или не учитывают, как реализация этих методов веб-сервером или фреймворком приложения влияет на функции безопасности приложения.

Цели тестирования

  1. Перечислить поддерживаемые HTTP-методы.
  2. Проверить обход контроля доступа.
  3. Проверить уязвимости XST (Cross-Site Tracing).
  4. Проверить техники переопределения методов HTTP.

Как тестировать HTTP-методы

Обнаружение поддерживаемых методов

Для выполнения этого теста тестировщик должен выяснить, какие HTTP-методы поддерживаются веб-сервером, который проверяется. Хотя метод HTTP OPTIONS предоставляет прямой способ это сделать, необходимо проверить ответ сервера, отправляя запросы с использованием различных методов. Это можно сделать с помощью ручного тестирования или используя скрипт Nmap http-methods.

Чтобы протестировать конечную точку /index.php на сервере localhost с использованием HTTPS с помощью скрипта Nmap http-methods, выполните следующую команду:

nmap -p 443 --script http-methods --script-args http-methods.url-path='/index.php' localhost

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

Тестирование метода PUT

  1. Захватите базовый запрос цели с помощью веб-прокси.
  2. Измените метод запроса на PUT и добавьте файл test.html, отправив запрос на сервер приложения.
PUT /test.html HTTP/1.1
Host: testing-website

<html>
HTTP PUT Method is Enabled
</html>

Если сервер отвечает кодами успеха 2XX или 3XX (перенаправления), подтвердите это, выполнив GET-запрос для файла test.html. Приложение уязвимо. Если метод HTTP PUT не разрешен на базовом URL или запросе, попробуйте другие пути в системе.

ПРИМЕЧАНИЕ: Если вам удастся загрузить веб-оболочку, обязательно перепишите ее или убедитесь, что команда безопасности целевого сайта в курсе и быстро удалит этот компонент после вашего подтверждения концепции.

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

Тестирование на обход контроля доступа

  1. Найдите страницу, на которую можно перейти, с таким уровнем безопасности, при котором запрос GET обычно вызывает 302 перенаправление на страницу входа или принудительно выполняет вход.
  2. Отправьте запросы с использованием различных методов, таких как HEAD, POST, PUT и т. д., а также произвольные вымышленные методы, такие как BILBAO, FOOBAR, CATS и т. д. Если веб-приложение отвечает HTTP/1.1 200 OK, и это не страница входа, может быть возможность обойти аутентификацию или авторизацию. Например, используя ncat от Nmap:
$ ncat www.example.com 80
HEAD /admin HTTP/1.1
Host: www.example.com

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

HEAD /admin/createUser.php?member=myAdmin
PUT /admin/changePw.php?member=myAdmin&passwd=foo123&confirm=foo123
CATS /admin/groupEdit.php?group=Admins&member=myAdmin&action=add

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

Тестирование на потенциал Cross-Site Tracing

Примечание: Чтобы понять логику и цели атаки Cross-Site Tracing (XST), необходимо быть знакомым с атаками межсайтового скриптинга (XSS).

Метод TRACE, предназначенный для тестирования и отладки, инструктирует веб-сервер отражать полученное сообщение обратно клиенту. Этот метод, хотя и кажется безвредным, может быть использован в некоторых сценариях для кражи учетных данных легитимных пользователей. Эта техника атаки была обнаружена Иеремией Гроссманом в 2003 году в попытке обойти атрибут HttpOnly, который защищает куки от доступа со стороны JavaScript. Однако метод TRACE может использоваться для обхода этой защиты и доступа к куки, даже если этот атрибут установлен.

Тестирование на потенциал Cross-Site Tracing

Для тестирования потенциала XST отправьте запрос, например:

$ ncat www.victim.com 80
TRACE / HTTP/1.1
Host: www.victim.com
Random: Header

Если веб-сервер вернет 200 и отразит произвольный заголовок, это подтверждает уязвимость. Чтобы более полно использовать эту проблему, выполните следующий запрос:

$ ncat www.victim.com 80
TRACE / HTTP/1.1
Host: www.victim.com
Attack: <script>prompt()</script>

Этот пример сработает, если ответ будет отражен в контексте HTML.

В старых браузерах атаки проводились с использованием технологии XHR, которая утекала заголовки, когда сервер их отражал (например, куки, токены авторизации и т. д.) и обходила меры безопасности, такие как атрибут HttpOnly. В современных браузерах эта атака может быть реализована только если приложение интегрируется с технологиями, похожими на Flash.

Тестирование на переопределение HTTP-методов

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

  • X-HTTP-Method
  • X-HTTP-Method-Override
  • X-Method-Override

Тестирование

Для тестирования в сценариях, где ограниченные методы, такие как PUT или DELETE, возвращают "405 Метод не разрешен", повторите тот же запрос с добавлением альтернативных заголовков для переопределения HTTP-методов и наблюдайте, как система реагирует. Приложение должно ответить другим статус-кодом (например, 200) в тех случаях, когда поддерживается переопределение метода.

В следующем примере веб-сервер не позволяет метод DELETE и блокирует его:

$ ncat www.example.com 80
DELETE /resource.html HTTP/1.1
Host: www.example.com

Ответ сервера будет:

HTTP/1.1 405 Method Not Allowed
Date: Sat, 04 Apr 2020 18:26:53 GMT
Server: Apache
Allow: GET,HEAD,POST,OPTIONS
Content-Length: 320
Content-Type: text/html; charset=iso-8859-1
Vary: Accept-Encoding

После добавления заголовка X-HTTP-Method, сервер отвечает на запрос с кодом 200:

$ ncat www.example.com 80
DELETE /resource.html HTTP/1.1
Host: www.example.com
X-HTTP-Method: DELETE

Ответ будет:

HTTP/1.1 200 OK
Date: Sat, 04 Apr 2020 19:26:01 GMT
Server: Apache

Рекомендации

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

Инструменты

  • Ncat
  • cURL
  • Скрипт NSE http-methods для Nmap
  • Плагин w3af htaccess_methods