В большинстве случаев это приведет к обработке системой управления базами данных двух отдельных запросов: ожидаемого запроса и непредвиденного дополнительного:
SELECT * FROM table WHERE y=5.
Написано «в большинстве случаев» потому, что каждая система управления базами данных обрабатывает дополнительные запросы по-разному. Одни не допускают выполнения более одного запроса за одно обращение, другие требуют специальных символов для разделения запросов, а третьим символы разделения запросов не нужны. Например, приведенная ниже часть кода является правильной (на самом деле это два запроса, отправленных одновременно) для серверов баз данных Microsoft SQL Server и Sybase SQL:
SELECT * FROM table WHERE x=1 SELECT * FROM table WHERE y=5
Обратите внимание на отсутствие символов разделения запросов между выражениями SELECT.
Важно понимать, что возвращенный результат зависит от ядра базы данных. Некоторые возвращают два набора записей, каждый из которых содержит результаты запроса SELECT. На рисунке 7.1 показан этот случай. Другие могут объединять наборы, если возвращаемые наборы записей состоят из одних и тех же колонок. А большинство приложений написаны таким образом, что возвращают результаты только первого запроса. В этом случае результат второго запроса увидеть нельзя, но это не значит, что он не был выполнен. Сервер MySQL позволяет сохранить результат запроса в файле. В состав MS SQL Server включены процедуры рассылки результатов запроса по электронной почте. И конечно, в обоих случаях не отображается результат выполнения команды DROP.
Рис. 7.1. Некоторые сервера баз данных, как, например, Microsoft SQL Server, разрешают указывать несколько команд в одном SQL-запросе
Пытаясь передать в запросе дополнительные команды, злоумышленник может указать серверу базы данных на необходимость игнорирования части запроса. Рассмотрим, например, запрос:
SELECT * FROM table WHERE x=$data AND z=4
При подстановке в запрос ранее упомянутых данных получим следующий запрос:
… WHERE x=1; SELECT * FROM table WHERE y=5 AND z=4
В результате во вложенный дополнительный второй запрос оказалось включено выражение AND z=4, которое по замыслу злоумышленника лишнее. Для его исключения из запроса следует использовать символ комментария, который в каждой системе управления базами данных свой. В сервере MS SQL включение двойного дефиса (-) говорит об игнорировании части запроса за ним, который выполняет роль символа комментария, как это показано на рис. 7.2. В MySQL символом комментария служит знак «решетки» (#). Поэтому в случае сервера MySQL подстановка злоумышленником значения
1; SELECT * FROM table WHERE y=5 #
приводит к выполнению запроса
Рис. 7.2. Использование символа комментария в Microsoft SQL Server для игнорирования части запроса
… WHERE x=1; SELECT * FROM table WHERE y=5 # AND z=4
и заставляет сервер игнорировать выражение AND z=4.
В этих примерах было известно название атакуемой таблицы, что случается нечасто. Для составления правильного SQL-запроса нужно знать имя таблицы и названия столбцов. Обычно главная проблема в том, что эта информация недоступна пользователям. Но для злоумышленника не все так плохо. Разные системы управления базами данных обеспечивают различные способы получения системной информации о таблицах базы данных. Например, обращаясь с запросом к таблице sysobjects Microsoft SQL Server (с помощью запроса Select * from sysobjects запрос), можно получить информацию о всех зарегистрированных в базе данных объектах, включая хранимые процедуры и названия таблиц.
Занимаясь хакингом SQL, хорошо бы знать возможности серверов баз данных. Из-за особенностей хакинга SQL злоумышленник может не увидеть результатов своей работы, поскольку большинство приложений не предназначены для обработки вложенных запросов. Поэтому злоумышленнику может потребоваться много времени, прежде чем он удостоверится, что получил доступ к базе данных. К счастью, здесь нет легких решений, потому что для нормальной работы большинство команд SQL требуют задания имен таблиц. Следует творчески поработать, чтобы узнать их.
Вслепую или нет, но хакинг SQL возможен. Для этого может потребоваться понимание принципов работы серверов баз данных. Следует познакомиться с хранимыми процедурами и расширениями SQL анализируемого сервера. Например, сервер Microsoft SQL поддерживает хранимую процедуру рассылки результатов запроса по электронной почте. Это может пригодиться для просмотра результатов работы вложенных запросов. Сервер MySQL может сохранять результаты запросов в файле, позволяя впоследствии восстанавливать результат. Всегда следует попытаться использовать дополнительные возможности сервера базы данных с выгодой для себя.
Читать дальше
Конец ознакомительного отрывка
Купить книгу