По материалам SecurityFocus.com
Введение
В прошлом году были написаны две статьи о SQL инъекциях в Oracle. В них были описаны различные методы SQL инъекций, используемые в Oracle, даны простые примеры об их работе и некоторые предложения по защите от нападений злоумышленников, использующих эти методы. Статьи можно найти здесь:
SQL инъекция и Oracle, часть 1
SQL инъекция и Oracle, часть 2
Данная статья более подробно развивает данную тему и исследует возможности администратора базы данных (DBA) в обнаружении SQL инъекций в Oracle. Возможно ли вообще обнаружение SQL инъекции? Если да, то какие средства и методы должны использоваться?
В этой статье мы сфокусируем внимание на исследовании некоторых методов трассировки данных и анализе лог файлов. Наша цель - показать читателю доступные решения. В этой статье не упоминаются коммерческие решения. Так как настоящие инструменты обнаружения SQL инъекций включают в себя написание синтаксических анализаторов или фильтров для анализа SQL выражений, то полный показ таких методов, к сожалению, выходит за рамки короткой статьи.
Можно ли обнаружить SQL инъекцию?
Ответ короткий - определенно да... вероятно... То есть да, возможно обнаружить SQL инъекцию, но вероятно, что не всегда и не во всех случаях, и не всегда в реальном времени. Причины этого сложны и их много:
Существует много различных форм атак с помощью SQL инъекций - они ограничены только воображением хакера и предвидением DBA (или его нехваткой) в защите базы данных и обеспечении наименьшего количества необходимых привилегий.
Идентификация нелегальных SQL выражений является непростой задачей. Причиной возможности SQL инъекций является использование в приложениях динамического SQL запроса. Это означает, что очень тяжело, а в некоторых случаях даже невозможно определить все легальные SQL выражения. Если легальные выражения невозможно определить, тогда мы будем считать их нелегальными.
Также не всегда просто отличить нормальное администрирование от нападения, т.к. нападающий может захватить и использовать учетную запись администратора.
При обнаружении SQL инъекций, неизбежны всевозможные дополнения или сокращения SQL выражений при их синтаксическом анализе. Имена таблиц и представлений должны быть извлечены и проверены, для того чтобы увидеть, были ли они изменены.
Для полезности методики, мы не должны слишком сильно затрагивать производительность базы данных.
Также необходимы подтверждения данных, таких как имена пользователей и временных меток данных.
И многое другое...
Обнаружение попыток SQL инъекций вообще и конкретно против Oracle возможно. Как возможно этого добиться, и какие данные являются доступным? В данной статье мы попытаемся исследовать эти вопросы.
Сначала необходимо определить граничные условия, или какие действия должны быть обнаружены. Затем нужно выбрать возможные бесплатные решения в рамках Oracle и как можно их использовать для достижения хорошего эффекта.
Некоторые возможные коммерческие решения
Нет никаких коммерческих решений, обнаруживающих попытки SQL инъекций, конкретно в базах данных Oracle. Существует определенное количество программ межсетевой защиты, которые объединяют Oracle proxy и несколько средств IDS, поддерживающих Oracle. В настоящее время множеством компаний серьезно разрабатываются проекты IDS приложений под Oracle, и возможно эти средства смогут обнаруживать SQL инъекции. Для должной работы большинства существующих коммерческих программ, необходимо использование правил и сигнатур, определенных для специфических случаев Oracle.
Некоторые бесплатные решения
Невозможно определить полный список всех типов и сигнатур SQL инъекций, но в качестве отправной точки можно выделить следующее:
SQL, в котором предложение UNION, вызывает обращение к другой таблице или представлению.
SQL, в котором добавлен необоснованный SUB-SELECT.
SQL, в котором предложение WHERE было зациклено, путем дополнения строки типа '' = '' или 1=1.
SQL, в котором происходит необоснованный вызов встроенных или сохраненных процедур.
SQL, в котором выполнен доступ к системным таблицам и/или пользовательским приложениям и идентификационным таблицам.
SQL, в котором, предложение WHERE было сокращено с помощью комментария - --
Анализ некоторых классов ошибок, указывающих на то, что выбранные классы имеют неправильное количество аргументов или неправильный тип данных. Это может указать на то, что кто-то пытается создать дополнительный запрос, используя предложение UNION.
Главное, сначала сделать все как можно проще; попытка делать что-то слишком сложное с помощью встроенных средств, в данном случае не принесет никакого эффекта. Важно не “перегнуть палку” с предположениями о том, что действительно является легальным SQL, а что создано хакером. Остерегайтесь ложных плюсов. Делайте это просто и действенно - используйте, если возможно, более одного метода, расширяйтесь и учитесь.
Любое средство или система, используемые для обнаружения SQL инъекций, могут идентифицировать большинство возможностей из вышеупомянутого списка. В попытке определить, откуда приходят данные для анализа SQL, следующие шаги должны быть полезными для одного и нескольких методов:
Необходим как можно более быстрый захват SQL, отправленного базе данных.
Необходимо выполнение анализа SQL, для проверки некоторых или всех вышесказанных случаев, указывающих на SQL инъекцию.
Необходимо получение пользовательских и timestamp данных.
Фокусирование внимания на захвате SQL, а если возможно, то на получении timestamp и пользовательской информации, также как и возможный дальнейший анализ, приводят нас к следующему списку возможностей:
Сетевые снифферы/IDS средства, типа snort (не используются в дальнейших экспериментах)
Бесплатные анализаторы сетевых пакетов, типа snoop
Файлы сетевой трассировки ORACLE
Файлы трассировки Oracle сервера
Извлечение SQL из памяти Oracle сервера (SGA)
Использование инструментов типа Oracle Log Miner (Сборщик логов) и возможно анализ повторных логов
Oracle аудит
Триггеры базы данных
Высокоточный аудит (Fine grained audit, FGA)
Из-за некоторых проблем нельзя находиться в полной уверенности. Средства аудита используются исключительно для более явных случаев. Если при шифровании сетевого трафика используются дополнительные параметры Oracle, то будет затруднено выделение SQL из сети. Использование трассировки имеет тенденцию генерировать огромные количества данных и потреблять системные ресурсы. Любой метод, не позволяет обнаружить инструкции Select.
Если невозможно обнаружить SQL инъекцию в реальном времени, то лучше узнать позже, чем вообще не знать, что это произошло.
Примеры с решениями
Теперь мы можем работать с некоторыми простыми примерами попыток SQL инъекций, используя пример из предыдущих статей. Первый шагом мы создаем типовую клиентскую таблицу, добавляем данные и создаем демонстрационную процедуру get_cust.
Ниже приведен пример попытки SQL инъекции, который будет использоваться далее, для того чтобы увидеть обнаружен ли он:
SQL> exec get_cust('x'' union select username from all_users where ''x''=''x');
debug:select customer_phone from customers where customer_surname='x' union
select username from all_users where 'x'='x'
::AURORA$JIS$UTILITY$
::AURORA$ORB$UNAUTHENTICATED
::CTXSYS
:
BSNMP
::EMIL
::FRED
Теперь мы проанализируем, какие из трассировок, пакетов, контрольной и внутренней информации, смогли записать любое из доказательств выполнения этого запроса.
Сборщик логов
Oracle поддерживает две хранимые процедуры базы данных DBMS_LOGMNR и DBMS_LOGMNR_D, позволяющие архивировать и интерактивно восстанавливать лог файлы, которые будут проанализированы. Восстановленные лог файлы содержат всю информацию, для воспроизведения любого действия в базе данных. Они используются для моментального восстановления, для транзакций и совместимости данных. Однако существуют некоторые, перечисленные ниже, проблемы с функциональными возможностями Сборщика логов.
Если используется база данных MTS (Multi Threaded Server), то Сборщик логов не может использоваться из-за внутреннего распределения памяти этой программы. Сборщик логов использует PGA память, невидимую потокам, используемым в MTS.
Программа не поддерживает должным образом цепные и перемещаемые строки, а также не полностью поддерживаются объекты. Анализ индексных таблиц и кластеров также не поддержан.
SQL, сгенерированный Сборщиком логов, не такой как SQL, выполненный пользователем. Это происходит, из-за того, что восстановленные лог файлы сохраняют достаточно данных для изменения значений на уровнях строк и столбцов, так что невозможно воспроизвести первоначальные составные выражения.
Некоторые преимущества Сборщика логов:
Анализ не могут выполнять в исходной базе данных, поэтому архивные лог файлы могут быть перемещены в специализированную базу данных и проанализированы автономно.
Существует инструмент с графическим интерфейсом, доступный через Oracle Enterprise Manager (OEM)
Для того чтобы сделать практичным использование этого инструмента, база данных должна быть в режиме ARCHIVELOGMODE, а для размещения пользовательской информации значение transaction_auditing в файле инициализации должно быть true.
Сборщик логов очень эффективное средство для анализа событий и расследования, когда точно эти события произошли внутри базы данных, и кто это сделал. Это может успешно использоваться, для помощи в восстановлении, например, случайно удаленной таблицы.