Долбим 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'.