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

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

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

используя специально сформированные параметры (в двойных кавычках) можно обойти проверку правильности пакета 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