Основан 26 Июля 2013 года
freehacks.ru fhacks.me fhacks.pw fhacksnplmzxaaoo.onion
HashFlare
Показано с 1 по 1 из 1
  1. #1
    TopicStarter
    Аватар для Fischer2014

    Статус
    Offline
    Регистрация
    25.04.2014
    Сообщений
    377
    Репутация
    143 + / -
    Программист

    обойти аутентификацию через sqli на mysql

    Давай представим, что мы ломаем некое веб-приложение c MySQL как СУБД. И к нашей радости находим на первой же странице аутентификации SQL-инъекцию, с помощью которой можем ее обойти. Но опять-таки там стоит фильтр, который частично фильтрует данные… В общем-то, цель задачи —показать пару примеров забавных извращений с MySQL, для развития «правильного» мышления, то есть описание здесь для галочки . Так вот, в приложении для проверки пользователя в аутентификации используется следующая классическая конструкция:

    SQL код:
    SELECT * FROM table WHERE username = '$user' AND
    password = '$pass'


    где $user и $pass — данные от пользователя. То есть если пользовательc указанным именем и (AND) паролем существует, то все ОK — пропускай. А для того, чтобы обойти аутентификацию, у нас есть пара вариантов. Первый — послать в обоих полях «' OR 1='1», и тогда мы получим следующую логику в ПО:

    SQL код:
    SELECT * FROM table WHERE username = '' OR 1='1' AND
    password = '' OR 1='1'


    То есть мы добавляем логики. И к каждой части проверки мы добавляем выражение, которое даст положительный результат в любом случае (or 1=1 —всегда true).

    Второй классический вариант — «' OR 1=1 --». Мы выставляем логическое выражение только для первой проверки с username, а остальную часть комментируем, чтобы она нам не мешала (AND password = ''):

    SQL код:
    SELECT * FROM table WHERE username = '' OR 1=1-- AND
    password = ''


    Но это и так всем известно. Давай теперь глянем на забавности.

    Вариант 1. Он основывается на фиче сравнения нескольких строк. Нпример, выражение «'aaa'= 'aaa'='aaa'» возможно. И данное выражение возвратит нам true. Или, смотри, еще круче: «'aaa'= 'bbb'='ccc'» тоже будет true! Почему? Как так? И где логика? Согласен, странное поведение MySQL. Подумав, что тебе тоже будет интересно, я порыскал в Сети и наткнулся на следующее объяснение. Предположим, у нас есть выражение «'aaa'= 'bbb'='ccc'». MySQL его приводит к виду «('aaa'= 'bbb')='ccc'». И проводит первое сравнение: aaa — это не bbb, значит — false. Хотя, если говорить точнее, это не совсем false (с точки зрения типов), а 0. Что тоже распространенная практика в приведении типов.

    И теперь мы имеем выражение «0='ccc'», которое по логике должно быть опять-таки false. Но вот тут кроется колбаса. Так как 0 — это тип integer, а ссс — строка, то MySQL необходимо привести последнюю к числовому значению. Но MySQL приводит (странной для меня логикой) «ссс» тоже к нулю, так как считает, что это ближайшее числовое значение. В итоге мы имеем сравнение «0=0». Какой же все-таки трэш

    Таким образом, для обхода аутентификации нам надо вставить в оба поля «aaa'='bbb», а с учетом возможности использования пустых строк мы упрощаем до вида «'='»:

    SQL код:
    SELECT * FROM table WHERE username = ''='' and
    password = ''=''


    Мы получаем два тройных сравнения с пустыми строками, результатами каждого из которых будет true. Аутентификация обошлась . Переходим дальше.

    Вариант 2. Атакуем логику: в первое поле вводим «' or 1=1 OR ''='», во второе — «1» (хотя здесь все равно что). В итоге мы получим:

    SQL код:
    SELECT * FROM table WHERE username = '' or 1=1 OR ''='' and
    password ='1'


    В итоге мы меняем логику выражений за счет добавления дополнительного OR. И имеем два выражения, соединенных «OR»:

    1. «username = '' or 1=1», которое всегда будет true из-за "1=1";
    2. «''='' and password ='1'», которое всегда будет false из-за некорректности пароля.


    Как ты видишь, мы сместили проверку пароля и получим "true OR false", то есть опять-таки обход аутентификации. Но постой, зачем такое парево? Чем этот метод проще классических? Ответ — возможным упрощением. Во-первых, от «''=''» можно избавиться, оставив пустую строку «''» во второй части выражения. На логику это не влияет. А далее меняем «OR» на «||». Далее «|| 1=1» на логический эквивалент — «-0» и избавляемся от пробелов, так как в новой форме это не навредит.

    В ходе этих преобразований мы доводим все до коротенькой формы. В логин вводить надо «'-0||'», в пароль — ту же «1», а в приложении имеем следующее:

    SQL код:
    SELECT * FROM table WHERE username = ' '-0||'' and
    password ='1'


    Все, аутентификация за плечами! И чего только люди не напридумывают .
    Последний раз редактировалось admin; 30.04.2014 в 15:56. Причина: [CODE=SQL]

  2. 2 пользователя(ей) сказали cпасибо:

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Информация на сайте предоставлена исключительно в ознакомительных целях, использование знаний в противозаконных целях преследуется по закону! Администрация не несет ответственности за ваши деяния.