Апостроф или как ломают ваши сайты
Всегда задаюсь вопросом при посещении очередного дырочного ресурса. Неужели так сложно написать функцию проверки параметров, передающихся от пользователей интернет ресурса? Если вы думаете, что подобная дыра встречается лишь на сайтах каких-нибудь фан клубов, то глубоко заблуждаетесь, ибо эта дырочка встречается и на очень и очень серьезных ресурсах.
Надо ли говорить, насколько опасна SQL Injection?
Если у вас MySQL, то хакер может просматривать, добавлять и обновлять информацию в вашей базе данных, записывать данные из базы в файл, загружать и просматривать любой файл на вашей системе.
Если у вас MSSQL, то вдобавок к вышесказанному у хакера также есть возможность выполнять команды оболочки. Кроме того хакеру не нужно знать предварительно о названиях таблиц и столбцов (как в случае с MySQL), данные о всех таблицах хакер легко получает из специальной системной таблицы MSSQL.
Каким образом это происходит? Да собственно, ничего особого сложного тут нет.
Пусть к примеру у вас есть страничка page.php (очень популярное название скрипта, в самый раз для хакера, который юзает гугл для поиска уязвимых сайтов), которая по параметру id вытаскивает из базы данных страничку, т.е. запрос к скрипту выглядит так page.php?id=7345
В самом скрипте к примеру стоит строчка $query=”select * from blabla where id=$_GET[id]“;
Хакер при помощи специально сформулированного запроса может делать с вашей базой усе что угодно. Это делается при помощи объединения двух запросов функцией UNION. Особенность этой функции в том, что количество столбцов обоих функций должно быть одинаково. Поэтому хакер первым делом определяет количество столбцов например таким образом
page.php?id=7345+union+select+1/*
Если выдается ошибка, то тогда второй запрос
page.php?id=7345+union+select+1, 2/*
Если опять ошибка, то третий запрос
page.php?id=7345+union+select+1, 2, 3/*
К примеру система скушала этот вариант и на экране отобразилась цифра 2. Это значит, что второй столбец в запросе будет выводится на экран.
Следующим запросом хакер может вывести любую информацию, например имя пользователя
page.php?id=7345+union+select+1, user(), 3/*
Зная структуру базы данных, хакер может вытаскивать и менять любую информацию. Конечно, например пароли никто уже (почти никто) не хранит в открытом виде. Обычно применяют метод шифрования md5. Хакер может вытащить хеши и попробовать подобрать пароль при помощи специальных программ и толстых словарей. А можно и куда проще сделать, если на сайте стоит система напоминания пароля (а она должна стоять, ибо как юзер свой забытый пароль к примеру узнает? зашифрованный пароль по md5 невозможно расшифровать, только попытаться подобрать). Хакер меняет мыло юзера на свое, делает напоминание пароля и заходит под юзером.
Вы конечно можете сказать, да фигня все это, даже если у меня на сайте такая ошибка, у меня нет ничего ценного, да и у сайта посещаемость 100 человек в сутки.
Даже если у вас на сайте нет ничего ценного, то хакер запросто может установить на ваш сайт например прокси и использовать ваш сайт для атаки на другие или попросту записать ваш сайт в свою бот сеть и опять же использовать его для атаки на другие ресурсы или перенаправлять трафик с вашего ресурса на другой. Кроме того хакер может выполнить DoS атаку на ваш сервер базы данных, например подставив в запрос выражение c функцией benchmark, которая повторяет выражение n-количество раз. Вряд ли ваш сервер выдержит 10 миллионное md5 кодирование текущего времени.
Как проверить ваш сайт на уязвимость?
Вручную конечно же. Но если для вас это сложно или у вас просто охрененно большой ресурс, то тут на помощь придут разные программы. Для начала загоните в гугл такую строку: “error” site: урл_вашего_сайта. Кавычки указывать нужно.
Правда этот метод срабатывает в случае хорошей индексации вашего ресурса гуглом.
Есть также и специальные программы, например
Демо версию можно скачать с их сайта. В демке функция проверки веб приложений работает полноценно, единственно что не будет подробного описания об уязвимости.
Как обезопасить себя?
Во первых попросить вашего провайдера отрубить в MySQL into outfile и loadfile, вернее установить более высокий уровень доступа к ним.
В MSSQL отключить exec master..xp_cmdshell.
Ну и конечно проверять все параметры, которые могут поступить непосредственно от пользователя вашего ресурса. Например для PHP используем ereg, которая отсекает все символы кроме тех что вы позволите (алфавитные и цифровые).
October 7th, 2007 at 10:34 pm
Да никак себя не обезопасить, все равно уязвимость какая то найдется
October 8th, 2007 at 12:38 am
Это то понятно :) Просто защита может оказаться настолько сложной для хакера, что он просто плюнет на этот сайт. Правда если ресурс отрабатывается по заказу, то тогда да, вряд ли что-то спасет
December 9th, 2007 at 8:13 pm
Не понял как проверять гуглем на ошибки
April 25th, 2008 at 3:36 am
Ну вообще - есть очень простые пути себя обезопасить - банально думать в процессе писания. Все параметры проверять по типу данных и в случае необходимости использовать функции экранирования