![]() |
Продвинытый посимвольный перебор в БД 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 |
сабстринг боян.
|
Прочитай чуть внимательнее) Там основнно на rownum. Когда полностью отсутствует вывод
|
всегда забивал на такие скули =\
|
так в оракле везде роунум используеться при селектах
|
Ну да. Тут я этим и пользуюсь. А первый substring нужен что б "ловить" ошибки. Тут ошибка НЕ самого веб приложения (т.к. вывод чего-либо отсутствует)
|
Ну ладно подожду релиза
|
Способ оригинальный конечно, но это частный случай, который не всегда сработает, имхо "классическое" использование подзапросов имеет более широкое применение...
|
Просто понимаешь, тебе не помогут подзапросы, когда ты не видишь вывода результатов. Тут изюминка в том, что бы вызвать ошибку самого SQL-а. В aspx почти стопроцентная гарантия, что мы ее увидим
|
Под выводом я имел ввиду какие-то признаки жизни. В твоем случае это перекидывание на гл. страницу :)
Мой де разработан, когда таковых вообще нет. А ошибку ASP ты не отменишь. |
| Время: 01:40 |