%PDF- %PDF-
Direktori : E:/nuevo/htdocs/ |
Current File : E:/nuevo/htdocs/limpieza.php |
<?php /*Para no ir devolviendo el contador en un array en cada funcion lo guardamos en sesion*/ session_start(); $_SESSION['contador']=0; /* * Busqueda y limpieza de codigo malicioso en cualquier php * version: 2.0 * * * 17/01/2014: Añadida nueva expresion regular para encontrar código malicioso "document.write(..." en .js * Añadida revisión de ficheros .js * * 10/10/2013: Añadidos los regex de los códigos maliciososo zen_framework y applyfilter() * * 09/10/2013: Añadido array donde se indicarán todos los posibles codigos maliciosos y sus expresiones regulares para eliminarlos * para nuevos codigos encontrados, añadir nuevo indice con la nueva regex para borrarlo. * * * Notas: para evitar tener que trabajar con demasiados ficheros (clases php, ficheros js o css) se ha incluido todo en este unico fichero. * */ /********************************************************/ /********************************************************/ /* MODIFICAR A PARTIR DE AQUI******************************************************/ /*DECLARAMOS AQUI TODOS LOS POSIBLES CODIGOS MALICIOSOS, LA EXPRESION REGULAR PARA BUSCARLOS Y EL TEXTO DE SUSTITUCION EN CASO DE ENCONTRARLOS, *Nota: en la mayoria de los casos solo habrá que eliminarlos (texto='') * * $array_malicioso contendrá los código que sabemos al 100% que deben de eliminarse * Formato: $array_malicioso['nombre_codigo_malicioso]=array('expresion regular','texto de sustitucion'); * * $posible_array_malicioso contendrá los códigos no seguros de ser eliminados y que deberán revisarse a mano * Formato: $posible_array_malicioso[]=array('expresion regular','explicacion del codigo buscado'); */ $array_malicioso=array(); //MUAHAHAHAHAHA (pequeña licencia dramática) $array_malicioso['eval_base64_decode']=array('/eval\(base64_decode\(\"(.*==)\"\)\);/m',''); $array_malicioso['zen_framework']=array('/<\?php \$zend_framework="\\\\x63\\\\162(.*)x2f"\); \?>/s',''); $array_malicioso['applyfilter']=array('/function applyfilter\((.*)\'applyfilter\', 1, 0\);/s',''); $array_malicioso['document.write-externo']=array('/\/\*[A-Za-z0-9-]*\*\/[\r\n\s]*(.*)[\r\n\s]*\/\*\/[A-Za-z0-9-]*\*\//im',''); // $array_malicioso['#caracteres#codigo#/caracteres#']=array('/\/\#[A-Za-z0-9-]*\*\/[\r\n\s]*(.*)[\r\n\s]*\/\*\/[A-Za-z0-9-]*\*\//im',''); $posible_array_malicioso=array(); $posible_array_malicioso[]=array('/eval\(base64_decode\(\"(.*(?!= \(==\)))\"\)\);/m','- Busca eval(base64_decode(...)) y comprueba si es necesario para el funcionamiento normal.'); $posible_array_malicioso[]=array('/\bjs.php|\<iframe\b/i','- Busca iframes o includes javascript hacia ficheros .php y comprueba si son necesarios para el funcionamiento normal'); /* NO MODIFICAR A PARTIR DE AQUI******************************************************/ /********************************************************/ /********************************************************/ /********************************************************/ //calculamos la hora de inicio del script para calcular el tiempo empleado en la busqueda y limpieza $TiempoInicial = getTiempo(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"> <head> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Limpieza de código</title> <meta name="author" content="Héctor Alvarez Fernandez (ektorsite.com)"/> <meta name="description" content="Limpieza de código malicioso en webs"/> <meta name="Keywords" content="limpieza, codigo, malicioso, webs, wordpress, joomla, etc"/> <meta name='robots' content='noindex, nofollow'/> <style> html {height:100%;} body { background: #eeeeee; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 12px; margin: 0; text-align:center; height:100%; } #contenedor { width:910px; text-align:left; margin:0 auto; border-left:2px solid #cccccc; border-right:2px solid #cccccc; height:100%; background-color:#ffffff; } #contenido{ padding: 40px; } .revisando, .error, .finalizado, .exito{ border-radius: 10px 10px 10px 10px; -moz-border-radius: 10px 10px 10px 10px; -webkit-border-radius: 10px 10px 10px 10px; border: 1px solid #000000; padding:5px 10px; } .revisando{ background-color:#cfcfcf; margin:10px 0; } .error, .finalizado.titulo_error, .errores{ background-color:#edab9f; margin:5px 0; } .exito, .finalizado, .limpiados{ background-color:#a3eb9f; margin:5px 0; } .todos, .errores, .limpiados, .sin_errores{ cursor:pointer; padding:2px 5px; /* background-color:#333333;*/ color:#000000; margin-left:15px; border-radius: 10px 10px 10px 10px; -moz-border-radius: 10px 10px 10px 10px; -webkit-border-radius: 10px 10px 10px 10px; border: 1px solid #000000; } .menu{margin-bottom:20px; } .oculto{display:none;} </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $('.errores').click(function (){ $('.error').toggle('slow'); }); $('.limpiados').click(function (){ $('.exito').toggle('slow'); }); }); </script> </head> <body> <div id="contenedor"> <div id="contenido"> <div class='menu'>Plegar/desplegar: <span class='limpiados'>Los errores eliminados</span> <span class='errores'>Los errores a revisar manualmente</span> </div> <?php $mensajes=recorrerDirectorio("./",$array_malicioso,$posible_array_malicioso); ?> <div class='finalizado<?php if ($mensajes!="") echo " titulo_error";?>'> <?php if ($mensajes!="") {?> <h2>Revisión finalizada, se ha encontrado código malicioso o susceptible de serlo (<?=$_SESSION['contador']?> avisos).</h2> <h4>Si existen, comprueba los avisos en rojo.</h4> <?php } else {?> <h2>¡¡ Enhorabuena, no se ha encontrado código malicioso conocido !!</h2> <h4>Si sospechas que existe alguna amenaza que no se ha encontrado, ponte en contacto con nosotros en <a href="" target="_blank">ektorsite.com</a></h4><?php } ?> </div> <?php echo $mensajes; $TiempoFinal = getTiempo(); $tiempo = round(($TiempoFinal - $TiempoInicial),6); echo "<div class='finalizado'>Tiempo de carga $tiempo segundos.</div>"; ?> </div> </div> </body> </html> <?php //recorremos directorios de forma recursiva function recorrerDirectorio($ruta,$array_malicioso,$posible_array_malicioso) { $mensaje=""; $dir = opendir($ruta); while ($elemento = readdir($dir)) { if( $elemento != "." && $elemento != "..") { //si es un directorio, entramos a sus hijos if (is_dir($ruta.$elemento)) $mensaje.=recorrerDirectorio( $ruta.$elemento.'/',$array_malicioso,$posible_array_malicioso ); //abrimos el fichero y lo limpiamos (solo para ficheros .php y .js y evitando este fichero actual para que no se borren los comentarios) elseif (((strpos($elemento,'.php')!==false) || (strpos($elemento,'.js')!==false)) && ($elemento!=basename(__FILE__))) $mensaje.=limpiar_fichero($ruta.$elemento,$array_malicioso,$posible_array_malicioso); //revisamos también si hay htaccess donde no debería elseif ((strpos($elemento,'.htaccess')!==false) &&($ruta!='./')) $mensaje.="<div class='error'>Revisa el htaccess de la carpeta <b>".$ruta."</b></div>"; } } return $mensaje; } //limpiamos los códigos maliciosos y devolvemos las lineas que tengan posibilidad de contener más código oculto function limpiar_fichero($fichero,$array_malicioso,$posible_array_malicioso) { $mensaje=$mensaje_final=""; /*RECORREMOS EL ARRAY MALICIOSO Y REEMPLAZAMOS EL CODIGO MALICIOSO POR LO INDICADO EN EL ARRAY*/ $contenido_fichero = file_get_contents($fichero); //abrimos el fichero y obtenemos todo el contenido foreach ($array_malicioso as $nombre=>$regex) { if (preg_match($regex[0], $contenido_fichero)) //solo actualizamos si encontramos el codigo { $contenido_fichero = preg_replace($regex[0], $regex[1], $contenido_fichero); //sobreescribimos el codigo malicioso con lo indicado en el array $mensaje.="<div class='exito'> Se ha encontrado y limpiado el código malicioso '".$nombre."' en el fichero.</div>"; $_SESSION['contador']++; } } if ($mensaje!="") file_put_contents($fichero, $contenido_fichero); //solo guardamos si se encontraron errores /*VOLVEMOS A ABRIR EL FICHERO, ESTA VEZ PARA RECORRERLO LINEA A LINEA Y BUSCANDO POSIBLES CODIGOS MALICIOSOS A REVISAR MANUALMENTE*/ $DescriptorFichero = fopen($fichero,"r"); $lin='1'; while(!feof($DescriptorFichero)) { $linea = fgets($DescriptorFichero,4096); if ($linea!='') $mensaje.=revisar_posibles($linea,$lin,$posible_array_malicioso); //pasamos la linea en la que se produciría el error $lin++; } if ($mensaje!="") //devolvemos mensaje solo si el fichero se limpió o había sospechas de codigo malicioso a revisar manualmente $mensaje_final="<div class='revisando'>Fichero sospechoso: <b>".$fichero."</b>.".$mensaje."</div>"; return $mensaje_final; } //revisamos los posibles codigos maliciosos a revisar manualmente function revisar_posibles($texto,$linea,$posible_array_malicioso) { $mensaje=""; foreach ($posible_array_malicioso as $regex) { if (preg_match($regex[0], $texto)) { $mensaje.="<div class='error'>Existe la posibilidad de que contenga códigos maliciosos ocultos en la linea <b>".$linea."</b>."; if ($regex[1]!='') $mensaje.="<br>".$regex[1]; $mensaje.="</div>"; $_SESSION['contador']++; } } return $mensaje; } function getTiempo() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } ?>