информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеАтака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / hacking
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
бага в 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
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach