Script / comando de expresiones regulares PHP / SSH para eliminar código de malware idéntico de muchos archivos

Tengo un virus que ha infectado miles de archivos en uno de los servidores de mi cliente.

Afortunadamente, he lidiado con muchos otros progtwigs maliciosos en el servidor de este tipo y parece sencillo hacer regex simple (puso todos sus sitios web en la misma cuenta 🙁 pero estoy trabajando con él para resolver eso).

Básicamente, a diferencia de la mayoría de malware que he visto donde se inyecta php ANTES de cerrar el código GOOD (lo que dificulta mucho determinar cuál es el código correcto / incorrecto), este malware actual SIEMPRE agrega un nuevo .

Entonces, básicamente, dicen que hay un buen código aquí:

  

En lugar de agregar algún tipo de eval de base64_decode inmediatamente después de la instrucción require pero antes del?> (Que puede dificultar la eliminación cuando la página termina en una sentencia condicional / compleja), esto siempre agregará el siguiente código con un NUEVO así:

  

No quiero poner ningún código malicioso aquí, pero así es como siempre comienza el código malicioso:

  

Me gustaría buscar en cada archivo <?php @error_reporting(0); if (!isset <?php @error_reporting(0); if (!isset y si es la última statement de PHP en la página, entonces elimine todo dentro del

Aquí es cómo se limpia todo el proyecto con php puro.

De ningún modo incurriré en ninguna responsabilidad por daños, incluidos, entre otros, daños directos, indirectos, especiales o consecuentes que surjan de, resulten o estén relacionados con el uso del código provisto, estén o no basados en garantía, contrato, agravio o de otro modo; si las personas o los bienes sufrieron o no un daño o no; y si la pérdida se originó, o surgió de, los resultados del uso de este código. ;pag

 < ?php //Enter it as it is and escape any single quotes $find=''; echo findString('./',$find); function findString($path,$find){ $return=''; ob_start(); if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if(is_dir($path.'/'.$file)){ $sub=findString($path.'/'.$file,$find); if(isset($sub)){ echo $sub.PHP_EOL; } }else{ $ext=substr(strtolower($file),-3); if($ext=='php'){ $filesource=file_get_contents($path.'/'.$file); $pos = strpos($filesource, $find); if ($pos === false) { continue; } else { //The cleaning bit echo "The string '".htmlentities($find)."' was found in the file '$path/$file and exists at position $pos and has been removed from the source file.
"; $clean_source = str_replace($find,'',$filesource); file_put_contents($path.'/'.$file,$clean_source); } }else{ continue; } } } } closedir($handle); } $return = ob_get_contents(); ob_end_clean(); return $return; } ?>

Buena suerte.

ACTUALIZACIÓN (con Regex):

 < ?php error_reporting(E_ALL); $find='<\?php @error_reporting\(0\); if \(!isset\((.*?)\?>'; echo findString('./',$find); function findString($path,$find){ $return=''; ob_start(); if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if(is_dir($path.'/'.$file)){ $sub=findString($path.'/'.$file,$find); if(isset($sub)){ echo $sub.PHP_EOL; } }else{ $ext=substr(strtolower($file),-3); if($ext=='php'){ $filesource=file_get_contents($path.'/'.$file); //The cleaning bit echo "The string '".htmlentities($find)."' was found in the file '$path/$file and has been removed from the source file.
"; $clean_source = preg_replace('#'.$find.'#','',$filesource); // $clean_source = str_replace($find,'',$filesource); file_put_contents($path.'/'.$file,$clean_source); }else{ continue; } } } } closedir($handle); } $return = ob_get_contents(); ob_end_clean(); return $return; } ?>

Hasta ahora, este es el más cercano (gracias mvds)

sed -e "s/< ?php @error_reporting.*?>//g" --in-place=_cleaned *

aunque –in-place = _cleaned está dando el error sed: illegal option -- -