|
Xatmer Опубликовано: dl, 04.12.01 21:27 Любой пользователь может получить пароли других, воспользовавшись функцией напоминания пароля (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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|