Авторские статьи Продвинытый посимвольный перебор в БД Oracle[/b][/color]

Discussion in 'Статьи' started by Slon, 12 Oct 2007.

  1. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Продвинытый посимвольный перебор в БД 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
     
    #1 Slon, 12 Oct 2007
    Last edited: 12 Oct 2007
    2 people like this.
  2. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    сабстринг боян.
     
  3. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Прочитай чуть внимательнее) Там основнно на rownum. Когда полностью отсутствует вывод
     
  4. kair

    kair Elder - Старейшина

    Joined:
    12 Oct 2006
    Messages:
    146
    Likes Received:
    83
    Reputations:
    -4
    всегда забивал на такие скули =\
     
  5. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    так в оракле везде роунум используеться при селектах
     
  6. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Ну да. Тут я этим и пользуюсь. А первый substring нужен что б "ловить" ошибки. Тут ошибка НЕ самого веб приложения (т.к. вывод чего-либо отсутствует)
     
  7. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Ну ладно подожду релиза
     
  8. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Способ оригинальный конечно, но это частный случай, который не всегда сработает, имхо "классическое" использование подзапросов имеет более широкое применение...
     
  9. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Просто понимаешь, тебе не помогут подзапросы, когда ты не видишь вывода результатов. Тут изюминка в том, что бы вызвать ошибку самого SQL-а. В aspx почти стопроцентная гарантия, что мы ее увидим
     
  10. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Под выводом я имел ввиду какие-то признаки жизни. В твоем случае это перекидывание на гл. страницу :)
    Мой де разработан, когда таковых вообще нет. А ошибку ASP ты не отменишь.
     
  11. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Ну ты тогда пример приведи, я вот тебе привел пример
     
  12. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    э, там просто такой пример который я в паблик выложить не могу. Это онлайн-банк. Там при авторизации в селекты вложенно вложенный не фильтруеться. Можно закрыть запрос с помощью ') from dual-- Но авторизацию не обойти.

    Тогда на помощь прихродит это.
     
  13. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Подведу итог... Очень часто нужно использовать нестандартные методы и твоя статья это описание одного из таких методов, я бы даже сказал что оригинальный подход который имеет место быть, но не всегда оправдан, это сугубо мое мнение....

    вцелом молодец
     
    #13 Scipio, 12 Oct 2007
    Last edited: 12 Oct 2007
  14. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Slon, не впечатлило... Оракл сюда за уши для понта притянут, такое можно реализовать не чём угодно в принципе... Да, оригинально, но ничего особенного... Если бы ты вместо оракла использовал что-то другое при написании статьи, я бы даже и читать не стал, ибо боян.
     
  15. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Почему когда люди видет слово substring, думаю что там будет тот старый баян про классический посимвольны перебор? :)


    >>Оракл сюда за уши для понта притянут,
    Видимо никогда не пробовал ломать онлайн банки и большие веб приложения, они там очерь любят устаенавливать Оракл. Статья написана не для понта, как ты сказал, а осонованна на реальном взломе. В данном слычае не подходил ни один из ранее описанных тут методов, т.к. скрипт не подовал признаков жазни в ответ на запрос, а лишь выполнял его
     
  16. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Slon, насчёт моих познаний в больших веб-приложениях и использовании для них Oracle можешь идею не развивать, лучше оставь это мнение при себе. Я тебе сделал замечание, потому что тема могла бы называться "Продвинутый перевод с помощью substring", а Oracle, как я и сказал сюда притянут за ушки, и только поэтому тема граничит на уровне бояна...
     
  17. Slon

    Slon Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    123
    Likes Received:
    21
    Reputations:
    3
    Оракл ибо rownum. Ладно давай не будем тут флудить :)
    Статью написал ибо они может помочь тем, кто столкнеться с такой скулью.
    И еще как я понял боян в твоем понимании - это то что уже было. На ачате не видел ни одной статьи про провидение ПОЛНОСТЬЮ слепой скули в оракле. Кстать если я ошибся можешь поправить :)
     
  18. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Лан... Давай без флуда... :) Остановимся на том, что ты раскопал ORA-01427 и основываясь на ней подобрал пасс (или что ты там подбирал?), используя изощренную модель substring. Малацца.
     
    1 person likes this.