Атакуем веб-приложения. Уязвимость SQLi. Часть 2 - Практика

Атакуем веб-приложения. Уязвимость SQLi. Часть 2 - Практика

Life-Hack [Жизнь-Взлом]/Хакинг

#Обучение

Данный пост будет носить практический характер.

Перед началом разбора механизма работы уязвимости SQLi необходимо оговориться о некоторых моментах, связанных с базами данных. Ниже представлен список тезисных заключений про реляционные базы данных, которые чаще всего используются в веб-приложениях.
  • Реляционная база данных - база данных, построенная на основе реляционной модели. 
  • В реляционной базе каждый объект задается записью (строкой) в таблице. Реляционная база создается и затем управляется с помощью реляционной системы управления базами данных.
  • Фактически реляционная база данных - это тело связанной информации, сохраняемой в двухмерных таблицах. 
  • Связь между таблицами может находить свое отражение в структуре данных, а может только подразумеваться, то есть присутствовать на неформализованном уровне. 
  • Каждая таблица БД представляется как совокупность строк и столбцов, где строки соответствуют экземпляру объекта, конкретному событию или явлению, а столбцы - атрибутам (признакам, характеристикам, параметрам) объекта, события, явления. 

А теперь перейдём к практике. Для повторения всех действий понадобится Kali Linux и базовые знания языка SQL (достаточно будет тех, которые были представлены в предыдущем посту)

Работа с базой данных.

Для начала было бы хорошо просто поработать с базой данных. Попытаться создать новую базу данных, добавить в неё одну таблицу, добавить пару записей в эту таблицу. Мы проделаем всё это и подготовим специальную базу данных для тренировок. Это база данных будет представлять собой базу данных клиентов магазина (чтобы максимально приблизиться к реальности).

Открываем консоль на Kali Linux (можно использовать и другой Linux-дистрибутив, но тогда Вам самостоятельно придётся установить набор, называемый LAMP - Linux/Apache/MySQL/PHP, который представялет собой веб-сервер, БД, и скриптовый язык.

Пишим в консоль следующую команду: mysql



Видим ошибку. Данная ошибка означает, что не получается подключиться к серверу (так как mysql - это сетевой сервис). Нужно запустить его, с помощью следующей команды: service mysql start (это стандартный шаблон запуска сервиса в Linux).



Далее подключаемся уже знакомой нам командой:



Если подключение прошло корректно, то мы окажемся в консоли управления базами данных. По сути MySQL представляет собой СУБД (Система управления базами данных), то есть с помощью неё можно удобно управлять различными базами данных. Для начала посмотрим какие базы данных у нас есть на текущий момент с помощью команды: show databases;



Это стандартные 3 базы данных, которые необходимы для корректного функционирования mysql. Сейчас подробно разбирать их не будем.

Давайте создадим новую базу данных и назовём её "shop", т.к. мы будем хранить в ней учётные данные покупателей вымышленного магазина. Команды для создания: create database shop;



Мы создали базу данных, но пока она пустая. Теперь необходимо "зайти" в данную БД и создать в ней таблицы. Смена исользуемой базы данных происходит с помощью команды: use <databasename>



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



Команда для создания таблицы:

create table users (name VARCHAR (32), password VARCHAR (32), cardnumber VARCHAR (32));

VARCHAER (32) означает тип данных - символьный длинной 32 символа.

Проверяем наличие таблиц в базе данных командной:

show tables;

Сейчас наша таблица пуста, это можно проверить следующей командой (запросом на языке SQL).



команда для получение всего содержимого таблицы:

SELECT * FROM users;

Добавим новую запись. Например добавим пользователя - admin, который будет являться администратором данного магазина.



команда добавления новой записи:

INSERT INTO users VALUES ("admin", "21232f297a57a5a743894a0e4a801fc3", "no");

Пароль представляет собой md5-хеш от строки "admin", его можно получить с помощью простой команды в консоли:



команда:

python -c 'import hashlib;print hashlib.md5("admin").hexdigest()'

Добавим ещё одну запись, но теперь обычного пользователя (сделать самостоятельно).

  • логин - "user1"
  • пароль - md5-хеш от строки "password123"
  • номер карточки - любой.

Результат запроса, отображающего все содержимое таблицы должен быть следующий.



Отлично! Теперь у нас есть тестовая БД.

Работаем с веб-сервером и пишем скрипт!

Теперь необходимо запустить веб-сервер (в случае с Kali Linux - это веб-сервер apache2).



Проверить корректность его запуска можно с помощью бразуера, зайдя на localhost (ip 127.0.0.1).



Теперь необходимо создать небольшой скрипт, который обращается к базе данных и работает с созданой нами таблицей.

Все файлы для веб-сервера apache2 хранятся в папке: /var/www/html



Сейчас там находится лишь один файл, который мы видим в браузере.

Создадим отдельную папку и положим там обычный текстовый файл, чтобы проверить всё ли верно работает.



Теперь создадим там PHP-скрипт (не бойтесь, каких либо навыков программирования на PHP нам пока не нужно).

Сделаем скрипт, который выводит информации об PHP-движке, установленным на данной машине.

Для того, чтобы создать файл и сразу приступить к его редактирования используем следующую команду:

nano phpinfo.php



Набераем следующее.

<?php phpinfo(); ?>



Суть скрипта заключается в том, что он просто вызывает функцию phpinfo().

Сохраняем скрипт (Ctrl+O) и выходим из редактора (Crtl+X).

Проверяем, что скрипт работает:



Теперь напишем скрипт, отвечающий за авторизацию в магазине, и допустим там возможность внедрения SQL кода.

Создаём файл "login.php" и помещаем в него следующий код (ссылка).

Обратите внимание, что в скрипте в самом начале присутсвует такой параметр, как пароль пользователя, для подключения к базе данных. Как поставить пароль на подлкючение к базе данных можете посмотрет сами в Интернете или повторить действия со следующих скриншотов.



На изображении выше представлены команды, обновляющие пароль (в случае первого применения они установят пароль).



На данном изображении представлены команды, осуществляющие настройку БД таким образом, что доступ к базе будет доступен всем пользователям, при условии ввода верного пароля.

Разбираем уязвимость!

Теперь самое основное.



Видим форму авторизации. Представим, что мы не знаем какой пароль у пользователя "user1" и в целом мы просто посетитель и увидил форму авторизации.

Попробуем ввести в поле username значение "user1", а в password "test123" (мы знаем, что это неверно).



Видим "Login error!"

Теперь предположим, что запрос к БД составляет немного не верно, точнее наши входные данные не совсем корректно обрабатываются, пред тем как быть подставленными в запрос. Поставим символ кавычки в поле username (таким образом мы нарушаем синтаксис языка, т.к. кавычки должны быть открыты и закрыты).



Мы получаем ошибку синтаксиса, и можем предположить что здесь есть SQLi.

Попробуем отбросить проверку пароля. Для этого закоментируем всё что идёт после имени.



Коментарий это два тире (минуса) "--", всё, что идёт после комментария, не обрабытавается (как и в других ЯП).

Уязвимость возникла, из-за того, что вводимые пользователем значения в поле username никаким образом не проверяются и не фильтруются, а просто подставляются в запрос, это видно на отрывке кода, приведённого ниже.



Таким образом мы можем внедрить свой SQL код и выполнять произвольные запросы к базе данных, доставая из неё всё необходимое.

Для лучшего понимания, попробуйте сделать такие запросы напрямую в СУБД mysql, например, вот так.



есурсы для тренировки.

Данный ресурс указан в ссылках по практике. Это тренировочный сайт одной российской CTF команды. Там есть ряд заданий на SQLi, от простых к сложным.

http://training.hackerdom.ru/board/

Категория: Injections

Если Вы не хотите регестрироваться, то вот ссылка на первое задание (второе откроется после решения первого)

http://sql.training.hackerdom.ru/

Источник



Report Page