В самом начале мне почему то захотелось рассмотреть именно уязвимость типа SQL-injection. Данная уязвимость существует очень давно. Но до сих пор некоторые её аспекты были рассмотрены не точно, либо по принципу "моё дело - написать, Ваше дело - разобраться". В данном цикле статей я решил собрать всю информацию + некоторые свои наработки воедино, и не только о SQL-injection. Но, начнём мы, всё таки, с SQL-injection.

Что же такое SQL-injection? SQL-injection(SQL-инъекция) представляет собой подделку определённого запроса к базе. При помощи данной уязвимости можно заставить скрипт передать серверу управления баз данных (СУБД) запрос, который нужен взломщику, а не запрос на который рассчитывал программист. Скрипты могут страдать данной уязвимостью из-за того, что программисты, их написавшие, не позаботились о фильтрации входных параметров. Где же можно встретить подобного рода уязвимости? Да почти везде, если хорошо покопаться. Вообще сейчас 90% сайтов работают с базами данных. С базой данных может работать форум, лента новостей, гостевая книга, он-лайн магазин, голосования
и ещё много различных веб-приложений. Я думаю, что Вы согласитесь со мной в том, что хотя бы форумы есть на множестве сайтов. Некоторые разработчики не серьёзно относятся к уязвимостям данного типа, хотя таких разработчиков с каждым днём всё меньше и меньше. Большинство сейчас ограничивается простенькой фильтрацией на опасные символы. Как найти SQL-injection, как использовать и как обходить некоторые методы фильтрации я расскажу ниже. Но для начала давайте рассмотрим - почему именно "SQL" инъекция? SQL - язык, на котором общаются клиент и сервер управления баз данных(СУБД). Разумеется, что, не зная этого языка мы не сможем сделать ничего толкового. Если Вы хорошо учились по информатике в школе, то Вы должны знать что БД - это набор таблиц - именно с ними мы и будем работать. Давайте рассмотрим хотя бы самые простые запросы:

1. SELECT - Данная конструкция применяется для выборки определённой информации из заданной таблицы. Данная конструкция имеет следующее строение:
SELECT [имена_полей_из_которых_нужно_взять_информацию] FROM [имя_таблицы];

За место имен полей может быть указана звёздочка (*) - это обозначает взятие информации из всех полей заданной таблицы. Так же вместе с SELECT может использоваться конструкция WHERE - данная конструкция нужна для задания разного типа условий.

Вот обычный пример:
SELECT text FROM news WHERE id=1;

Тут я запросил из таблицы news содержимое поля text, где поле id = 1. Для того чтобы более - менее освоится Вы можете запустить веб-сервер, и обратится по адресу http://localhost/phpmyadmin/ - это встроенный инструмент для работы с базами данных через браузер. Пощёлкайте по ссылкам, создайте пару БД и таблиц, вставьте туда любые данные, потом через mysql-клиент получите их, в общем, делайте всё, что только в голову взбредёт =) Главное чтобы Вы освоились.

2. Вторая конструкция, которую мы сейчас рассмотрим, - UPDATE. Данная конструкция нужна для внесения изменений в уже существующие данные.

Синтаксис:
UPDATE [имя_таблицы] SET [имя_поля]='[нужное_значение_поля]'; 

Так же разрешена конструкция WHERE - используется совершенно так же, пример:

UPDATE news SET text='hack' WHERE id=1; 

Как Вы наблюдали - раньше в поле text где поле id ровнялось единице был текст first news.
После приведённого запроса там будет текст 'hack'.

3. Третья конструкция INSERT INTO - она предназначена для того, что бы вставлять данные в таблицы.
Используется она следующим образом:
INSERT INTO [имя_таблицы_в_которую_вставляем_данные](поле1,поле2,поле3) VALUES(значение1,значение2,значние3);

Здесь: поле1,поле2,поле3 - поля в которые будут вставляться данные, а значение1,значение2,значние3 - значения, которые будут вставлены в указанные нами поля.
Пример:
INSERT INTO news(id,text) VALUES(2,'second news!');

Тут мы вставляем данные в таблицу news, в поле id заносим значение 2, а в поле text - second news!.

4. И последняя конструкция которую мы сейчас рассмотрим - это DELETE - как Вы наверное уже догадались - она
используется для удаления записей из таблиц.
Синтаксис:
DELETE FROM [имя_таблицы] WHERE [условие];

Пример:
DELETE FROM news WHERE id=1;

После этого мы не обнаружим в таблице news поля id со значением 1 и текста первой новости. Можно то же самое использовать без WHERE - тогда удалятся все данные из таблицы.

Вот мы рассмотрели основные конструкции языка SQL. Давайте теперь поработаем с самим СУБД. В нашем случае мы имеем СУБД под названием "MySQL", конечно Вы можете спросить - "А почему бы не MsSQL или PostgreSQL?", ответ прост - рассматривать уязвимость опираясь именно на MySQL мы будем из-за того, что этот СУБД очень сейчас распространён, но, конечно же, мы будем уделять время и другим СУБД, хотя примеры скриптов будут писаться именно под MySQL. С ним же далее и будем работать.

Для MySQL, как и для любого другого СУБД, есть свой клиент.
Клиент лежит в папке [директория_куда_Вы_поставили_Denver]/usr/local/mysql4/bin/.
В данной папке находится 4 файла, нам нужен всего 1 - mysql.exe - Запускается он из командной строки с определёнными параметрами.

Если Вы вообще не в курсе как запустить командную строку или Вам лень командами "cd [dir_name]" пробираться
в папку веб-сервера, то просто через Total Commander зайдите в директорию MySQL (Указана выше) и в строке команд наберите cmd

Запустите клиент из командной строки со следующими параметрами:
-u root (имя пользователя под которым Вы соединяетесь)
-p mysql (имя баз данных, к которой Вы желаете подключиться).
Далее можно ввести параметр -h - в нём нужно указать IP-адрес сервера, но данный параметр нужно использовать тогда, когда Вы собираетесь подключиться к базе, находящейся на удалённом компьютере. После того, как Вы введёте все эти 2 параметра нажмите Enter и mysql попросит Вас ввести пароль. Если Вы ничего не меняли после установки Denver'a, то для подключения к БД Вам потребуется имя пользователя root и пустой пароль. Итак, вот мы подключились:

На рисунке, представленном выше, пароль я вводил т.к. я поставил пароль пользователю root. Далее вы можете потренироваться в различных запросах. У Вас имеется пока всего 2 таблицы (если через phpmyadmin Вы ничего не создавали.): mysql и phpmyadmin. Я бы не советовал Вам менять что ни будь в них, т.к. они обе очень важны. Лучше создайте через PhpMyAdmin экспериментальную табличку и поиздевайтесь над ней как хотите. Ниже я приведу пару команд которые могут иногда помочь Вам:
show databases - показывает все, существующие на сервере, базы данных.
show tables - показывает таблицы в той базе данных, в которой вы сейчас находитесь.
use [имя_базы_данных] - смена базы данных.