ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

30.05.2007, 01:53
|
|
Leaders of Antichat
Регистрация: 25.01.2007
Сообщений: 341
Провел на форуме: 3372120
Репутация:
2565
|
|
Итоги
Вообщем хочу подвести некоторые итоги, на мой взгляд по основному вопросу: Есть ли возможность применять разделитель запросов (в данном случае символ ";") в Oracle? Делаю это не с целью продолжения спора, а с целью разъяснения остальным читателям как обстоит дело на самом деле. Попытаюсь дать развернутый ответ, чтобы не осталось вопросов.
Немного теории.
Еще раз повторюсь - необходимо различать SQL и PL/SQL в Oracle. Для справки: язык PL/SQL - это процедурный язык представляющий собой расширение стандарта ANSI языка SQL, разработанного фирмой Oracle.
Для начала рассмотрим рис2.

Программы, написанные на языке PL/SQL, выполняются системой-исполнителем языка, которая представляет собой часть сервера БД Oracle. Независимо от средства, с помощью которого формируется исполняемый код, он посылается на сервер Oracle. Система исполнитель языка PL/SQL сканирует, разбирает и компилирует код. После этого код, готов к выполнению. Выполняется код посредством передачи его SQL Statement Executor (системе исполнителю SQL-кода). Соответственно простые SQL запросы перенаправляются непосредственно исполнителю SQL-кода. Смотрим рис3.

Основное преимущество при работе с PL/SQL как языком БД является то, что на исполнение серверу посылается группа SQL предложений, а не единичные запросы сформированные, скажем какой-либо программой не использующей PL/SQL как средство работы с БД. Действительно, получив PL/SQL блок, сервер приступает к его обработке, а клиенту остается только ожидать результата операции. Тогда как единичные запросы к БД, порождают большой трафик и тормозят работу сети в целом.
Основной вопрос.
В чем же синтаксическое отличие SQL от PL/SQL или как Oracle различает какому исполнителю перенаправить запрос на обработку? Все достаточно просто если запрос DML(Data manipulation language), т.е. select, update, insert или delete, обрамлен конструкцией begin...end, то это PL/SQL, если нет то SQL. Естественно синтаксис PL/SQL позволяет включать несколько запросов в одну процедуру, разделяя их символом-разделителем ";". Соответственно синтаксис SQL не позволяет разделять запросы ни какими символами, запросы выполняются на сервере строго по одному.
Немного практики.
Нас интересует вопрос проведения SQL инъекции в Веб-приложениях. Для того что бы было более понятно необходимо подойти не со стороны атакующего, а со стороны атакуемого, т.е. посмотреть пример реализации ключевых моментов взаимодействия Веб-приложения с СУБД Oracle. Рассмотрим пример на php, как наиболее знакомый и простой для понимания, хотя по сути аналогично происходит взаимодействие и в других языках C, Java, ASP и т.д.
Воспользуемся интерфейсом OCI для взаимодействия с БД и рассмотрим пример реализации запроса SQL и PL/SQL на PHP:
1. SQL запрос
PHP код:
$c=OCILogon("scott", "tiger", "orcl");
$s = OCIParse($c, "select name from tab1 where id = ".$_GET['id']);
OCIExecute($s, OCI_DEFAULT);
2. PL/SQL запрос
PHP код:
$c=OCILogon("scott", "tiger", "orcl");
$s = OCIParse($c, "begin select name from tab1 where id = ".$_GET['id']."; end;");
OCIExecute($s, OCI_DEFAULT);
Рассмотрев эти два примера, можно сказать что если параметр id не фильтруется, возможна инъекция в обоих примерах. Но если в первом примере попробывать вставить второй запрос используя разделитель ";", то вы в любом случае получите ошибку синтаксиса invalid character с указанием на символ ";". А если во втором примере вставить, то все будет ок  Все примеры приведенные выше аналогично реализуются и в других языках, только там функции называются по другому
Выводы.
Таким образом нельзя однозначно утверждать, что символ разделитель запросов можно или нельзя использовать в инъекциях Oracle. Все зависит от того какие запросы используются в уязвимом приложении. Если простые SQL-запросы то невозможно, если PL/SQL то возможно.
ЗЫ
Имхо реализация из первого примера наиболее распространена в сети, по крайней мере повторюсь я натыкался только на такие, но не сомневаюсь, что есть и второго типа. Что касается статьи, то писал я ее для инъекций в простых SQL-запросах Oracle, это указано в начале, по-этому касательно статьи - ошибки нет.
ЗЗЫ
to podkashey
Ты имеешь в виду например select my_func($a) from dual; и вместо $a подставить строку с инъекцией?
Ну это уже перебор. На уровне того, если в паскале например мы создадим процедуру и туда вместо параметра подставим "15; exit" например. Вобщем само собой такого в оракле не будет. Если я конечно тебя правильно понял.
Я имел ввиду второй пример приведенный выше, но и через параметры в процедуру имхо тоже можно инъекцию провести, если нет фильтрации, хотя такое наверно не реально встретить в сети (имею ввиду использование хранимых процедур для Веб). 
Жду примера, попьем пивка 
Последний раз редактировалось [53x]Shadow; 27.08.2007 в 02:18..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|