Долбим SQL’ные базы данных

maravan

Xakep, номер #056, стр. 056-058-1


(maravan@real.xakep.ru)

SQL Injection howto

Не секрет, что баги в скриптах всегда были ахиллесовой пятой многих веб-ресурсов. Просканишь хост, посмотришь, какие сервисы и каких версий там крутятся, и опускаешь руки - просто неоткуда подступиться. Все лишнее закрыто фаерволом, а то, что открыто - пропатчено до последних версий. Засекурено по максимуму. И тут исход взлома решает какая-то байда в скрипте, заставляющая прыгать от радости.

Итак, сегодня на повестке дня - техника взлома скриптов, почти по-наркомански называемая SQL injection. Для понимания всех прелестей этой фишки неплохо бы немного знать, что такое SQL, или, по-нашему, скуль. Об этом очень кратко читай в следующих абзацах.

Ликбез по SQL

Язык SQL (Structured Query Language) на сегодняшний день является стандартом де-факто практически для всех распространенных серьезных СУБД. Он предназначен для составления запросов к базе данных. Запросы могут иметь цель добавить некоторые данные в базу, их модификацию, поиск и т.д. Работает это следующим образом. На языке SQL составляется некоторое выражение (запрос). Затем оно передается серверу базы данных, который, в свою очередь, обрабатывает его и возвращает результат этой обработки программе, сделавшей запрос.

Язык SQL достаточно удобен и очень прост для изучения, благодаря чему он получил такое широкое распространение - большая часть мало-мальски серьезных cgi-скриптов работают с базами данных, используя SQL.

Любая база данных - это набор таблиц, предназначенных для хранения однотипной информации. Каждая таблица имеет имя и состоит из записей. Запись - это своего рода единица информации, хранимая в базе данных. Информация в записи поделена на поля. Вот пример таблицы:

cc_type, cc_number, cc_holder - названия полей.

Вторая строка - это запись.

Visa, 123, Agent Smith - значения полей записи.

При помощи языка SQL можно производить различные операции с базой данных, таблицами и записями. Основные команды языка:

SELECT - извлечение инфы из таблицы.

INSERT - добавление записи в таблицу.

UPDATE - изменение записи.

DELETE - удаление записи.

Простейшее SQL-выражение может выглядеть так:

SELECT cc_number, cc_holder FROM cc_table WHERE cc_type='visa'

Ключевое слово FROM указывает таблицу, к которой будет применяться это выражение. После необязательного WHERE идет условие, определяющее, по каким параметрам будут отфильтровываться записи таблицы. Результатом данного запроса станет извлечение из таблицы cc_table записей, в которых поле cc_type имеет значение 'visa'. Программе, передавшей данный запрос базе данных, будут возращены не полные записи, а только поля cc_number и cc_holder.

После WHERE может содержаться несколько условий, разделенных логическими операторами:

WHERE cc_type='visa' AND cc_number=1234 OR cc_number=4321

Как было сказано, добавление записей производится командой INSERT. Вот пример запроса:

INSERT INTO cc_table VALUES ('amex', 12345, 'Neo')

Результатом обработки запроса станет добавление в таблицу cc_table новой записи, в которой поле cc_type примет значение 'amex', cc_number - 12345, cc_holder - 'Neo'.

Содержание  Вперед на стр. 056-058-2