Читаем Атака на Internet полностью

Впрочем, возможность применения последней ошибки не совсем ясна… В конце 1997 года была обнаружена ошибка в поисковой машине Excite, которая тоже не утруждала себя фильтрацией метасимволов (в версиях 1.0–1.1).

Рассмотрим чуть поподробнее популярный скрипт WWWBoard, наглядно демонстрирующий практически все промахи, которые только может допустить cgi-программист. Все ошибки, перечисленные ниже, относятся к последней версии скрипта.

Первый недостаток – популярность скрипта. Он, несомненно, остается одним из самых распространенных скриптов для досок объявлений, несмотря на то, что ему на смену приходят более современные и обладающие большими возможностями реализации.

Поэтому первое, что должен сделать человек, желающий использовать WWWBoard, – перенести файл с паролем администратора в безопасное место, а собственно скрипт администрирования – либо переименовать, либо перенести в защищенный от общего доступа каталог. Иначе ваша доска объявлений станет хорошим полигоном для исследований возможностей того же John the Ripper (см. главу 9), потому что пароль администратора доски хранится в этом файле зашифрованным с помощью стандартной функции crypt (как правило, шифрующей пароль с помощью алгоритма DES, впрочем, в некоторых реализациях Perl для Win32 эта функция просто возвращает без изменений переданную ей строку). После чего вы можете с удивлением обнаружить, что кто-то удалил все записи на вашей доске, и порадоваться, что у средств администрирования WWWBoard нет никаких возможностей, кроме удаления неугодных записей.

Это, собственно, не ошибка автора скрипта, а всего лишь потенциальная ошибка конфигурирования, которую тем не менее допускают очень многие.

Теперь об ошибках. Основной код выглядит следующим образом:

# Get the Data Number

&get_number;

# Get Form Information

&parse_form;

# Put items into nice variables

&get_variables;

# Open the new file and write information to it.

&new_file;

# Open the Main WWWBoard File to add link

&main_page;

# Now Add Thread to Individual Pages

if ($num_followups >= 1) {

&thread_pages;

}

# Return the user HTML

&return_html;

# Increment Number

&increment_num;

Обратите внимание на пару функций get_number/increment_number. Код первой:

sub get_number {

open(NUMBER,"$basedir/$datafile");

$num = ;

close(NUMBER);

if ($num == 99999) {

$num = "1";

}

else {

$num++;

}

}

Код второй:

sub increment_num {

open(NUM,">$basedir/$datafile") || die $!;

print NUM "$num";

close(NUM);

}

Перейти на страницу:

Похожие книги