Viewing file: limpieza.php (11.36 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?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);
}
?>
|