Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
бага в Ultimate Board 6.0.x 03.12.01 18:46
Автор: xatmer Статус: Незарегистрированный пользователь
|
Уязвимость в Ultimate Bulletin Board 6.0.x.
Любой пользователь может получить пароли других, воспользовавшись функцией напоминания пароля (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
|
|
|