ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 28.04.2024
Просмотров: 99
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
INSERT INTO table VALUES (1, char(97, 100, 109, 106, 110))
Теперь в SQL-запросе нет кавычки, и СУБД его выполнит даже при включенном параметре magic_quotes_gpc или ручном экранировании.
Чтобы вам было удобнее, в табл. 4.1 приведены коды всех английских букв.
Таблица 4.1. Таблица кодов английских букв
a | 97 | b | 98 | c | 99 |
d | 100 | e | 101 | f | 102 |
g | 103 | h | 104 | i | 105 |
j | 106 | k | 107 | i | 108 |
m | 109 | n | 110 | o | 111 |
p | 112 | q | 113 | r | 114 |
s | 115 | t | 116 | u | 117 |
y | 118 | w | 119 | x | 120 |
w | 121 | z | 122 | | |
Помимо букв вам могут понадобиться еще и некоторые другие символы. Например, символ слеша имеет код 47.
-
От теории к практике
Никакая теория не заменит практику. Нет, мы не будем заниматься взломом, потому что это нарушение закона. Мы просто проведем поиск уязвимых к SQL- инъекции web-сайтов, построенных на связке "PHP + MySQL", и посмотрим, какие возможности предоставляет злоумышленнику данная уязвимость.
Для начала нам понадобится web-сайт с приличной посещаемостью. В Google я запустил поиск по словам Sport, USA, php (это случайные слова, которые пришли мне в голову) и начал просматривать результат, выбирая нужное. Первый web-сайт, который меня заинтересовал, ничего особого не содержал. Может, в нем и были ошибки, но поверхностный осмотр ничего особого не показал: все параметры, которые я увидел, фильтровались на опасные символы.
Вторым мне на глаза попался web-сайт www.usacycling.org, посвященный велосипедному спорту. Две минуты мне понадобилось на то, чтобы найти первую уязвимость. Все это время я подставлял в параметры одинарную кавычку и ждал сообщения об ошибке. И вот она появилась в сценарии news/user/story.php в параметре id. Как же любят администраторы называть ключевое поле в таблицах или переменные для поиска по этому полю именем id.
Уязвимый сценарий найден, и для подтверждения этого добавляю в параметр id условие "' and 1=1" и "and 1=1". Это значит, что нужно в адресной строке ввести следующие URL: http://www.usacycling.org/news/user/
story.php?id=1053'%20and%201=1 и http://www.usacycling.org/news/user/ story.php?id=1053'%20and%201=1.
Первый SQL-запрос не выполнился, а второй отработал корректно. Значит, параметр id при подстановке в запрос не заключается в одинарные кавычки. Чуть позже я узнал, что включена магическая кавычка, и то, что параметр id не заключается в одинарные кавычки, — самая большая ошибка администратора. Если бы он выполнил это простое действие, то я не смог бы встроить код, потому что мне нужно было бы закрыть кавычку (выполнить запрос ' and 1=1), а так как одинарная кавычка запрещена, то SQL-инъекция не прошла бы.
Итак, начинаю перебирать количество полей, встраивая объединение запросом select, и последовательно увеличиваю количество NULL-полей: www.usacydmg.org/news/user/story.php?id=1053%20umon%20select%20nun, www.usacydmg.org/news/user/story.php?id=1053%20umon%20seled%20nuU,nuU и т. д. Если количество полей не совпадет с имеющимся в таблице, то web-сервер должен вернуть ошибку, как показано на рис. 5.6.
Рис. 5.6. При неверном количестве полей мы видим ошибку MySQL
Перебор долго не продолжался, потому что SQL-запрос в сценарии получал из базы данных 4 поля, а значит, мне нужно было встроить объединение с четырьмя нулевыми полями:
UNION SELECT null,null,null,null
Теперь рассмотрим web-страницу, которая отобразилась после SQL-инъекции. Ничего особенного в ней нет. Видимо, сценарий читает только одну запись из результата, полученного из базы данных. Чтобы убедиться в этом, я встроил следующий SQL-запрос:
UNION SELECT 1111,2222,3333,4444
SQL-запрос, выполняющий сценарий к базе данных, возвращает одну статью, которая и отображается. Мой дополнительный SQL-запрос добавляет к результату еще одну строку, которую сценарий просто игнорирует. Как же мне увидеть нужный результат? Нужно, чтобы первый SQL-запрос, прописанный в сценарии, ничего не вернул. Для этого достаточно через параметр id передать номер несуществующей статьи, например 99991053. Это число очень большое, и я уверен, что статьи с таким номером не будет. Теперь первый SQL-запрос ничего не вернет, и сценарий выведет нужный мне результат (рис. 5.7). Прямоугольниками я выделил области, куда попали числа из моего SQL-запроса.
Рис. 5.7. Теперь сценарий отображает результат внедренного SQL-запроса
Давайте продолжим. Мне нужно узнать имена используемых таблиц. Попробуем наугад, ведь на web-сайте есть регистрация пользователей, а значит, может существовать таблица users. Добавим следующий SQL-запрос, который выбирает простые числовые поля из таблицы users:
UNION SELECT 1111,2222,3333,4444 FROM users
Тут меня ждала неудача и сообщение об ошибке:
Table 'news.users' doesn't exist
Это уже что-то. Мне сказали, что таблицы news.users не существует. Но я же запрашивал просто users, откуда взялось news? Это имя базы данных, с которой работает web-сайт.
Движемся дальше. Самое сложное в том, что включена фильтрация ввода кавычки и я не могу использовать ее в своих SQL-запросах. Ну ничего, как-нибудь обойдемся. Попробуем обратиться к системной базе данных MySQL и ее таблице user. Самое интересное, что эта база данных оказалась доступной, а значит, можно вычислить хеш пароля. Имя пользователя можно получить с помощью функции user(), а посредством функции version() — версию СУБД.
Все, что мне нужно, я объединил в один большой SQL-запрос и получил следующий URL:
http://www.usacydmg.org/news/user/story.php?id=99991053%20union%
20select%20mysql.user.password,USER(),VERSION(),4444%20from%
20mysql.user/*
В результате я смог увидеть имя пользователя и хеш от пароля подключения к базе данных.
Чтобы получить следующую хеш-сумму, можно выполнить такой SQL-запрос:
UNION
SELECT mysql.user.password, USER(), VERSION(), 4444,
FROM mysql.user
WHERE mysql.user.password NOT IN ('УЖЕ ИЗВЕСТНЫЙ HASH')
Или можно воспользоваться ограничением LIMIT:
UNION
SELECT mysql.user.password, USER(), VERSION(), 4444,
FROM mysql.user
WHERE mysql.user.password
LIMIT 2,3
Теперь SQL-запрос вернет строки со второй по третью. Таким образом, по одному можно прочитать из таблицы все необходимые системные данные.
Теперь остается только подобрать пароль к полученной хеш-сумме, и если MySQL позволяет удаленное подключение, то можно подключаться к ней и делать все, что угодно.
Я не занимаюсь вандализмом, поэтому сообщил администраторам и программистам о найденной ошибке. Пусть исправят.
-
Настройка защиты от SQL-инъекции
SQL-инъекция достаточно опасна, но при правильной настройке web-сервера хакер не сможет ею полноценно воспользоваться. Например, недавно я заглянул на web- сайт www.skanditek.ru (рис. 5.8), который содержит ошибку SQL-инъекции. В поле поиска достаточно ввести какой-нибудь текст и указать символ одинарной кавычки, и в результате мы увидим сообщение об ошибке от MySQL (рис. 5.9).
/а Skanditek :: SEARCH - Microsoft Internet Explorer
File Edit View Favorites Tools
©Back ’ 0 • 0 | & P Search >> Favorites Media [ j- ^ S T □
Address
http: //ww w, skanditek, ru/search/index-en. php?q=%27
5KANDI |EK
o products о standard designs о technologies
o photogallery
о news
о feedback
о home
search
5t.Petersburg office;
Inostrannyi lane 6, St.Petersburg; Russia +7 812 327-1999,323-2301
Moscow office;
Krasnobogatyrskaya str., 2 +7 495 169-6567,168-0342