|
Навигация
|
Главная » Windows Об одной малоизвестной уязвимости в веб сайтахИсточник: habrahabr rotor Первое правило безопасности при разработке Веб приложений гласит: - Не доверять данным пришедшим от клиента.Почти все это правило хорошо знают и соблюдают. Мы пропускаем через валидаторы данные форм, кукисы, даже URI. Но недавно я с удивлением обнаружил, что есть одна переменная, приходящая от клиента, которую почти никто не фильтрует. Речь пойдет о компрометации веб приложения через подмену значения HTTP_HOST и SERVER_NAME .Если выполнить поиск по Гитхабу, по ключевому слову "HTTP_HOST", то можно найти порядка 43 страниц репозиториев, в которых используется $_SERVER['HTTP_HOST'] . При беглом просмотре я обнаружил достаточно много случаев, когда данные пришедшие в этой переменной остались без фильтрации. Чаще всего проверяют только существование $_SERVER['HTTP_HOST'] , но не проводят валидацию. Опишу ситуацию для связки Nginx+php (php-fpm либо fcgi-spawn), для других веб-серверов или другого языка программирования ситуация будет отличаться в деталях, но общие принципы сохраняются.Поведение Apache описано тут: shiflett.org/blog/2006/mar/server-name-versus-http-host Способы компрометацииДля иллюстрации, будем использовать telnet Заголовки, которые отправляет браузер серверу выглядят примерно так:
Если из них убрать строку (передача запроса без HTTP_HOST ) то сервер вернет
Другой способ отправки заголовков:
Результат будет точно такой же, как и при отправке первого заголовка
Но вот, если первым заголовком передать не а То все последующие заголовки будут отброшены, Nginx отработает секцию server определенную для Но HTTP_HOST и SERVER_NAME не будут определены.Передать пустой HTTP_HOST не получится: Но получится передать или
Теперь самое интересное. Подключаемся к телнету
Оправляем
И смотрим:
Ответ сервера:
Если в заголовке Host: будет присутствовать '/' , то сервер вернет 400 Bad Request .Т.е. такой заголовок Host:../../ не пройдет, такой Host:http://evil.site тожеУязвимостиПолучение доступа к приватным данным SQL-инъекции Способы защитыСамый простой и доступный способ защиты (нашел тут:stackoverflow.com/questions/1459739/php-serverhttp-host-vs-serverserver-name-am-i-understanding-the-ma).
Самый эффективный способ защиты - явно определить HTTP_HOST на стороне веб сервера.Что бы понять, как переопределять HTTP_HOST добавим в конфиг Nginx'а такие строки:
Допустим у нас определены две секции server :
Сделаем такой запрос
На выходе получим
Все логично. И наиболее корректной будет запись:
Если сделать запрос вида
то отработает секция
которая легко отсеет такой запрос. Microsoft: Windows Desktop Search v.3.01 (Русская версия) (download). 'Три К' сертификации для IT-специалистов. Установка Windows 2000 Professional. Революционные возможности линейки продуктов Across Silk. Microsoft и Adobe схватились не на шутку. Главная » Windows |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |