авито ялта недвижимость квартиры продажа

авито ялта недвижимость квартиры продажа

авито ялта недвижимость квартиры продажа
Деревянные и ПВХ окна

используя специально сформированные параметры (в двойных кавычках) можно обойти проверку правильности пакета dbms_assert и внедрить sql код. уязвимость можно эксплуатировать в большинстве версий oralce (8.1.7.4 – 10.2.0.2), исправление появилось только в июле 2006 года. для защиты пакетов oracle pl/sql от большого количества sql инъекции, oracle разработал новый пакет пол названием dbms_assert в oracle 10g release 2. этот пакет был ретропортирован с oracle critical patch update (cpu) в октябре 2005 года на все поддерживаемые базы данных (с 8.1.7.4 до 10.1.0.5). давайте по порядку dbms_assert - pl/sql пакет, который содержит следующие функции: enquote_literal enquote_name noop qualified_sql_name schema_name simple_sql_name sql_object_name подробное объяснение этих функций и их использовании может быть найдено в статье. если удастся обойти проверку правильности пользовательских данных одной из этих функций, то станет возможным выполнение нападений sql инъекции против множества уязвимых pl/sql процедур и функций, которые легко обнаружить в полностью залатанных версиях oracle (8.1.7.4 до 10.2.0.2 с cpu july 2006), используя поиск нужной строки в распакованном pl/sql коде. о способах распаковки pl/sql (+ простой poc), было рассказано пете финнигангом на конференции black hat 2006. начнем с некоторыми простыми pl/sql примерами процедура pl/sql принимает параметр tablename и привязывает этот параметр к динамическому sql оператору. этот sql оператор будет выполнен непосредственно при запуске. уязвимое решение без dbms_assert: create or replace procedure test1 (tablename in varchar2) is begin dbms_output.put_line(` sql=select count(*) from all_tables where table_name=```|| tablename||````); execute immediate `select count(*) from all_tables where table_name=```|| tablename ||````; end test1; / procedure created. теперь мы используем обычное имя таблицы в качестве параметра: sql> exec test1(`cat`); sql=select count(*) from all_tables where table_name=`cat` pl/sql procedure successfully completed. так как этот параметр не проверяется? мы можем внедрить pl/sql код, например “or 1=1--" sql> exec test1(`cat`` or 1=1--`); sql=select count(*) from all_tables where table_name=`cat` or 1=1--` pl/sql procedure successfully completed. решение с dbms_assert (все еще уязвимо): теперь мы можем проверить пользовательские данные с dbms_assert.qualified_sql_name. oracle использует этот подход несколько раз во внутреннем pl/sql коде. create or replace procedure test2 (tablename in varchar2) is verify_tab varchar2(64); begin verify_tab := dbms_assert.qualified_sql_name(tablename); dbms_output.put_line(`assert result=`||verify_tab); dbms_output.










Related Posts