
PERL, CGI, дарки, баги, взломы
Xakep, номер #029, стр. 029-050-3
$mailprog='/usr/sbin/sendmail';
open (MAIL, "|$mailprog $to");
................
тело письма
................
close (MAIL);
По задумке программиста в переменной $to (на деле это значение получается из HTML формы) должен храниться адрес получателя. В общем, все шоколадно, но ничто не мешает поменять значение с какого-нибудь hotguy@from.ru на hotguy@from.ru ls -l >data.txt. Ведь в самом скрипте, обработка переменной с e-mail'ом получателя отсутствовала, как таковая.
Именно так, ты создашь файл, в котором будет храниться содержимое каталога. С наличием предложенного глюка, можно выполнять команды с правами данного пользователя. Выход из сложившейся ситуации, как обычно прост, если поставить вместо адресата параметр -t, то это укажет программе sendmail, что адрес получателя, находится в теле письма:
$mailprog='/usr/sbin/sendmail';
open (MAIL, "|$mailprog -t");
print MAIL "Content-Type: text/plain;\n";
print MAIL "To: $mail\n";................
................
тело письма
................
close (MAIL);
Программа будет исправно отправлять почту, но теперь нельзя выполнять команды на сервере, так что хаксоры отдыхают :).
Этот баг, имхо, вообще один из самых распространенных, ведь почти все сервера, где висят perl программы, работают на *nix системах, поэтому, часто, для рассылки и используют программу sendmail.
Теперь поговорим о несанкционированном чтение файлов сайта. Баг в скриптах очень схож с ошибкой, выполнения любой команды на сервере. Многие программисты удаляют из имени файла знаки |, ;, но забывают убрать символы "., /," поэтому взломщик получает возможность лазать по всему сайту.
Найденная ошибка встречается реже, чем предыдущая, но она есть :). Чаще всего она (МНЕ НУЖНА ОНА, я сошла с ума =) находится в форумах. Ведь как обычно устроен форум? Для каждого сообщения выделяется свой файл. Что же делаем мы, просто поменяем название выделенного файла на нужное нам филе.
Примерный URL для просмотра сообщения:
http://www.some.ru/cgi-bin/forum.cgi?w=read&mes=340
Его заменим на: http://www.some.ru/cgi-bin/forum.cgi?w=read&mes=forum.cgi
Если программист не сделал проверку входных данных, то в браузере высветится исходный код форума. Таким способом некоторые воруют исходники программ, когда нельзя взломать сам сайт :).
Этот глюк не так страшен, если сам сайт бесполезный, но что будет,
когда глюканавтика находятся в онлайн магазинах? Например, в cart32, ошибка в программе схожа - чтение любого файла, результат - множество кредитных карточек.
Бороться с полученной ошибкой просто. Например, в случае с форумом, нужно просто удалить все символы кроме чисел. Если же нужно передать имя файла, который содержит английские символы, то удаляй так:
$filename=~s/[^a-z0-9\.]//g;
А вообще передавать имена файлов через HTML форму - признак дурного тона, лучше хранить хэш файл, в котором некоторые значения соответствуют именам файлов.