|
|
.::Дыра
в cgi скрипте TigVote::.
Доброго времени суток.
Наверняка вы все слышали словосочетание "script kiddie". Что же это
означает? Буквально - скрипткидди это те люди, которые, сами будучи
недостаточно компетентны в security, тем не менее успешно взламывают
сайты (в том числе большие и корпоративные). Скрипткидди - это вчерашние
чайники, которые научились пользоваться BugTrack`ом, быстро находить
уязвимые скрипты и успеть использовать эти уязвимости раньше, чем админ
сайта закроет брешь. Все решает скорость, а отнюдь не знания...
Наверно, самым часто приводимым примером в череде таких "неправильных"
скриптов является TigVote, который вы найдете в зарослях укропа на сайте
tigra.lgg.ru. Этот опросник дыряв как сито с самой первой своей версии
и, по-моему, вплоть до последней. Да, после шквала писем от владельцев
взломанных через этот скрипт сайтов автор соизволил исправить исходник,
но сделал он это, что самое смешное, не очень добросовестно. Итак,
разберемся в работе данного скрипта.
<form action=http://site.ru/cgi-bin/tigvote.cgi method=POST> <input type=hidden
name=file value="vote01.txt">
<center>"Тема опроса"</center>
<input type=radio name=tigvote value=1> вариант 1
<input type=radio name=tigvote value=2> вариант 2
<input type=radio name=tigvote value=3> вариант 3
<input type=radio name=tigvote value=4> вариант 4
<input type=radio name=tigvote value=5> вариант 5
<input type=submit value="Ответить">
</form>
Ну, уже догадались, где собака порылась? Конечно, в объекте формы file:
<input type=hidden vale="file01.txt"> - параметр "file", содержащий имя
файла, в котором сохраняются результаты опроса, передается напрямую в
виде строки без всяких проверок!!! Особенности языка PERL, на котором
написан этот шедевр, таковы, что указав, например, вместо "vote01.txt"
примерно следующее: "vote01.txt|ls", мы получим выполнение команды ls на
сервере с правами nobody и как результат - список файлов в каталоге /cgi-bin.
Неплохо, да? Какой простор для фантазии... Итак, сохраним форму к себе
на винт, чуть-чуть исправим ее и получим удаленное администрирование
через веб-интерфейс. Все, что нам в данном конкретном случае нужно - это
чтение / запись файлов. Что позволит нам сделать дефейс сайта. Вопиющая
дырка, но еще хуже то, что она была прикрыта далеко не сразу. А всего-то
и нужно было, что указывать имя файла не явно, а в виде некоторого
параметра, можно даже числового. Никто бы и не догадался! И, конечно,
отсеять символ "|" через регулярные выражения. Это и было в конце концов
проделано... Казалось бы, в новых, исправленных версиях скрипта ловить
нечего. Но не все так просто... Если, к примеру, заменить нашу любимую
строку на нижеследующее:
<input type=hidden name=file value="любой файл на сайте"> - скрипт
запишет всю инфу голосования (значение каждого пункта опроса, список IP
проголосовавших, и т.д.) в выбранный нами HTML файл. Получим тоже дефейс
сайта, правда, не такой, как нам бы хотелось, но все равно приятно.
<input type=hidden name=file value="tigvote.cgi"> - вот оно. Нажав на
кнопочку Submit, увидим исходник tigvote.cgi, на который будут красиво
наложены проценты, число голосовавших, айпи и прочая муть. Тот, кто
попытается проголосовать после вас, получит всего лишь ошибку 500 - еще
бы, ведь синтаксис Perl`овского файла нарушен! Тоже весьма неприятно.
|