XmlHttpRequest и уязвимость HTTP авторизации


XMLHttpRequest и HTTP авторизация

В этой статье я постараюсь объяснить некоторые технические моменты и возможные уязвимости HTTP авторизации.

brute-password

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

Part.1

Авторизация и аутентификация в HTTP

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

В принципе, по большому счету в этом нет ничего страшного, но все же:

Аутентификация (authentication) — это проверка подлинности предъявленного пользователем идентификатора (да простит меня Wikipedia за копипаст), т. е. проверка соответствия вводимых юзером данных, значениям в БД конкретного веб ресурса.
Чаще всего это проверка логина и пароля которая выполняется один раз.

Авторизация (authorization) — является процессом проверки того, что разрешено делать конкретному юзеру в соответствии с назначенными ему правами.
За это отвечает конкретное веб приложение или скрипт, более того проверка авторизации должна производится перед выполнением любой операции, которая является доступной только определенному пользователю.

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

AuthType Basic
# аутентификая является базовой, т. е. необходимо ввести логин и пароль
Require valid-user
# файлы в текушей директории могут отрыть только пользователи прошедшие аутентификацию

 

HTTP аутентификация может служить дополнительной защитой на пути получения доступа к (ну например) сценариям администратора и т. п.

Реализовать HTTP аутентификацию можно двумя способами, а именно:

1. Средствами  веб сервера Apache, т. е. файлом локальной конфигурации .htaccess, подробно об этом можно почитать в статье о защите админки сайта файлом .htaccess 

2. С помощью скрипта. Самый просто скрипт HTTP аутентификации может быть написан на PHP, примерно вот с таким содержанием:

<?php
$username='user'; // логин
$password='password'; // пароль
if (!isset($_SERVER['PHP_AUTH_USER']) or $_SERVER['PHP_AUTH_USER']!==$username or $_SERVER['PHP_AUTH_PW']!==$password)
{
header('WWW-Authenticate: Basic realm="Auth"');
header('HTTP/1.0 401 Unauthorized');
exit("<b>Sorry, Access Denied</b>");
}
else {header('Location: index.php');}
?>

Если уж продолжать извращение, то можно сохранить этот скрипт под именем auth.php и засунуть в папку wp-admin WordPress, а в  файле .htaccess который находится в той же папке т. е. wp-admin написать инструкцию:
DirectoryIndex auth.php

Это конечно же создаст определенные трудности на пути злоумышленника, но лично я такую защиту не рекомендую использовать!

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

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

Ну и с этого момента, как там говориться: поподробнее…

Part.2

Объект XMLHttpRequest и JavaScript

Объект XMLHTTP служит для формирования и отправки http запросов на стороне клиента без перезагрузки страницы, что в свою очередь очень удобно  для создания динамичных веб приложений. XMLHTTP является частью технологии Ajax, которая хорошо востребована в наше время и используется на многих популярных веб ресурсах.

Конечно многие браузеры из соображений безопасности не позволяют формировать и отправлять запросы пользователя идущие на другие сайты с помощью компонента XMLHttpRequest, но есть возможность обойти данное ограничение с помощью Internet Explorer (IE) от Microsoft.

Для этого необходимо зайти в свойства браузера Internet Explorer и на вкладке «Безопасность» нажать на кнопку «Другой». После этого появится окно со списком опций безопасности, в котором нужно найти раздел «Разное» и в пункте «Доступ к источникам данных за пределами домена» поставить radio переключатель на строку «Включить», по умолчанию стоит «Отключить».

Изменение настроек Internet Explorer

Изменение настроек Internet Explorer

Компанент XMLHttpRequest является Api, и доступен скриптовым языкам, таким как JavaScript.

У данного компанента во всяком случае известных Википедии существует семь (IE доступно только шесть) методов и шесть свойств.

Метод open() имеет пять параметров:

open( method, URL, async, userName, password )

1. method. Метод передачи данных (GET, POST, HEAD).
2. URI. Url адрес, на который отправляется запрос.
3. async.  Если он установлен в true то выполнение кода страницы будет продолжено сразу после отправки запроса не дожидаясь ответа сервера. Данный параметр не является обязательным.
4. username. Логин пользователя, если он необходим для авторизации.
5. password.  Соответственно пароль.

 

Событие onreadystatechange возникает каждый раз, когда меняется значение состояния объекта (readyState). Свойство readyState имеет пять состояний от 0 до 4:

0: запрос не инициализирован
1: соединение установлено
2: сервер получил запрос
3: ожидание обработки запроса
4: ответ готов

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

<html>
<script>
var browser=null;
browser = new ActiveXObject("Microsoft.XMLHTTP");
function Connect(){
var login="user";
var passwd = "password";
browser.open("HEAD","httр://ваш-сайт.ру/login.php",0,login,passwd);
browser.onreadystatechange=
Statusfunc;
browser.send(null);
}
function Statusfunc(){
if (browser.readyState==4)
{
alert(browser.status);}
}
</script>
<input type=button onClick="Connect();" value="Push!">
</html

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

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

Так же необходимо создавать не только сложные пароли, но и логины рекомендуется использовать далекие от умолчания. Ведь большинство брутов нацелены именно на подбор пароля, в то время как имя пользователя [или массив имен] используется по умолчанию, а это admin, administrator и т. п.

P.S. Security is a process, not a product! Считает Брюс Шнайер, и с этим очень сложно не согласиться.

Безопасность это процесс постоянного развития и самосовершенствования. Будьте бдительны! 🙂