|
AMA - Level 2
Регистрация: 10.06.2006
Сообщений: 1,113
Провел на форуме: 17668503
Репутация:
5826
|
|
SQL инъекция (в т.ч. и blind SQL): Работа с инъекциями в MySQL третьей версии.
Работа с инъекциями в MySQL третьей версии.
Предполагается что у вас есть некоторые знания синтаксиса SQL, а также опыт работы со слепыми инъекциями.
Достаточно часто встречаюсь с тем что после того как люди узнают что имеют дело с инъекцией в скриптах, использующих мускул 3 версии, говорят что то типа: "тут нет смысла пытаться", или "это безнадежно".
Но это далеко не так!
Что можно сделать:
1. Посимвольно читать файл.
2. Использовать вывод результата запроса в файл для прямого залития шелла.
3. Получать данные из таблицы, используемой в запросе в котором вы нашли SQL инъекцию.
*Все действия требуют наличия определенных условий, более подбробно это расписано ниже.
1. Посимвольное чтение файлов.
Т.к. в этой версии MySQL нету ни подзапросов, ни оператора объединения запросов union`а, то получать данные из других таблиц нельзя.
Но никто не мешает выводить данные возвращаемые различными функциями: version(), user(), database(), load_file().
Остановимся на функции load_file(), которая выводит содержимое указанного файла.
Для её использования не обходимо что бы текущий пользователь БД обладал соответствующей привилегией (File_priv = Y).
Получаем данные из функций как и обычно в случаях слепых инъекций - посимвольно:
Код:
index.php?id=1'+and+ascii(substring(load_file('/etc/passwd'),1,1))>127/*
index.php?id=1'+and+ascii(substring(load_file('/etc/passwd'),1,1))>63/*
и т.д. нового тут ничего нет.
Конечно с читалкой файлов далеко не уедешь, но можно:
1) Попбробывать получить содержимое файла с подключением к БД, к примеру что бы залогинится в phpmyadmin`е (если такой имеется на сайте).
2) Найти пароль от админке или директории (при условии что пароль лежит в каком то файле).
3) Изучить исходники сайта (всё таки искать уязвимости имея на руках исходники гораздо проще).
Описывать дальше не имеет смысла, т.к. всё зависит от конкретной ситуации.
Скорость и рациональность чтения файла посимвольно:
Наверное многие ужаснутся от идеи читать файл посимвольно (кстати, а такое может быть не оьбходимо не только когда версия БД = 3, но и в других случая слепых инъекций (к примеру в 4 версии достать имя префикса из файла конфигурации, когда он отличен от стандартного)).
Но если других вариантов нету, то ничего не поделаешь - лучше что то, чем ничего.
Для себя я нашел только два способа, как можно ускорить столь утомительный процесс (разумется о выводе файла руками и речи быть не может, но даже скрипты будут выводить его всю ночь, а то и больше).
Может кому то будет интересно с этим поработать:
1) Использовать параллельно несколько скриптов, которые будут доставать одновременно разные символы (к примеру один скрипт достает 1,3,5 и т.д. символы файла, а второй 2,4,6) или разные части файла (один скрипт первую половину файла, второй - вторую).
Приемущество на лицо: скорость процесса будет увеличена в 2,3 и т.д. раза (смотря сколько скриптов параллельно будут запущены).
Минусы такого варианта тоже достаточно явные: 2, 3 одновременно запущенных скрипта - это еще нормально, но чем больше скриптов запущено, тем больше нагрузка на атакуемый сервер и тем больше возможность его заддосить, что сведет работу на нет.
2) Искать данные в файле средставми MySQL и выводить не весь файл, а только часть.
Зачем выводить файл целиком, когда средставми MySQL можно реализовать вывод определенной части файла?
К примеру переменной $password. На практике реализация получилась достаточно громоздкой.
Из плюсов отмечу скорость, но при условии что мы точно знаем что нужно искать в файле.
Из минусов - громоздкость получаемого запроса, а если искать все вхождения заданной комбинации в файл, то запрос получается еще более большим.
2. Вывод результата запроса в файл.
Что бы успешно эксплуатировать возможность вывода результата запроса в файл, даже при обычных инъекциях нужно не малое, а именно:
1) Наличие соотвествуещей привилегии для текущего пользователя БД (File_priv = Y).
2) Кавычки не должны фильтроваться/экранироваться (двойные или одинарные - какие именно значения не имеет).
3) Директория в которой мы хотим создать файл должна быть доступна для записи.
В случаях с обычными слепыми инъекциями (под обычными понимается версия мускула >= 4.1) разницы нету - всё тоже самое, т.к. union доступен (оператор union доступен уже с версии 4.0).
А вот случаи с 3 версией принципиально другие - добавить данные к результату запроса с помощью объединения запросов мы не можем.
А если просто подставить к запросу "into outfile '/www/shell.php'", то ничего полезного в файл не выведется, выведется результат запроса (текст новости, сообщение из гостевой книги/форума и т.д. вообщем выполнится тот запрос который и должен выполнится с той лишь разницей что его результат будет помещен в файл).
Толку от этого нет, но скорее всего есть возможность повлиять на результат запроса "естественным" путем - к примеру добавлением комментария в гостевой книге или сообщения на форуме с текстом шелла, а затем с помощью SQL инъекции отбираем это сообщение и выводим в файл (учтите SQL инъекция должна быть в запросе, который использует таблицу, в которую помещается сообщение с шеллом!!!).
Предположим SQL инъекция в запросе который выводит сообщение из гостевой книги:
Код:
select mess from gbook where id = 4 into outfile '/www/shell.php';
Таким образом наше сообщение (к примеру с номером 4) с кодом шелла будет выведено в файл, таким образом будет создан шелл.
Способ почти не юзабельный из-за того что условий для успешной эксплуатации должно быть много. Но если повезёт...
3. Получение данных из таблиц.
Как уже было сказано выше, работать с другими таблицами (кроме той, что используется в уязвимом запросе) через SQL инъекцию не получится в случае MySQL 3 версии.
А выдирать все данные из то таблице, что используется в уязвимом запросе - более чем возможно.
Предположим что вы найшли SQL инъекцию в скрипте который работает с таблице пользователей (к примеру скрипт выводит информацию о пользователе - его логин, имя, мыльник и т.д.).
В таком случае вы можете подбирать колонку с паролем пользователя, а затем и сам пароль:
Ищем колонку с паролем:
Код:
profile.php?id=2+and+length(password)>0
profile.php?id=2+and+length(pass)>0
profile.php?id=2+and+length(pwd)>0
Подбираем пароль:
Код:
profile.php?id=2+and+ascii(substring(pwd,1,1))>127
profile.php?id=2+and+ascii(substring(pwd,1,1))>63
Таким образом вы сможете получить нужные вам данные, главное в данном случае найти SQL инъекцию в запросе, который работает с нужной вам таблицей (это кстати тоже достаточно редкий случай, но встречаемый).
Cовет: первое что лучше проверить это наличие SQL инъекции в авторизации в админке (логин=1' or 1=1/* пароль=1' or 1=1/*).
Сообщение переоформлено и дополнено: 4.10.08 © Grey
Другие статьи на эту же тему:
http://www.securitylab.ru/contest/212101.php
http://www.injection.rulezz.ru/mysql_char_brute.html
Последний раз редактировалось Grey; 04.10.2008 в 22:13..
|