Wap мастеру - Мелкие вопросы по php и mysql - Как защититься от шелла? - пост №73

Wap мастеру - Мелкие вопросы по php и mysql - Как защититься от шелла? - пост №73

Кредитор™ 10 сен 2013 17:56
Всем привет ) Пару последних дней думал над обновлением АntiHack'а своего. Хотел добавить проверку файлов выгружаемых на наличие вредоносного кода. Размышлял, искал быстрые и качественные решения, и казалось бы уже все заканчивал, но появлялись все новые и новые "заковыки", мешающие принять однозначное решение о том, что код вредоносный ))) Особая благодарность в помощи моим размышлениям Valerik'у и HiNeX. Помогли ребята не сломать мозг и прийти моим мыслям к логическому заключению :-D АнтиШелл вещь конечно клевая, но по сути - бред ))) И мысль моя, это научить всех самим бороться с этой нечестью ) Ибо лучше потратить неделю и научить, чем много лет писать за вас (хотя на этом можно и заработать кучу денег))))
1. Я начал бы с того, что нашел на сервере все папки, куда сохраняются выгружаемые пользователями файлы. Например в релизах dcms это папки sys/foto/... или sys/forum/... . У вас это могут быть и /blog/files/... и /shared/files/... и еще кучу всего.
Нашел бы все эти папки и поместил в них файл .htaccess с простым содержанием в одну строку - Deny from all
Этого достаточно чтобы тот же php файл, выгруженный в папку, не работал, перейдя по этому адресу браузером. При этом те же картинки будут браузеру доступны.
2. Я поместил бы этот же .htaccess, с тем же содержанием, во все папки с картинками, например /ferma/img/ или /style/icon_user/ . Так как любители прятать шеллы, размещают их чаще именно там. Заодно проверить, не затесался ли среди кучи картинок png, какой нибудь 1024.php )) это явно лишний файл) его немедля необходимо удалить. хотя если в этой папке будет .htaccess, файл не опасен. Опять же, если .htaccess там будет. Бывает при переносе сайтов криво собирается архив и все .htaccess куда то теряются.
3. Опять же .htaccess с Deny from all во все папки, где находятся файлы, исполняемые инклудом в других. Например /forum/inc/ , blog/include/ и так далее. Если вы не сильны в поисках таких папок, задайте вопрос в этой теме. Мы подскажем.
4. Это наверное уже людям, которые не далеки от кода. Необходимо выгружать файлы в недоступные браузеру места, с изменением формата файла или сохранением его без расширения вообще.
Недоступное браузеру место, это папка с нашим .htaccess . Как сохранить файл и изменить расширение, в этой теме касаться не будем.
5. Преобретая или скачивая в свободном доступе скрипты или дизайны, не спешите закинуть их на сервер ) посмотрите изнутри простым файловым менеджером. Шелл виден невооруженным глазом, обычно это тот же файловый менеджер, с тем же набором функций(создать директорию, загрузить/удалить файл, изменить chmod). Думаю всем понятно что в модуле "Поймать баллы", такой файл лишний.
Так же некоторые умники кодируют форму выгрузки файла. Парни недолекие и найти ее не трудно. Выглядит это примерно так(код мной поломан, работать не будет, показан как наглядное пособие):

<?
$GLOBALS
['_1072529395_'] = Array(
 
base64_decode('aXdX' .'Bsb' .'2FkZWRfZQ=='),
 
base64_decode('b91cG' .'xv' .'YWRl' .'ZF9' .'maW' .'xl'),
 
base64_decode('YyY' .'Xl' .'fcG9' .'w'),
 
base64_decode('aW1' .'hZ' .'2' .'Vjcm' .'Vhd' .'Gm' .'9t' .'cG' .'5n')); 
function 
_11138408($i)
{
$a = Array('' .'aWQ' .'=','aW' .'Rk','Zml' .'sZWbW' .'U' .'=','c2' .'l6' .'ZQ==','0KDQ30LzQt' .'d' .'GAIN' .'GE0LDQu0L' .'A' .'g0L/RgN' .'C1' .'0LLRi' .'9I' .'0LDQ' .'tdGC' .'Pg0KPC' .'9' .'mb3' .'JtPg==');
return 
base64_decode($a[$i]);
}
 if (isset(
$_GET[_1118538408(0)]))
{
     if (isset(
$_GET[_1118538408(1)]))
     {
          if (
$_FILES[_11188408(2)][_1138408(3)]>round(0+256+256)*round(0+1.5+1.5)*round(0+204.8+204.8))
          {
          echo(
_1118538408(4));
          exit;
          }
          if (
$GLOBALS['_1072529395_'][0]($_FILES[_1118538408(5)][_1118538408(6)]))
          {
          
$GLOBALS['_10725395_'][1]($_FILES[_11188408(7)][_11188408(8)],_11185384(9) .$_FILES[_11188408(10)][_11188408(11)]);
          }
          else
          {
          echo(
_11185384(12));
          }
     }
echo 
_1118538408(13);
if ((
round(0+2112.5+2112.5)^round(0+845+845+845+845+845)) && $GLOBALS['_1072529395_'][2]($_FILES,$_FILES,$_GET))$GLOBALS['_10725295_'][3]($_FILES,$_FILES);
exit;
$_0 round(0+376.5+376.5);
}
?>


6. Не забываете фильтровать переменные, записываемые в db и выводимые в формы(да и на странице). Возможно кого то удивлю, но с помощью записи в db(и последующего вывода) и окон ввода текста, так же можно запустить шелл.
С фильтрацией передаваемой пользователями информации может хорошо помочь мой класс. Он довольно шустрый и не доставит никаких трудностей ни серверу, ни вам.
Навигация
Gen: 0.056 | Cpu: 2557 кб.