Продвинытый посимвольный перебор в БД Oracle Продвинытый посимвольный перебор в БД Oracle [* Вступление *] Oracle очень функциональная БД. Осуществить классический посимвольный перебор в ней не проблема. Но как быть, когда отсутствует вывод результатов запроса. Возьмем как пример авторизацию, в ней иногда бывают очень сложные SQL запросы, которые сложно обойти простым ')--. Речь в этой статье пойдет о том, как быть если вы столкнулись с вышеописаным случаем. [* Теория *] Как я уже сказал выше в Oracle хватает разных наворотов, есть большое поле для творчества. Начнем с rownum. Это что-то вроде аналога Limit в MySQL. С ним можно работать как с обычным полем из таблицы подставляя его в условие where. Смысл этого оператора в том что бы ограничить кол-во выводимых рядов. Точнее выбрать во номеру нужный нам ряд. Теперь пару слов о функции substr. Синтаксис у нее стандартный для языка SQL: substr(string,start[,length]) Эта функция обладает одним отличным свойством. Если в в качестве параметра подставить результат возвращяющий более одного ряда, то мы увидим ошибку: single-row subquery returns more than one row Думаю вы уже поняли о чем дальше будет идти речь [* Практическая реализация *] Первое что нам нужно это конечно место для substr. Тут думаю все просто. В нашем случае: ') AND 'x'=substr((…),1); Основная задача – это составление подзапроса. Нам нужна таблица с большим кол-вот записей, в качестве нее возьмем таблицу аll_users. Вот что должно получитсья (смысл поясню ниже): (select 1 from all_users where rownum between 1 and (…)) Теперь самое главное! Когда 2 чиста в between станут равны (или второе будет меньше первого) то ошибка пропадет. Что бы добиться этого будет постепенно отнимать от ascii кода символа число, увеличивая его на единицу. Пример: ascii(substr(user,1))-1 ОШИБКА ascii(substr(user,1))-2 ОШИБКА ....... ascii(substr(user,1))-86 НЕТ ОШИБКИ Значит символ – 86 = 1. Код нашего символа 87 то есть 'W'. Дальше аналогично, нужно лишь менять параметр start в substr. Общий запрос выглядит примерно так: ') AND 'x'=substr((select 1 from all_users where rownum between 1 and (ascii(substr(user,1))-86)),1)-- [* Заключение *] Понятно, что в ручную переберать почти нереально. В ближайшем времени ждите новый релиз для автоматизацуии перебора © Slon, http://aoh.name
Ну да. Тут я этим и пользуюсь. А первый substring нужен что б "ловить" ошибки. Тут ошибка НЕ самого веб приложения (т.к. вывод чего-либо отсутствует)
Способ оригинальный конечно, но это частный случай, который не всегда сработает, имхо "классическое" использование подзапросов имеет более широкое применение...
Просто понимаешь, тебе не помогут подзапросы, когда ты не видишь вывода результатов. Тут изюминка в том, что бы вызвать ошибку самого SQL-а. В aspx почти стопроцентная гарантия, что мы ее увидим
Под выводом я имел ввиду какие-то признаки жизни. В твоем случае это перекидывание на гл. страницу Мой де разработан, когда таковых вообще нет. А ошибку ASP ты не отменишь.
э, там просто такой пример который я в паблик выложить не могу. Это онлайн-банк. Там при авторизации в селекты вложенно вложенный не фильтруеться. Можно закрыть запрос с помощью ') from dual-- Но авторизацию не обойти. Тогда на помощь прихродит это.
Подведу итог... Очень часто нужно использовать нестандартные методы и твоя статья это описание одного из таких методов, я бы даже сказал что оригинальный подход который имеет место быть, но не всегда оправдан, это сугубо мое мнение.... вцелом молодец
Slon, не впечатлило... Оракл сюда за уши для понта притянут, такое можно реализовать не чём угодно в принципе... Да, оригинально, но ничего особенного... Если бы ты вместо оракла использовал что-то другое при написании статьи, я бы даже и читать не стал, ибо боян.
Почему когда люди видет слово substring, думаю что там будет тот старый баян про классический посимвольны перебор? >>Оракл сюда за уши для понта притянут, Видимо никогда не пробовал ломать онлайн банки и большие веб приложения, они там очерь любят устаенавливать Оракл. Статья написана не для понта, как ты сказал, а осонованна на реальном взломе. В данном слычае не подходил ни один из ранее описанных тут методов, т.к. скрипт не подовал признаков жазни в ответ на запрос, а лишь выполнял его
Slon, насчёт моих познаний в больших веб-приложениях и использовании для них Oracle можешь идею не развивать, лучше оставь это мнение при себе. Я тебе сделал замечание, потому что тема могла бы называться "Продвинутый перевод с помощью substring", а Oracle, как я и сказал сюда притянут за ушки, и только поэтому тема граничит на уровне бояна...
Оракл ибо rownum. Ладно давай не будем тут флудить Статью написал ибо они может помочь тем, кто столкнеться с такой скулью. И еще как я понял боян в твоем понимании - это то что уже было. На ачате не видел ни одной статьи про провидение ПОЛНОСТЬЮ слепой скули в оракле. Кстать если я ошибся можешь поправить
Лан... Давай без флуда... Остановимся на том, что ты раскопал ORA-01427 и основываясь на ней подобрал пасс (или что ты там подбирал?), используя изощренную модель substring. Малацца.