ПИШЕМ БАЖНУЮ CGI'ШКУ НА PERL

Спецвыпуск Xakep, номер #022, стр. 022-024-1


типичные дырки перловых cgi

MOOF (moof@real.xakep.ru, http://moof.ru)

В то время как все админы и программеры мира тратят свое время и здоровье на поиск и исправление дырок в своих программах, мы с тобой займемся изготовлением этих самых дырок. Нашей задачей будет написать самый дырявый в мире скрипт на языке Perl. Потом ты этот скрипт сможешь подсунуть своему другу в качестве суперской гостевой книги и ломать его сайт каждый день ;). Шучу, конечно! Ты просто научишься находить дырки в скриптах :). Но хватит лирики, прейдем к делу.

ЧТО ПИШЕМ?

Писать мы с тобой будем гостевую книгу. Ведь форумы и гостевые книги самые распространенные бесплатные скрипты и при этом одни из самых дырявых. К сожалению (или к счастью?), далеко не все дыры можно использовать для дефейса сайта. Некоторые из них позволяют отправлять e-mail'ы с содержанием файлов или каталогов, другие позволяют удалять содержимое сайта.

СМОТРИМ!

Самая распространенная ошибка - это ошибка, называющаяся "null-byte poison". Это одна из самых старых ошибок, появившаяся вместе с первыми операционными системами. Давай посмотрим на наш скрипт, имя файла, в котором хранятся все записи гостевой книги, у нас является параметром, который передается скрипту:

$gbname = param('gbname');

И далее мы используем этот параметр для открытия файла с сообщениями:

open(FILE, "$gbname.dat");

@DATA = <FILE>;

close(FILE);

С одной стороны, это хорошо: с одним скриптом мы можем создать сколько угодно гостевых книг, разделив их по разным темам. Но, с другой стороны, в этом куске кода заложена ошибка "null-byte poison". С помощью нашего скрипта можно получить доступ к содержимому любого файла. Естественно, если сервер даст доступ. На бесплатных хостингах, например, стоят серьезные системы разграничения доступа, и тебе никогда не получить файл паролей ОС (какой-нибудь "/etc/passwd"). Но увидеть содержимое файла в каталогах пользователя легко сможешь. Все, что нам надо, это указать в параметре "gbname", передающегося скрипту, путь к нужному файлу:

http://www.server.com/cgi-bin/gb.cgi?gbname=../WWW/index.html%00.

В конце нашего запроса мы поставили спецсимвол с кодом 0, являющийся в языке программирования С символом конца строки. А поскольку большинство ОС написаны именно на С, а perl читает файлы средствами ОС, то получается, мы заставим выполнить perl следующую команду:

open(FILE, "../WWW/index.html");

в которой мы прочитаем содержимое файла index.html и выведем его на экран. Хотя сам perl и не распознает символ с кодом 0 как окончание строки, операционная система это делает за него. Естественно, путь к файлу может быть другим.

КОМАНДУЕМ!

Следующая довольно распространенная ошибка, даже не одна, а целый набор ошибок - позволяющий выполнять команды на сервере. Вернемся к нашему открытию файла. В perl командой open можно не только открывать файлы, но и запускать программы на сервере. Для этого надо всего лишь поставить символ "|" после команды. Теперь, выполнив

http://www.server.com/cgi-bin/gb.cgi?gbname=ls|,

мы увидим содержимое каталога. Вместо ls можно попробовать написать другие unix-команды. Например, "rm -r *", которая удаляет все файлы.

Содержание  Вперед на стр. 022-024-2