Загрузка...

SQL INJECTION от новичка до профессионала (Урок первый)

Тема в разделе Веб уязвимости создана пользователем pentest 20 фев 2023. (поднята 23 окт 2023) 3533 просмотра

Загрузка...
  1. pentest
    pentest Автор темы 20 фев 2023 Заблокирован(а)
    Приветствую!В честь разбана на форуме решил для вас написать полезную статью по SQL INJECTION.Спасибо RaysMorgan

    Хоть говорят , что SQL INJECTION неактуальная тема , я вам скажу . что это неправда.До сих пор встречаются уязвимости , даже на серьезных ресурсах.Существуют различные техники такие , как BLIND,TIME,UNION,XPath и многие другие....Чтобы понимать , как работают SQL INJECTION нужно знать основны SQL.Если кратко говорить , то SQL INJECTION возникает из-за неправильного кода , то есть существует место куда мы можем внедрить свой код и получить полезную информацию.Кстати , код который мы внедряем называется полезная нагрузка.
    Всё таки нужно понимать основы и знать синтаксис.Поэтому рекомендую ознакомиться с этим видеоматериалом и создать аккаунт на sql-academy.org (это бесплатно).

    Нам нужна боевая машина для пентеста так-то.Поэтому вот , что я рекомендую закачать:
    1)Kali linux или любой другой дистрибутив (например mint)
    2)Установить MySql
    3)Скачать Burp suite pro или комьюнити.Отличия в том , что в Pro версии больше фишек и скорость для ****а , но для учебы вполне достаточно комьюнити версии.
    ссылка: https://portswigger.net/burp/communitydownload
    4)Если вы совсем новичок и вам нужна помощь в установке ПО , то есть замечательная статья: https://codeby.net/threads/sobiraem-boevuju-mashinu-dlja-pentesta-s-nulja-chast-1.77085/ и https://codeby.net/threads/sobiraem-boevuju-mashinu-dlja-pentesta-s-nulja-chast-2.77091/#post-408656

    Давайте разберемся с основными понятиями и перейдем к практике:

    СУБД - это система управления базами данных.То есть иначе говоря - это коробка в которой мы храним содержимое БД (базы данных) , управляем бд ( можем редактировать , удалять , добавлять и т.д) Существуют много различных СУБД , но мы будем работать с MySql.
    База данных - это набор данных , который состоит из таблиц и колонок.

    Давай авторизируемся в MySql и будем разбираться...
    Вводим в консоле mysql -u root -p
    (USER который вы задали при установки флаг -p означает , что вход осуществляется с помощью пароля)
    SQL - это очень гибкий язык.Он поддерживает регулярные выражения , может выполнять различные математические вычисления и много всего.Давайте покажу пару примеров:
    [IMG]
    select version();
    SELECT - это выбрать какую-то информацию.Команда используется для выбора данных из БД.В данном случае мы хотим узнать версию базы данных.Кстати язык SQL НЕРЕГИСТРОЗАВИСИМЫЙ - это значит мы можем вводить SELECT , select , sElect.Неважно.Это всё будет работать.Если мы работаем с консолью , то мы обязательно должны на конце команды поставить ; - это означает , что команда закончена.
    Также можно получить версию бд с помощью select @@version; результат будет такой же.Вы спросите зачем нам вообще эта информация , мы ведь пришли сюда изучать скули.Во первых без знания основ ничего не выйдет , во вторых , чем больше мы знаем информации о жертве , чем легче ее взломать.Так говорил мой бро с соседнего форума:cool_bun:
    [IMG]
    с помощью запроса select user(); мы получаем информацию о текущем юзере.

    Больше полезный команд:
    select @@port; - узнать порт на котором лежит СУБД ( Mysql по умолчанию на 3306)
    select database(); получить название активной бд.Активная = используемая
    CREATE DATABASE name; создать базу данных ( где name пишем название базы)
    show databases; - показать все созданные базы данных
    Кстати , помимо созданных вами БД , будут и другие.Например information_schema - это системная бд в которой хранится различная полезная информация о базе , таблицах и колонок.
    use name; - выбрать базу данных ( где name пишем название базы)
    SHOW TABLES; - показать существующие таблицы
    DESCRIBE table; - посмотреть какие колонки в таблице и их тип (varchar - текст , int - числа и т.д)
    DROP DATABASE name; - удалить бд
    DROP TABLE name; - удалить таблицу из бд
    select * from table; - показать содержимое таблицы
    SHOW COLUMNS FROM table; - показать названия колонок
    SELECT DISTINCT name_column from table_name; - показать уникальные значения
    SELECT COUNT(*) FROM table_name; - показать количество записей в таблице
    Обновление пароля root
    mysqladmin -u root -p oldpassword newpassword

    Ладно , на этом , пожалуй остановимся.Есть много cheatsheetов по MySql , что нужно найдете сами.
    Давайте уже создадим базу данных , таблицы , колонки и заполним её , чтобы вы понимали , как и что работает.А потом потренируемся выбирать информацию.
    CREATE DATABASE Professional;
    Создадим базу данных под названием Professional
    Если вы сделали все правильно , то введя команду show databases; ВЫ увидите созданную базу данных

    [IMG]
    Переключаемся на нашу созданную базу use Professional;
    Создаем таблицу и колонки
    CREATE TABLE rays ( id INT NOT NULL AUTO_INCREMENT, nickname VARCHAR(30) NOT NULL, login VARCHAR(40) NOT NULL, PRIMARY KEY(id));
    давайте разберемся , что мы сделали.Сначала мы создали таблицу rays с колонками id,nickname,login и ключом PRIMARY.Ключ Primary означает , что каждая запись будет автоматически пронумероваться
    начиная с единицы.VARCHAR - это означает , что в этой колонке только строчные значения с ограничением в 30 символов.NOT NULL - не может быть пустой , int - ЧИСЛА.
    Если вы сделали все правильно , то набрав команду show tables; будет вот это:
    [IMG]
    INSERT INTO - ИСПОЛЬЗУЕТСЯ В MySql для добавления записей.Давайте заполним наши колонки)
    INSERT INTO rays (nickname,login) VALUES("rays","admin"),("easy","man"),("Dog","Snoop"),("Gay","Louser");
    Заполнить таблицу rays в колонках nickname,login СО значениями rays - ник , admin - login и т.д
    Если вы все сделали правильно , то будет выглядеть вот так запрос select * from rays; (ВЫБРАТЬ всё из таблицы rays) * означает , что мы берем содержимое всех колонок.
    [IMG]


    Выдыхаем:)Если вы дошли до сюда , то это здорово.Ведь мы можем начинать тренироваться писать несложные SQL запросы...
    Задание №1
    Получить все никнеймы из таблицы rays
    SQL
     select nickname from rays;

    Задание №2
    Получить никнейм из таблицы rays , где айдишник 2
    SQL
     select nickname from rays where id = 2;

    Задание № 3
    Получить никнейм из таблицы rays , где никнейм имеет вторую букву 'a'
    SQL
     select nickname from rays where nickname like '%a%';

    Задание № 4
    Получить никнейм из таблицы rays , где никнейм имеет первую букву 'r'
    SQL
     select nickname from rays where nickname like "r%"

    Как вы поняли % означает , что есть еще символы (1,2 или хоть 100) он может стоять в начале , посередине , в конце.Где угодно.
    Задание № 5
    Получить все логины , которые имеют только 5 символов
    SQL
     select login from rays where login like "_____";

    _ означает , что пропущен один символ => мы ставим 5 нижних подчеркиваний.
    Задание № 6
    Вывести id в порядке убывания
    SQL
     select id from rays order by id desc;

    Вывести id в порядке возрастания
    SQL
     select id from rays order by id; или select id from rays order by id asc;
    Задание № 7
    Добавить в таблицу rays колонку news с типом строк не превышающих 200 символов
    SQL
     ALTER TABLE rays ADD COLUMN news varchar (200);

    Задание № 8
    Выведите логин , который начинается с буквы 'a' С ПОМОЩЬЮ регулярного выражения
    SQL
     select login from rays where login REGEXP "^a";
    Выведите логины , которые заканчиваются на букву 'n' С ПОМОЩЬЮ регулярного выражения
    SQL
     select login from rays where login REGEXP "n$";
    Задание № 9
    Выведите все логины , которые заканчиваются на буквы из алфавитного промежутка o-u
    Вот кстати алфавит:
    [IMG]
    select login from rays where login REGEXP "[o-u]$";
    Задание № 10
    Решите пример с помощью SQL
    5 разделить на 0
    select 5 / 0;
    Задание № 11
    Выведите логины , где айдишники больше или равны 3
    select login from rays where id >= 3;
    Как мы поняли из этого язык SQL прекрасно дружит с математикой.Можно выполнять запросы с различными условиями >,>=,<, <=,+,/ и другие.

    Продолжаем изучать дальше!
    Union используется для объединения двух запросов.Скажем у нас есть две таблицы и нам нужно получить из них данные , тут как раз поможет нам union.Давайте создадим вторую таблицу и разберемся на практике ( ЭТО ОЧЕНЬ ВАЖНО!)
    CREATE TABLE un1on ( id INT NOT NULL AUTO_INCREMENT, password VARCHAR(50) NOT NULL, email VARCHAR(50) NOT NULL, PRIMARY KEY(id));
    Внимание!!!Таблицу union создать нельзя , так как она уже зарезервирована.
    Заполним колонки данными
    INSERT INTO un1on (password,email) VALUES ("Grisha","admin@lolza"), ("grishas","kerrr@gmail.com"), ("hackermother","pendos@yahoo.com"), ("numberone","goodgirl@gmail.com");Результат:
    [IMG]
    Давайте попробуем получить все данные из двух таблиц.
    select * from rays union select * from un1ion;
    У нас не получилось! ERROR 1222 (21000): The used SELECT statements have a different number of columns
    Ошибка говорит , что у нас разное количество колонок.То есть в rays 3 колонки ( login,nickname,news) , а в таблице un1on две email,password.То есть не хватает одной колонки у un1on.
    Эту ошибку можно исправить вот так:
    select * from rays union select *,null from un1ion;
    вместо null можно вписать not null или же цифру , а также false или true прокатит , ведь это тоже по сути цифры. True - 1 , false - 0.
    При использовании union одинаковые строки удаляются , чтобы вывести все пишем union all.
    Еще один полезный оператор LIMIT который имеет два параметры с какого айдишника начать и сколько нужно взять
    limit 0,1 означает взять первые объект и одну штуку.
    limit 1,1 означает взять второй объект
    limit 0,2 означает взять начиная с первого объекта две штуки.
    [IMG]


    А теперь переходим плавно к SQL иньекциям , так как я вам рассказал хоть какую-то базу)
    Я заметил , что чащего всего скули встречаются на новостных сайтах , так , как они часто состоят из http://домен/линк/параметр=значение параметра
    Ну например:
    http://kakietonewss/abcd/id=1
    id - это параметр
    1 - это значение параметра id
    Для начала нужно определить , а есть ли вообще там скуля.Можно это сделать подставив на конец значения одинарную кавычку , двойную , обратный слэш , другие полезные нагрузки.
    [IMG]
    [IMG]
    Отлично!Значит тут присутствует SQL INJ.
    Если это сайт новостной , то мы можем прочитать скрытые новости просто добавив полезную нагрузку
    'or 1=1 -- -
    ' - это обрамление.Его нужно подбирать
    -- - - это комментарий , он тоже может быть другой.
    [IMG]
    Можно по-разному составлять полезные нагрузки.Например вместо 'or 1=1 -- - можно также
    'or true -- -
    или же
    'or 8/2=16/4 -- -
    или же
    'or version() -- -
    version() дает единицу , то есть true.Поэтому это сработает.

    Мы никогда не видим , как написан код поэтому мы не знаем какая полезная нагрузка сработает , а какая нет.Может быть такое , что например есть форма авторизации , но все введенные значения преобразуются в строковый тип , а это означает , что мы не можем использовать or 1=1 , но зато можем or '1' = '1' или or 'a' = 'a'.

    К сожалению весь материал нельзя уместить в одну статью.Поэтому я сделаю второй урок.Если вам понравилась статья , то пишите свое мнение в комментарии:finger_up:
    [IMG]
     
    20 фев 2023 Изменено
  2. ndlinniy
    ndlinniy 20 фев 2023 6 6 сен 2021
    Тема годная, но надеюсь добавишь во второй части где брать эти самые ссылки(по доркам, парсить и тд)
     
    1. pentest Автор темы
      LaDuasCaras, фигня , я статью сделал
  3. MADELINE

    вместо велосипедирования можно обозначить проще:

    первый параметр - offset / смещение на количество строк
    второй параметр - count / количество возвращаемых строк
     
    12 мар 2023 Изменено
  4. asistent
    asistent 17 окт 2023 0 15 июн 2023
    Отличная статья, продолжай в том же духе.
     
Top