|
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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|