ScriptKiddie, или опять о дырявых скриптах.
Доброго времени суток. Наверняка вы все слышали словосочетание "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`овского файла нарушен! Тоже весьма неприятно.
Какой же мы сделаем отсюда вывод? Вывод один - использовать только хорошие, проверенные скрипты, типа этого :)). Конечно, лучше всего писать свои скрипты, тогда вы можете быть уверены, что никто не догадается, как в скрипте все "закручено". А если уж ты решил использовать бесплатный скрипт, проверь его на подобные глупейшие ошибки. Ну, у меня все. Увидите где ТигВоте - ломайте на фиг, пусть знают=)))