MySQL: Взламываем черный ящик

    О чем пойдет речь: забавный и экстравагантный способ «взлома» веб-сайта, у которого «всего-лишь» не экранируются кавычки одного из параметров. При этом пропустим рассуждения о том, почему все не экранируется на стороне самого языка программирования или ORM.

    Вводная: веб-сайт, у которого не экранируется один из параметров в простом SELECT запросе. При этом все ошибки перехватываются, обрабатываются и выводится скромное «Нет данных» или «Произошла ошибка».

    Казалось бы: не велика беда. Обновление или изменение данных в него втереть, данные наружу не открываются, все сводится к «Извините, нет данных» — черный ящик.

    Но, что на самом деле можно сделать в данной ситуации?

    Сразу соль: техника базируется на функции sleep(N) которую мы будем использовать как лакмус. Замеряем сколько «отдается» страница в обычной жизни. И сколько времени она «отдается» если мы введем ' OR sleep(10) вместо всех параметров которые присутствую в форме. Если время отдачи страницы выросло — дело в шляпе и дальше только дело техники.

    Например, подбираем имя таблицы, основываясь на мета-базе INFORMATION_SCHEMA, которая всегда присутствует и доступна всем:

    ' OR 1 = if((select count(*) from INFORMATION_SCHEMA.tables where TABLE_SCHEMA=database() and TABLE_NAME='users') = 1, sleep(10), null)

    Если время «отдачи» страницы существенно увеличилось — угадали, если нет — пробуем еще варианты, обычно их до 10. Дальше «угадываем» имена полей:

    ' OR 1 = if((select count(*) from INFORMATION_SCHEMA.columns where TABLE_SCHEMA=database() and TABLE_NAME='users' and COLUMN_NAME='login') = 1, sleep(5), null)

    Зная имена таблицы и полей, можно «подобрать» длину логина, пароля а так же посимвольно вытащить сами логин и пароль.

    if((select count(*) from users where login='admin') = 1, sleep(5), null)
    if((select length(password) from users where login='admin') = 1, sleep(5), null)
    select if((select mid(password, 5,1) from users where login='admin') = 'a', sleep(5), null)


    При двоичном поиске пароля посимвольно потребуется всего 8 запросов на каждый символ.

    Да, не ахти какой взлом, но забавный способ исследовать вслепую структуру БД, имена полей (так же можно подбирать посимволно) а так же сами данные.

    Кстати, экранировать надо в том числе и постраничную навигацию — метод тот же, но с применением UNION SELECT…

    Мораль сей басни: даже единственный не экранируемый параметр из-за которого ну максимум будет «извините, ошибка» может слить всю базу.

    Заметка родилась в следствии анализа запросов к одному из сайтов и попыток их осмыслить.

    Просьба не холиварить касательно ущербности MySQL как базы данных а так же «единственно истинного» способа экранирования данных.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 25

      +16
        +1
        Спасибо!
      • UFO just landed and posted this here
          –2
          если быть точным — то я открыл применение sleep() в mysql
          • UFO just landed and posted this here
              +13
              надеюсь, вы имеете в виду для себя открыли
            +1
            собственно зачем использовать sleep(), если выводится «Произошла ошибка»? Ведь можно воспользоваться обычной техникой Blind SQL-Injection. Причем sleep() есть только в MySQL > 5.0, в более ранних версиях нужно использовать benchmark()
              +4
              Есть такое, никогда не пользовался ни первым, ни вторым.

              Без обид, но считал, что тема SQL-Injection изучена уже всеми кому не лень, а название статьи сбило с толку — думал может и правда что-то новое…

              Ну и да, системы, где данные из формы просто «подставляются» в запрос в наше время — надо еще поискать:)
                +2
                >> Ну и да, системы, где данные из формы просто «подставляются» в запрос в наше время — надо еще поискать
                Вы не поверите… ))
                  0
                  Нет, ну понятно, что этого есть, но оттуда уже уперли всё, что можно было упереть:)
              0
              Однажды пытался похожим методом вслепую получить информацию из БД с неизвестной структурой. Получил количество БД на сервере, название рабочей БД, количество таблиц в ней, названия нескольких таблиц и несколько полей в одной из таблиц. После этого плюнул и забил. Слишком нужно все это было. Да и такая аномальная активность легко вычисляется в логах. Понятно, что весь процесс можно автоматизировать и в сети достаточно для этого средств, но было интересно все же вручную.
                +1
                *слишком нудно
                  0
                  Интересно, многим ли приходилось находить подобные уязвимости и получать хотя бы информацию о структуре? Помнится, что в какой-то период жизни искал сайты подверженные SQL Injection в качестве спортивного интереса, но нашел только один, который делал мой товарищ, более сайты с явными дырками не встречал.
                    +1
                    Если говорить о сайтах — то вы правы.

                    А если говорить о внутрикорпоративных системах, коих у нас тысячи, и говорить о взломе такой системы сотрудником копании изнутри — то тут совсем другая статистика.

                    Например, по моим личным наблюдениям, внтури «корпораций» процент IE 6 .0 порядка 20-30%
                      0
                      «Знакомому знакомого моего знакомого» приходилось буквально неделю назад. Я подумываю написать пересказ с его слов — там было несколько интересных моментов.
                  +12
                  Это мне напоминает анекдот, про студента который все учил про блох.
                  Придя на экзамен у него спросили про рыб.
                  На что студент сказал,
                  Если бы рыбы жили на берегу — у них была бы шерсть.
                  А раз была бы шерсть то в ней водились блохи.
                  А блохи это…

                    +2
                    В декабре еще не было.
                      0
                      Перебор имен таблиц посимвольно? Еще наверное список прокси. Напоминает ipbrute в детстве
                        +6
                        Оу, золотые времена ксакепа… какой классный тред.
                          0
                          Каким образом решить проблемы если настройки Apache:
                          max execution time = 10
                          Если будет более 10 таблиц то данный метод будет не актуальный.
                            0
                            Например, у меня есть страницы для генерации которых вполне может понадобиться минут 10, так то ограничение по времени возможно не всегда

                            Насчет количества таблиц — так все и не надо, зачастую достаточно найти таблицу авторизации и пароь администратора
                            +2
                            Автор, рекоммендую Вам пару отличных книг:
                            Justin Clarke — SQL Injection Attacks and Defense (2009)
                            David Litchfield — The Database Hacker's Handbook Defending Database Servers (2005)

                            Откроете для себя еще больше нового.
                              0
                              Просто
                              ' union all select ...
                              и все дела. Только вот кому нужно ломать такую базейку, разработчики которой даже биндами не пользуются…
                                0
                                Меня пугают эти 216 человек. Кто они? Чем они занимаются? Зачем они добавили этот пост в избранное?

                                Only users with full accounts can post comments. Log in, please.