MySQL SQL Injection [полный FAQ]

2010-07-06T00:00:00
ID RDOT:124
Type rdot
Reporter Dr.Z3r0
Modified 2010-07-06T00:00:00

Description

SQL injection полный FAQ

Автор: Dr.Z3r0
Посвящается всем кто меня знает)

0.INTRO

0.1 Вступление
Лазив по интернету в поисках хоть какой то инфы по SQL injection, ты, наверно, часто натыкался на статьи либо очень короткие, либо не понятные, либо освещающие одну тему, либо еще что-то, которые разумеется тебя не устраивали. Когда то и я насобирал где то статей 10-20 по этой теме, чтобы вникнуть во многие тонкости этой уязвимости. И вот вспоминая те времена, решил написать полный FAQ по этой теме, чтобы, так сказать, остальные не мучались. Те кто найдет, что я что-то пропустил, где то ошибся и тд, пожалуйста отпишитесь ниже, трудно все-таки, все удержать в голове . Кстати, это моя первая статья, пожалуйста не кидайтесь помидорами, и не пинайте ногами.

Для усвоения этой статьи требуется:
а) Наличие мозгов
б) Прямые руки

в) Знания языка SQL

В основном эта статья писалась как для MYSQL+PHP.

Вообще, по-моему, самый лучший способ обучиться правильной работе с SQL injection это не прочтение этой статьи, а живая практика, например, самому написать уязвимый скрипт или использовать мой приведенный в самом конце.

_Кстати советую читать все подряд так, как в каждом пункте есть что-то важное для следующего пункта и т.д. _

И еще. При чтении обратите внимание что эта статья - 2007 года, и она немного устарела. Сейчас (апрель 2010) я пытаюсь ее переписать, дабы восстановить актуальность.

0.2 Общее описание
Для начала нам нужно представить, что такое база данных и скрипты, зачем они нам нужны и так далее.

Возьмем к примеру движок этого форума. Со стороны пользователя оно все красиво. Учитывая тематику статьи, следует задать вопрос, откуда движок берет информацию (даже эту же самую статью, эти буквы)? Правильно! Из базы данных!

Грубо говоря, обычная, в нашем понимании, БД состоит из множества таблиц. У каждой таблицы, естественно, есть столбцы и есть строки. Собственно, это ключевой момент. Возьмем к примеру таблицу юзеров этого форума. Для каждого юзера должно быть описанно несколько параметров (ник, мыло, дата реги и тд). В итоге каждый столбец определяет какой либо параметр юзеров, а каждая строка - конкретного юзера. А в пересечении нужного нам столбца и строки будет информация о параметре нужного юзера.
(вообще это утрированное описание реляционных баз данных, можете поискать подробнее)

Так надеюсь с представлением разобрались. Теперь поговорим о взаимодействии с Базами Данных. Для работы с БД был разработан специальный язык SQL запросов (кстати я бы советовал вам поискать мануал по нему, будет полезно).

Вообщем начнем с примера.
Представим, что вы(скрипт) пошли в магазин(БД), и просите(SQL запрос) продавца: "Дайте одну бутылку водки за 200 рублей".

Попытаемся представить запрос в виде SQL:

Код:

SELECT товар FROM магазин WHERE (тип='водка' AND цена='200') LIMIT 1

Собственно в ответ на вашу просьбу(SQL запрос) вы(скрипт) получаете бутылку(информацию), и продавца(Базу данных) уже не волнует, что вы будете с ней делать, так как свою работу он выполнил. Вы можете ее выпить, вылить, подарить (обработать, вывести, расчитать) и тд.

0.3 Что же все таки такое SQL иньекция?
Обобщенно атака типа SQL иньекция (SQL injection) возникает в случае если злоумышленник может каким то образом модифицировать запрос к БД.

На примерах разбирать проще поэтому вернемся к примеру с магазином.

Допустим вы бросили пить Вот вы решили пойти в магазин за кефиром, и специально написали на бумажке "один пакет кефира за 30 рублей", чтобы не забыть зачем вы пришли в магазин. Но у вас есть друг-алкоголик(хакер, он же злоумышленник), который исправил надпись на бумажке(провел атаку SQL injection) на такую "один пакет кефира за 30 рублей или одну бутылку водки за 200 рублей".

В итоге вы приходите в магазин и говорите, используя бумажку(входящий параметр): "Дайте один пакет кефира за 30 рублей или одну бутылку водки за 200 рублей"

Цитата:

SELECT товар FROM магазин WHERE (тип='кефир' AND цена='30') OR (тип='водка' AND цена='200') LIMIT 1

Продавец, подумав что до холодильника с кефиром идти дальше чем до полки с водкой, дает вам бутылку. И вы со спокойной душой уходите домой, где вас уже ждет ваш друг-алкоглик, довольный результатом))

Вот собственно пример SQL иньекции. Вот налицо отсутствие фильтрации входящих параметров, вы же не посмотрели на то, что вторая часть записки написанна другим почерком?

Конечно, это все утрированно, но надеюсь идею SQL запросов и иньекций в эти запросы вы уловили.