X-Frame-Options и ClickJacking


X-Frame-Options и защита от ClickJacking

Атака ClickJacking позволяет, как минимум, выполнять требуемые злоумышленнику действия со стороны пользователя в контексте уязвимого домена,

X-Frame-Options

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

Чтобы слегка рассеять туман от первого предложения, 😀 немного объясню суть проведения данной атаки.

Если посмотреть на заголовки которые отдает сервер при обращении к конкретному сайту, то чаще всего достаточно часто можно обнаружить в них отсутствие записи X-Frame-Options.

А это ни много ни мало та самая, пресловутая, настройка по умолчанию, которая позволяет загружать веб приложение в фрейм.

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

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

Естественно такие гиганты авто веб-прома, как одноклассники, фейсбук, вконтакте, уже давно закрыли лавочку возможность загружать кому-то (даже себе) свой ресурс в фрейм, и чаще всего в заголовках X-Frame-Options возвращают Deny, т. е. говоря простым языком: балалайку. 😀

Нужно ли делать запрет на загрузку сайта во фрейм?

Наверное на этот вопрос каждый веб мастер должен ответить самостоятельно, но справедливости ради, хочется дополнить вопрос еще одним, наводящим:
Хотели бы вы, чтобы злоумышленник получил доступ к конфиденциальной информации пользователей вашего сайта?

В общем получается, как в том еврейском анекдоте:

Почему вы постоянно отвечаете вопросом на вопрос?
Что?

Т. е. принимать решение о критичности ClickJacking относительно вашего сайта, все таки придется самостоятельно. Я же свой выбор сделал, о чем явно свидетельствует первый скриншот.

Заголовок X-Frame-Options

Как вы поняли из первой части поста, заголовок X-Frame-Options дает (или не дает) добро на загрузку страниц сайта в тег <iframe src="домен/страница"><iframe> который находиться на другом домене.

Заголовок X-Frame-Options рассказывает и показывает говорит браузеру, что делать если сайт загружен во фрейм.

Может содержать следующие значения:

DENY запрещает загрузку документов во фрейм.
SAMEORIGIN разрешает загрузку документов сайта на уровне одного домена.
ALLOW-FROM domain разрешает загрузку документов в iframe конкретного домена.
ALLOW-ALL значение по умолчанию.

Следовательно, если нужно разрешить загрузку сайта во фрейм только конкретному домену, то X-Frame-Options должен иметь такое значение:

X-Frame-Options:ALLOW-FROM allow.domain

Справедливости ради хочется отметить тот факт, что опция ALLOW-FROM не поддерживается некоторыми браузерами и мобильными устройствами.

Загрузка сайта в iframe Яндекс.Метрики требуется (во всяком случае требовалась раньше) вебвизору, который записывает и может воспроизвести действия того или иного пользователя.

Вебвизор Яндекс.Метрики вообще очень полезный сервис, потому как позволяет не только проанализировать какие именно запросы производились к урлу сайта, (включая и те, которые которые не отправлялись на сервер,  т. е. domain/page.html#<img src=x onerror=alert(document.domain)> и т. д. метрика тоже пишет) но и оценить визуально, подробный видео отчет о действиях пользователя.

Поэтому, если у кого еще нет на вооружении — рекомендую присмотреться. 😀

Защита от ClickJacking средствами PHP

За отправку заголовков в PHP отвечает функция header (string string [, bool replace]);

Если нам необходимо, чтобы конкретный php сценарий отдавал в заголовке X-Frame-Options: SAMEORIGIN, то в начало сценария нужно добавить такой код:

<?php
header("X-Frame-Options: SAMEORIGIN");
?>

Для реализации X-Frame-Options:ALLOW-FROM domain в PHP, можно использовать примерно такое условие:

<?php
if (strpos($_SERVER['HTTP_REFERER'],'http://master-it.biz') === false)
header("X-Frame-Options: DENY");
?>

Проверял на своем блоге, поэтому домен master-it.biz нужно заменить на тот, которому вы хотите разрешить загрузку сайта во фрейм.

Правда и здесь все не так гладко. Если вы хоть немного знакомы с PHP, то сразу поймете каким образом такую защиту от кликджекинга можно обойти. 😉

Как проверить свой сайт на ClickJacking?

Если вы юзаете Firebug, то можете посмотреть возвращает ли сервер заголовок X-Frame-Options.

Но дабы убедиться воочию, можно разместить на другом домене (например localhost) фрейм тестируемого сайта <iframe src="http://master-it.biz"></iframe> и посмотреть будет он загружаться на страницу или  нет.

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

ClickJacking Test

Защита от ClickJacking файлом .htaccess

Как я уже писал выше, заголовок X-Frame-Options может принимать четыре значения.

Если опустить значение по умолчанию X-Frame-Options:ALLOW-ALL, то из оставшихся трех стабильный результат могут обеспечить только два:

Header always set X-Frame-Options SAMEORIGIN
Header always set X-Frame-Options DENY

Соответственно, если вы хотите запретить загрузку своего сайта во фреймы, которые могут находиться на других доменах,  то в .htaccess необходимо добавить:

#Allow Sameorigin .htaccess
Header always set X-Frame-Options SAMEORIGIN

Ну а параметр DENY проследит за тем, чтобы сайт не был загружен в iframe даже на вашем домене.

P.S. Ох уж эти настройки по умолчанию.. До новых встреч, будьте бдительны! 😉