На перевод статьи натолкнула аналогичная проблема — дыры в vBSEO (да, что-то уже перестаю любить данный продукт) у одного из клиентов.
За последнее время, множество форумов с установленным vBSEO (и не только!) подверглись взлому. Выражается он в том, что в начале сессии (?), после авторизации на форуме, переходя по какой-либо ссылке, Вас перекидывает на левый сайт. А далее, вроде как ничего и не было.
Эта статья расскажет Вам, как исправить редирект (перенаправление) Google/Yahoo/SE-трафика на сторонние сайты. И, если Вы используете данный продукт, настоятельно рекомендуем Вам прочесть и усвоить следующую информацию. Которая, может не полностью, но частично защитит Ваш проект от злоумышленников (100%-й гарантии дать никто не может).
Этот зловред перенаправляет Google/Yahoo/SE-трафик на вредоносные сайты, такие как filestore72.info, url123.info и т.д. Обитает же он в куках (cookies) браузера, поэтому активируется лишь при первом заходе на сайт. Очистив куки Вы увидите, что подобная проблема больше не повторяется и всё функционирует нормально.
Список сайтов, на которые осуществляется редирект:
Code:
myfilestore.com
filestore72.info
file2store.info
url2short.info
filestore123.info
url123.info
dollarade.com
Зловред использует методы вирусной инъекции, с целью получения логина и пароля администратора, для входа в админ-панель. Позволяя ему установить свой вредоносный код прямиком в таблицу MySQL. Далее же следуют рекомендации по лечению и обеспечению безопасности.
Шаг 1
Переименуйте директории "
admincp" и "
modcp" во что-нибудь другое, понятное для Вас.
В файле "includes/config.php" смените пути к этим папкам на новые:
PHP Code:
$config['Misc']['admincpdir'] = 'youradmincpdir';
$config['Misc']['modcpdir'] = 'yourmodcpdir';
Шаг 2
Смените пароли всем администраторам. Удалите те аккаунты администратора, которые Вы не используете.
Шаг 3
В файле ".htaccess" установите дополнительный пароль на директорию "admincp". Это послужит для Вас хорошей защитой, если злоумышленнику всё же удастся найти новые директории.
Вставьте этот код в файл ".htaccess", предварительно поправив пути на новые:
Code:
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /directory/blah/.htpasswd
require valid-user
Теперь создайте файл паролей, дабы выдать права людям, которым разрешено посещение закрытых директорий.
Для генерации учётных записей, можете использовать следующий сайт:
Dynamic Drive: .htaccess password generator.
И в конце концов, убедитесь, что файл паролей имеет права для выполнения веб-сервером:
Code:
chown apache:apache /directory/blah/.htpasswd
Шаг 3.1
По умолчанию, в подвале форума находятся ссылки как на директорию "admincp", так и на "modcp". Ради Вашей же безопасности, желательно их удалить:
PHP Code:
<vb:if condition="$show['admincplink']"><li><a href="{vb:raw admincpdir}/index.php{vb:raw session.sessionurl_q}">{vb:rawphrase admin}</a></li></vb:if>
<vb:if condition="$show['modcplink']"><li><a href="{vb:raw modcpdir}/index.php{vb:raw session.sessionurl_q}">{vb:rawphrase mod}</a></li></vb:if>
Шаг 4
Убедитесь в том, что на Вашем сервере параметр "Register Globals":
выключен. Информацию о состояние можно узнать в админ-панели "
Обслуживание — Показать информацию о PHP" (искать "register_globals", чтоб был off).
Если уж совсем трудности, то используя следующий код выполните в своём браузере, предварительно залив файл к себе на хостинг:
PHP Code:
<?php
echo ini_get('register_globals') ? '<font color=red><b>Включено</b></font>' : '<font color=green><b>Выключено</b></font>';
?>
В случае, если у Вас этот параметр включён, то необходимо его выключить, путём редактирования "/etc/php.ini" (если есть на это права управления сервером — root), прописав:
Code:
register_globals = 0
Не забудьте после этого перезагрузить веб-сервер.
Шаг 5
Если у Вас установлен
vBSEO, добавьте следующий код в начало файла "vbseo.php", что находится в корневой директории форума:
PHP Code:
if (strpos($_SERVER["QUERY_STRING"],'%00'))
die;
Шаг 6
Также, используя
vBSEO убедитесь в том, что его конфигурационный файл не имеет права на запись.
Находится этот файл здесь: vbseo/resources/xml/config.xml
Code:
CHMOD 444 vbseo/resources/xml/config.xml
Шаг 7
Проверьте все директории на корректность имеющихся прав (CHMOD). Эти директории должны иметь полные права (777):
Code:
attachments/
customavatars/
customgroupicons/
customprofilepics/
signaturepics/
Остальные же — 544.
Шаг 8
В директории, что указаны в 7-м шаге (полные права), добавьте ".htaccess" файл со следующим содержимым:
Code:
<Files ~ "\.(php\d*|cgi|pl|phtml)$">
order allow,deny
deny from all
</Files>
Шаг 9
В админ-панели укажите использование внешней YUI. Это минимизирует вероятность заражение форума от локальных скриптов YUI.
"
Основные настройки — Оптимизация и настройки сервера — Использовать внешнюю YUI — Google".
Шаг 10
Измените пароль пользователя MySQL на новый и внесите изменения в файл "includes/config.php".
Шаг 11
Убедитесь в том, что у пользователя MySQL не включена опция, позволяющая удалённый доступ. Все операции пользователя с БД должны происходить в рамках локального сервера.
Шаг 12
Для всё тех же пользователей
vBSEO. В файле "/forums/vbseo/functions_vbseo_hook.php" измените:
PHP Code:
vbseo_ping_proc($vbseo_ref, $_GET['vbseourl'] ?
$vbulletin->options['bburl'].'/'.$_GET['vbseourl']
На
PHP Code:
vbseo_ping_proc($vbseo_ref, $_GET['vbseourl'] ?
$vbulletin->options['bburl'].'/'.preg_replace('#[\x00-\x1F]#', '', $_GET['vbseourl']) :
Предотвратит последующие атаки злоумышленников, но не вылечит от текущей болезни, которую уже успели подхватить.
Шаг 13
Для инъекции перенаправления используется файл "misc.php", находящийся в корневой папке форума, используя запрос вида "g=js".
Откройте этот файл и в самый вверх добавьте:
PHP Code:
if($_GET['g']=='js') die;
Шаг 14
Теперь же, когда выполнены шаги по обеспечению безопасности форума, следует вылечить текущую болезнь, путём очищения кэша таблиц MySQL. Для этого, в админ-панели перейдите к "Управление модулями" и любой из этих модулей выключите и включите. Это перезапишет таблицу
datastore (!) и вредоносный код исчезнет.
Шаг 15
И наконец, последний шаг. Проверьте, нет ли в следующих файлах скрытого зловредного кода —
base64:
Code:
forum/cron.php
forum/asset.php
forum/picture.php
forum/blog_attachment.php
forum/attachment.php
forum/includes/adminfunctions_template.php
forum/includes/adminfunctions_plugin.php
forum/includes/class_xmlrpc.php
forum/includes/functions.php
forum/includes/class_mail.php
forum/includes/facebook/base_facebook.php
forum/vb/verticalresponse.php
forum/forumrunner/push.php
forum/forumrunner/support/Snoopy.class.php
forum/admincp/navigation.php
Ахтунг! В файле "cron.php" и "blog_attachment.php" таков код имеется, но он безопасен (по крайней мере, так сказала
Лью). =)
Антивирус
Если у Вас паранойя и Вы плохо спите по ночам, в довесок можете прибабахать perl-скрипт в cron, чтоб проверять файлы форума на наличие base64-кода, в котором зачастую скрыта угроза для Вашего форума. Собственно, сам скрипт:
Code:
#!/usr/bin/perl
### Free to enjoy from www.webhostchat.co.uk (http://www.webhostchat.co.uk/business-technical-advice/29421-vbulletin-redirecting-filestore72-info-url123-info-etc-filestore-redirect-hack.html)
### This script will check for any changes in the files that have BASE64 code in them and send a email alert.
### This is quite handy for knowing if you just got hacked!
### This file requires File::Find::Rule and MIME::Lite perl modules, they are available on YUM.
### Which website to scan for dodgyness and where to store a scan cache (important)
$web_directory = "/home/webhostchat.co.uk/public_html/";
$cache_file = "/home/whc_scan.cache";
### To send email you can setup SMTP
$from_email = "from\@email";
$admin_email = "to\@email";
$subject = "Your site webhostchat.co.uk has detected ~~filecount~~ base64 files";
$email_host = "localhost";
$email_user = "";
$email_pass = "";
### The stuff
chdir("$web_directory");
use File::Find::Rule;
my $base_dir = shift // '.';
my $find_rule = File::Find::Rule->new;
$find_rule->maxdepth(10);
$find_rule->name('*.php','*.cgi','*.attach');
my @sub_dirs = $find_rule->in($base_dir);
$fc='0';
open(t,"<$cache_file");$cd = ;close(t);@exist = split(/~~~/,$cd);
foreach $b(@sub_dirs){
open(t,"<$b");
@t = ;
close(t);$m1='';$m='';
foreach $c(@t){
if($c =~ /base64/gi){ $m1="y";}
if($c =~ /system/gi){ $m2="y";}
if($c =~ /curl/gi){ $m2="y";}
if($c =~ /exec/gi){ $m2="y";}
if($c =~ /eval/gi){ $m2="y";}
}
if($m1 eq "y"){ if($m2 eq "y"){
if( grep $_ == "$b", @exist){ } else { $newf[$fc]="$b"; $fc++; $email = "yes";}
$filelist = "$filelist$b~~~";
}}
}
chop($filelist);chop($filelist);chop($filelist);
open(t,">$cache_file");print t $filelist;close(t);
print "Found $fc new files...\n";
$emsg = "Dear Administrator\n\nThere is a new file(s) detected on your website that contains base64 code. You should check this file urgently and if it is a exploit file start to work out how it was placed there!\nHere is a list of the NEW files:\n\n";
foreach $b(@newf){
print "$web_directory$b\n";
$emsg = "$emsg $webdirectory$b\n";
}
$subject =~ s/~~filecount~~/$fc/gi;
$emsg = "$emsg \n\n All the best\n Your server!";
if($email eq "yes"){
use MIME::Lite;
my $msg = MIME::Lite->new
(
Subject => $subject,
From => $from_email,
To => $admin_email,
Type => 'text/plain',
Data => $emsg
);
$msg->send('smtp',"$email_host");
}
И помните, безопасность в IT как контрацептив — не всегда помагает.