BugTraq.Ru
Русский BugTraq
https://bugtraq.ru/library/www/ubb.html

Уязвимость в 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)

[17101; 2; 7.5]




  Copyright © 2001-2024 Dmitry Leonov Design: Vadim Derkach