информационная безопасность
без паники и всерьез
 подробно о проекте
Rambler's Top100Сетевые кракеры и правда о деле ЛевинаПортрет посетителяГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модель надежности отказоустойчивой... 
 Foreshadow продолжает дело Meltdown... 
 Попасть под лошадь 
 Последний спокойный день для сайтов... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / библиотека / www
БИБЛИОТЕКА
вход в библиотеку
книги
безопасность
программирование
криптография
internals
www
телефония
underground
беллетристика
разное
обзор: избранное
конкурс
рейтинг статей
обсуждение




Подписка:
BuqTraq: Обзор
RSN
БСК
Закон есть закон



The Bat!

Уязвимость в Ultimate Bulletin Board 6.0.x
Xatmer
Опубликовано: dl, 04.12.01 21:27

Любой пользователь может получить пароли других, воспользовавшись функцией напоминания пароля (lost password).

Алгоритм следующий.

  1. Находим email какого-либо из существующих пользователей на доске.
  2. Регистрим пользователя с таким-же e-mail
  3. Меняем e-mail на нужный нам
  4. Пользуемся кнопочкой выслать пароль
  5. Получаем пароль не только свежесозданного пользователя, но и того чей mail использовалься вначале.

Можно выстраивать целые цепочки из майлов.

А теперь причина:

Файл ubb_lib_misc.cgi

sub find_lost {

::::::::::::::..

# get list of registered emails
my @email_list = &OpenFileAsArray("$vars_config{MembersPath}/emailfile.cgi");

#lowercase the input
my $lc_email = lc($in{email});

# find matches
foreach (@email_list) {
        ($row_email, $row_un) = split(/\|\|/, $_);
        $lc_row_email = lc($row_email);
        if ($lc_row_email eq "$lc_email") {
                chomp($row_un);
                push(@matches, $row_un);
        }
}

# now we have matches
$match_total = @matches;

:::::::::::::::.

Как видно из кода, функция использует файлик emailfile.cgi для поиска пользователей с искомым адресом e-mail. Файлик следующего формата

email|public-mail|user_number

Дальше идет проход по профилям найденных пользователей и отсылка пароля этих пользователей на введенный e-mail.

А теперь разберемся, из-за чего это происходит.

Файл ubb_profile.cgi

Функция update_profile


# if email is changing, update emailfile.cgi
undef(@amend);
if ($lc_email ne "$lc_old_email") {

my @emailsfile = &OpenFileAsArray("$vars_config{MembersPath}/emailfile.cgi");

$lc_old_email =~ s/([\.|\@])/\\$1/isg;

#####################################################
#####################################################

foreach $checker(@emailsfile) {
chomp($checker);
if ($checker =~ m/^$lc_old_email\|\|/i) {
        ($j, $thisnum) = split(/\|\|/, $checker);
                $NewLine = "$lc_email||$thisnum";
                push(@amend, $NewLine);
} else {
   push(@amend, $checker);
}
}

#####################################################
#####################################################

open(FILE, ">$vars_config{MembersPath}/emailfile.cgi");
&lock;
foreach $dos(@amend) {
chomp($dos);
print FILE "$dos\n";
}
&unlock;
close(FILE);
chmod (0666, "$vars_config{MembersPath}/emailfile.cgi");
}

Что-же мы тут видим (интересующий кусок выделен комментариями): файлик открывается, просматривается на наличие заменяемого e-mail'a, при обнаружении меняется, потом записывается. Только не учитывается, что кто-то мог ввести чужой mail и замена будет проходить не только у пользователя, запросившего смену адреса, а всех таких адресов.

Данная уязвимость обнаружена во всей ветке UBB 6.0.x, ветка 6.1.x не тестировалась ввиду отсутствия данной версии.

Решение проблемы:

В файле ubb_profile.cgi сделать следующую замену

Исходный файл:

foreach $checker(@emailsfile) {
chomp($checker);
if ($checker =~ m/^$lc_old_email\|\|/i) {
        ($j, $thisnum) = split(/\|\|/, $checker);
                $NewLine = "$lc_email||$thisnum";
                push(@amend, $NewLine);
} else {
   push(@amend, $checker);
}
}

измененный файл:

foreach $checker(@emailsfile) {
chomp($checker);
if ($checker =~ m/^$lc_old_email\|\|/i) {
        ($j, $thisnum) = split(/\|\|/, $checker);
          if($thisnum == $user_number){
                $NewLine = "$lc_email||$thisnum";
                push(@amend, $NewLine);
          }else{
                  push(@amend,$checker);
          }
} else {
   push(@amend, $checker);
}
}

(C)2001 Xatmer xatmer@mail.ru

обсудить  |  все отзывы (0)  

[15092; 2; 7.5]




Rambler's Top100
Рейтинг@Mail.ru





  Copyright © 2001-2018 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach