Изменяются файлы .htaccess - уязвимость скриптов?

Список разделов phpBBex 1.x (поддерживается) Поддержка 1.x

Описание: У вас проблемы с phpBBex 1.x и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть вопроса. Подробно описывайте проблему. Не забудьте указать версию phpBBex и какие моды установлены, по возможности добавьте скриншоты проблемы или ссылку на страницу с проблемой.
Модератор: Поддержка

Сообщение #41 Алексей » 24.02.2013, 15:47

21/02/2013 в 15:07:00 мой скрипт снова зафиксировал изменения во всех файлах .htaccess и восстановил их.

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

Вот этот скрипт, может кому пригодится:
Код: Выделить всё
<?php

// контроль файлов
class file_checker
{
   // Задайте константы !!!
   
   // Файловые константы
   const START_DIR = '/home/<аккаунт>/data/'; // стартовая директория для поиска
   const FILE_CONTENTS = '/home/<аккаунт>/data/www/<домен>/work/checker/contents.dat'; // файл для хранения содержимого проверяемых файлов
   const DIR_LOG = '/home/<аккаунт>/data/www/<домен>/work/checker/logs/'; // директория - куда будут скидываться логи об изменениях проверяемых файлов
   
   // Почтовые константы
   const E_TO = "<логин>@yandex.ru"; // Введите адрес (или адреса) электронной почты, куда будет отправляться уведомление
   const E_SUBJ = "Файлы на сайте изменены !!!"; // Введите тему присылаемого письма
   const E_FROM = "admin@<домен>"; // от кого письмо
   
   // Пароль для запуска сохранения исходного состояния файлов
   const PASS = 'gfhjkm';
   
   // Переменные   
   private $allowed_ext = array('htaccess'); // расширения файлов, которые хотим контролировать
   
   private $path_files = array(); // здесь хранятся пути проверяемых файлов
   
   
   // функция проверяет контролируемые файлы и восстанавливает их содержимое
   function check_files()
   {
      $files_contents = unserialize(file_get_contents(self::FILE_CONTENTS));
      
      $log = '';

      foreach($files_contents as $file => $check_contents)
      {
         $contents = @file_get_contents($file);
         if ($contents != $check_contents)
         {
            file_put_contents($file, $check_contents);
            $log = $file . ' был изменен в ' . date('H:i:s',time()) . "\n\n" . $contents . "\n\n\n\n";
            file_put_contents (self::DIR_LOG . date('Y-m-d',time()) . '.log', $log, FILE_APPEND);
         }
         
      }

      if ($log)
      {
         $this->send_mail('Изменения произошли ' . date('m-d-Y в H:i:s',time()));
      }

   }
   
   
   // поиск всех файлов начиная с директории $start_dir и сохранение полных путей в $this->path_files
   function find_files($start_dir)
   {
      if ($start_dir{strlen($start_dir)-1} != '/') $start_dir .= '/'; // если в конце директории нет слеша, то добавим
      
      $files = scandir($start_dir); // получаем список файлов в директории
      
      foreach($files as $file)
      {
         if ($file == '.' or $file == '..') continue;
         
         $fullpath_file = $start_dir . $file; // полный путь файла
         if (is_dir($fullpath_file))
         {
            $this->find_files($fullpath_file); // если это не файл, а директория, то рекурсивный вызов функции
         }
         else
         {
            if (in_array(substr(strrchr($file, '.'), 1), $this->allowed_ext))
            {
               $this->path_files[] = $fullpath_file;
            }
         }
      }
   }
   
   // функция сохраняет содержимое контролируемых файлов в виде сериализованной строки
   function save_contents()
   {
      $this->find_files(self::START_DIR);
      
      $files_contents = array();
      
      foreach($this->path_files as $file)
      {
         if(false !== $contents = file_get_contents($file))
         {
            $files_contents[$file] = $contents;
         }
         
      }
      file_put_contents(self::FILE_CONTENTS, serialize($files_contents));
   }
   
   // вывод на экран контролируемые файлы
   function show_files()
   {
      $files_contents = unserialize(file_get_contents(self::FILE_CONTENTS));
      foreach ($files_contents as $file => $contents)
      {
         echo $file . '<br>';
      }
         
   }
   
   // отправка сообщения по электронке
   function send_mail($mess)
   {   
      $headers = "MIME-Version: 1.0\n";
      $headers .= 'From: '. self::E_FROM . "\n";
      $headers .="Content-type: text/html; charset=utf-8";      
      mail(self::E_TO, self::E_SUBJ, $mess, $headers);
   }
   
   
}

$checker = new file_checker;

$pass = $mode = '';
if (isset($_GET['pass'])) $pass = trim(strip_tags(($_GET['pass'])));
if (isset($_GET['mode'])) $mode = trim(strip_tags(($_GET['mode'])));

if (file_checker::PASS == $pass and $mode == 'save')
{
   $checker->save_contents();   
}
elseif ($mode == 'show')
{
   $checker->show_files();
}
else
{
   $checker->check_files();
}

exit;
?>
1. Для сохранения исходного содержимого файлов .htaccess, надо запустить скрипт с параметрами:
скрипт.php?mode=save&pass=gfhjkm
2. Для просмотра какие файлы контролируются:
скрипт.php?mode=show
3. Для контроля файлов вызываем скрипт без параметров:
скрипт.php
Алексей M
Автор темы
Аватара
Репутация: 19
С нами: 11 лет 7 месяцев

Сообщение #42 Алексей » 26.02.2013, 19:47

VEG:Очень интересно, каким же в итоге способом злоумышленники проникают на сервер.
Похоже, что через другой аккаунт. Вот ответ хостера:
хостер:Да мы разобрались с проблемой и нашли аккаунт вредителя и заткнули "дыру".
Алексей M
Автор темы
Аватара
Репутация: 19
С нами: 11 лет 7 месяцев

Сообщение #43 Sumanai » 26.02.2013, 21:13

Алексей:Похоже, что через другой аккаунт. Вот ответ хостера:
Я бы ушёл от этого хостера чисто потому, что они так долго решали эту проблему, а первое время вообще отрицали свою вину.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #44 daftMan » 26.02.2013, 22:55

Алексей, поздравляю с решением проблемы.


Sumanai, если честно, то нормального хостера сейчас найти трудно. У каждого возникают те или иные проблемы. И буквально на 90% можно найти свежий негатив (сам в поисках боль-мень нормального/нормальных хостеров)
daftMan
Репутация: 17
С нами: 11 лет 4 месяца

Сообщение #45 factotum » 27.02.2013, 14:48

Алексей:В нём я указал запуск скрипта каждую минуту, который проверял все файлы .htaccess и восстанавливал их.
улыбнуло. вместо соплей реальное решение. Хостеру снова не зачет. Отключить Cron - как минимум феерично. Не исключаю, что и дыры не нашли. Просто отключив Cron усыпили скрипт злоумышленников.
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #46 Алексей » 28.02.2013, 13:47

factotum:Не исключаю, что и дыры не нашли.
Вы были правы. Файлы .htaccess сегодня опять изменились. Вообщем, готовлюсь к переезду.

Ребята, посоветуйте быстрый и надежный хостинг по цене до 3 тыс./год
Алексей M
Автор темы
Аватара
Репутация: 19
С нами: 11 лет 7 месяцев

Сообщение #47 factotum » 28.02.2013, 14:57

покажусь предсказуемым: http://www.hetzner.de/en/hosting/produkte_webspace/level4

для счастья не хватает ngix и прочих вкусняшек, но с посещаемостью до 2000-3000 визитов в день точно хватит. Проверено)

На выбор PHP 4.x, все версии 5.хх. Из расширений на выбор APC, ImageMagick, Ioncube Loader, Source Guardian, eAccelerator, Zend Optimizer/Zend Guard. Все обновляется достаточно быстро.
factotum
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #48 VEG » 15.05.2013, 12:18

VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 12 лет

Пред.

Вернуться в Поддержка 1.x