Любой пользователь может получить пароли других, воспользовавшись функцией напоминания пароля (lost password).
Алгоритм следующий.
Можно выстраивать целые цепочки из майлов.
А теперь причина:
Файл 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) | |
[17573; 2; 7.5] |
|
|