Атакуем веб-приложения. Уязвимость SQLi. Часть 2 - Практика
Life-Hack [Жизнь-Взлом]/ХакингДанный пост будет носить практический характер.
Перед началом разбора механизма работы уязвимости SQLi необходимо оговориться о некоторых моментах, связанных с базами данных. Ниже представлен список тезисных заключений про реляционные базы данных, которые чаще всего используются в веб-приложениях.
- Реляционная база данных - база данных, построенная на основе реляционной модели.
- В реляционной базе каждый объект задается записью (строкой) в таблице. Реляционная база создается и затем управляется с помощью реляционной системы управления базами данных.
- Фактически реляционная база данных - это тело связанной информации, сохраняемой в двухмерных таблицах.
- Связь между таблицами может находить свое отражение в структуре данных, а может только подразумеваться, то есть присутствовать на неформализованном уровне.
- Каждая таблица БД представляется как совокупность строк и столбцов, где строки соответствуют экземпляру объекта, конкретному событию или явлению, а столбцы - атрибутам (признакам, характеристикам, параметрам) объекта, события, явления.
А теперь перейдём к практике. Для повторения всех действий понадобится Kali Linux и базовые знания языка SQL (достаточно будет тех, которые были представлены в предыдущем посту)
Работа с базой данных.
Для начала было бы хорошо просто поработать с базой данных. Попытаться создать новую базу данных, добавить в неё одну таблицу, добавить пару записей в эту таблицу. Мы проделаем всё это и подготовим специальную базу данных для тренировок. Это база данных будет представлять собой базу данных клиентов магазина (чтобы максимально приблизиться к реальности).
Открываем консоль на Kali Linux (можно использовать и другой Linux-дистрибутив, но тогда Вам самостоятельно придётся установить набор, называемый LAMP - Linux/Apache/MySQL/PHP, который представялет собой веб-сервер, БД, и скриптовый язык.
Пишим в консоль следующую команду: mysql
![](https://sun9-9.userapi.com/s/v1/ig2/8KSqIWjuWZkB-F5RBWcLd8HiueQqB3-hzCsJ-M3m0JKVfmv2_0ql4dbfkBwWwGXs_ezMad3DRQRzo7Kvc_AUv9hS.jpg?size=726x76&quality=96&type=album)
Видим ошибку. Данная ошибка означает, что не получается подключиться к серверу (так как mysql - это сетевой сервис). Нужно запустить его, с помощью следующей команды: service mysql start (это стандартный шаблон запуска сервиса в Linux).
![](https://sun9-61.userapi.com/s/v1/ig2/tFchBrJoYqC2SUaG8W72SAyRkcOPg7gNTFoMClb_vIprc5LAosjS9XA7wW_wK_likEp_eje6L3_OfoPlXWVqHqbU.jpg?size=323x38&quality=96&type=album)
Далее подключаемся уже знакомой нам командой:
![](https://sun9-46.userapi.com/s/v1/ig2/TXTZ6yXyxvp-MwLqlV1jyls1wYdr2hzOVcSxljF3E2R9DfNAFTGNeZFKGXiec7ZPuLvtiowPBep2ONj8lqrwWJLH.jpg?size=738x193&quality=96&type=album)
Если подключение прошло корректно, то мы окажемся в консоли управления базами данных. По сути MySQL представляет собой СУБД (Система управления базами данных), то есть с помощью неё можно удобно управлять различными базами данных. Для начала посмотрим какие базы данных у нас есть на текущий момент с помощью команды: show databases;
![](https://sun9-88.userapi.com/s/v1/ig2/cwUiDDEimA2zAEGmqxIM4id1xpT8wrBwACgHUgf8zJt6dYIbtjmEssnq8YRNwSQpupEX_L2EVBfRZgjtS1I0a7RE.jpg?size=353x181&quality=96&type=album)
Это стандартные 3 базы данных, которые необходимы для корректного функционирования mysql. Сейчас подробно разбирать их не будем.
Давайте создадим новую базу данных и назовём её "shop", т.к. мы будем хранить в ней учётные данные покупателей вымышленного магазина. Команды для создания: create database shop;
![](https://sun9-15.userapi.com/s/v1/ig2/ed585qxsOOZLlrYsIDveAGYs6Ti1qUHXM7KgBxQPG7jIXVAZuyAq97hIF1fyuz1p4Ktqu3iNInV0hGhy4mR_fHdo.jpg?size=382x277&quality=96&type=album)
Мы создали базу данных, но пока она пустая. Теперь необходимо "зайти" в данную БД и создать в ней таблицы. Смена исользуемой базы данных происходит с помощью команды: use <databasename>
![](https://sun9-78.userapi.com/s/v1/ig2/iPUDxH7CgYnt4ki3WfrIFoJlMqkQYfbFu_bFgiAUV0wV7IrOLOTZNGm4e0kc3tuLVPLfl1Telp8HlwFAIGR8hX_Z.jpg?size=296x56&quality=96&type=album)
Теперь необходимо создать таблицу. Создадим таблицу под именем "user" в которой будем хранить логин, хэш-пароля, номер карточки (придуманный из головы). Для этого нам необходимо при создании таблицы указать каждому полю (месту где будет располагаться то или инное значение для одной записи) тип данных. Так-как все хранимые нами данные в БД можно представить в виде текста, то и тип у ячеек будет текстовый.
![](https://sun9-78.userapi.com/s/v1/ig2/h7cfAzN3CDIgLKqWZ9N-iL9qRFPK4vVKXiALXKIjSyZVHZkxrfRnAktw7i9MNvbf-LXyMV6Vcv3ZdJruKKGZq8Re.jpg?size=728x242&quality=96&type=album)
Команда для создания таблицы:
create table users (name VARCHAR (32), password VARCHAR (32), cardnumber VARCHAR (32));
VARCHAER (32) означает тип данных - символьный длинной 32 символа.
Проверяем наличие таблиц в базе данных командной:
show tables;
Сейчас наша таблица пуста, это можно проверить следующей командой (запросом на языке SQL).
![](https://sun9-11.userapi.com/s/v1/ig2/DS9rXn8v6-qJmhL5y69c8J6y6X3zFT4XVlAEEefy9CgnzHFsZQ2vphHvjBwRRTOxM5KR1CazJCWQtFmwy1JspZVb.jpg?size=362x82&quality=96&type=album)
команда для получение всего содержимого таблицы:
SELECT * FROM users;
Добавим новую запись. Например добавим пользователя - admin, который будет являться администратором данного магазина.
![](https://sun9-14.userapi.com/s/v1/ig2/skg6PIH1NCY7i4st4G9b05Xbw9f2l2B1qRn28js6sGZfUVLmCv1NpCmtMWAiv_oKEAnWo_BpyhZrVO4y-Xb30IJH.jpg?size=742x243&quality=96&type=album)
команда добавления новой записи:
INSERT INTO users VALUES ("admin", "21232f297a57a5a743894a0e4a801fc3", "no");
Пароль представляет собой md5-хеш от строки "admin", его можно получить с помощью простой команды в консоли:
![](https://sun9-16.userapi.com/s/v1/ig2/qu_KEUy8u9VK2pFTgrz-UzPymyKmonneuF3YzK2RHug1s5pANHwbyxhf5Nbb6YaH7OKX6uFV-WZAqccEDIMROU_q.jpg?size=741x73&quality=96&type=album)
команда:
python -c 'import hashlib;print hashlib.md5("admin").hexdigest()'
Добавим ещё одну запись, но теперь обычного пользователя (сделать самостоятельно).
- логин - "user1"
- пароль - md5-хеш от строки "password123"
- номер карточки - любой.
Результат запроса, отображающего все содержимое таблицы должен быть следующий.
![](https://sun9-75.userapi.com/s/v1/ig2/Hbke3oah-9c2RAJfSvEAGjakcIp_gj465QWnLps9uhzI-cBMiZWW5fu1zfjyCCnu8xjuKSUDNI674ssGuanUDX0p.jpg?size=743x187&quality=96&type=album)
Отлично! Теперь у нас есть тестовая БД.
Работаем с веб-сервером и пишем скрипт!
Теперь необходимо запустить веб-сервер (в случае с Kali Linux - это веб-сервер apache2).
![](https://sun9-82.userapi.com/s/v1/ig2/Uu4NILBbDcfvfopzzAA3KKi59IdNonX0nrrwvsvT1JMfLvzjr9OTy0YEPIhtARJx2JaUzkl5crIsYBmXXFX3jU3d.jpg?size=315x49&quality=96&type=album)
Проверить корректность его запуска можно с помощью бразуера, зайдя на localhost (ip 127.0.0.1).
![](https://sun9-36.userapi.com/s/v1/ig2/QpVWPpnkVloka8xPIte6ZvSPX1r-HToJJklS7Io7xdGj8lbf_e07L2eZ6QzRR8K-CYxLEPcd6dOWdM73uR20aPQe.jpg?size=807x251&quality=96&type=album)
Теперь необходимо создать небольшой скрипт, который обращается к базе данных и работает с созданой нами таблицей.
Все файлы для веб-сервера apache2 хранятся в папке: /var/www/html
![](https://sun9-4.userapi.com/s/v1/ig2/G-R1ZluxFJTtiKEUBeO7KzrMHuNqFPSAkXEr0MEt57CmN73xjnPOAhLUbf3hjOM20wADpSnVr4Az74x_jXVq28bu.jpg?size=324x87&quality=96&type=album)
Сейчас там находится лишь один файл, который мы видим в браузере.
Создадим отдельную папку и положим там обычный текстовый файл, чтобы проверить всё ли верно работает.
![](https://sun9-37.userapi.com/s/v1/ig2/PkrOWEE9lNKpzk1FkouJKPeChy17gZOTVDn3JTqGAPq3Thp_F_TXA1x8mZxIb0_4PEtTAKjvgQD3VKwOtJr1bC4B.jpg?size=807x293&quality=96&type=album)
Теперь создадим там PHP-скрипт (не бойтесь, каких либо навыков программирования на PHP нам пока не нужно).
Сделаем скрипт, который выводит информации об PHP-движке, установленным на данной машине.
Для того, чтобы создать файл и сразу приступить к его редактирования используем следующую команду:
nano phpinfo.php
![](https://sun9-88.userapi.com/s/v1/ig2/-U7ARIXcXy-F3m1QHhIe2ZJIP5nFmc99vkMWbpmM9whvQc4xNTRAP2UTVbxOfARg6EvZ8aJFHhZo8bzR7NcrUJnu.jpg?size=428x24&quality=96&type=album)
Набераем следующее.
<?php phpinfo(); ?>
![](https://sun9-14.userapi.com/s/v1/ig2/Ho7Y8iht-qpDfsYxGu1JNswCJKHPvIwGqHaM-_ON08TT6Hl7_P56pm5VJuw7slbo6wh17q5LZNQgxM10p7jsZueY.jpg?size=737x495&quality=96&type=album)
Суть скрипта заключается в том, что он просто вызывает функцию phpinfo().
Сохраняем скрипт (Ctrl+O) и выходим из редактора (Crtl+X).
Проверяем, что скрипт работает:
![](https://sun9-46.userapi.com/s/v1/ig2/quvo9OummW63O_6y0mxg-A5VJdSOIJqbQzvS3IyE-COOI0pirQSmXs_x8EtjTMGcI6QwI-CtFczYKC8RrAtPvZhU.jpg?size=807x499&quality=96&type=album)
Теперь напишем скрипт, отвечающий за авторизацию в магазине, и допустим там возможность внедрения SQL кода.
Создаём файл "login.php" и помещаем в него следующий код (ссылка).
Обратите внимание, что в скрипте в самом начале присутсвует такой параметр, как пароль пользователя, для подключения к базе данных. Как поставить пароль на подлкючение к базе данных можете посмотрет сами в Интернете или повторить действия со следующих скриншотов.
![](https://sun9-3.userapi.com/s/v1/ig2/1rAG2k3YGbPAKc_PIqEEs8rn_VYvVYhLHnh3NaGP8-y6bz5Yxa8D18yV_XtTU590QTU50xS2DVhbS_BmqXSI9g3C.jpg?size=739x482&quality=96&type=album)
На изображении выше представлены команды, обновляющие пароль (в случае первого применения они установят пароль).
![](https://sun9-56.userapi.com/s/v1/ig2/e_xLcpbLv-rT8Jq85DIPw8XMeBHm_w792UwHuhFiVoQJn9M_d6pBaWrBgLtfSSrHyWNkrQ3e2uWWhpotfwRdy4XE.jpg?size=609x257&quality=96&type=album)
На данном изображении представлены команды, осуществляющие настройку БД таким образом, что доступ к базе будет доступен всем пользователям, при условии ввода верного пароля.
Разбираем уязвимость!
Теперь самое основное.
![](https://sun9-69.userapi.com/s/v1/ig2/sCWsFCcGo8lyAEBPnRnPk69uzGrIebETqk6CyHzkysy4o0yVsbFNmPG3tmfzzQYNWLKTBtbIw5mCnc-otChQ89Zz.jpg?size=515x338&quality=96&type=album)
Видим форму авторизации. Представим, что мы не знаем какой пароль у пользователя "user1" и в целом мы просто посетитель и увидил форму авторизации.
Попробуем ввести в поле username значение "user1", а в password "test123" (мы знаем, что это неверно).
![](https://sun9-18.userapi.com/s/v1/ig2/fNt97qkPlNdO4MUx3ixJCEJYKg3tqzbC__Ej8OQ2vrgwk1r2sTSQBDKH4Ieh3RY0zOR4H5jtO21V4RyrfDW69Gsg.jpg?size=536x359&quality=96&type=album)
Видим "Login error!"
Теперь предположим, что запрос к БД составляет немного не верно, точнее наши входные данные не совсем корректно обрабатываются, пред тем как быть подставленными в запрос. Поставим символ кавычки в поле username (таким образом мы нарушаем синтаксис языка, т.к. кавычки должны быть открыты и закрыты).
![](https://sun9-57.userapi.com/s/v1/ig2/2Ns3mV8yqgcjEmdxOw8E5Q-pFh1IDXykoSuVp6ZcvfDSEfVwAC5b_w8I1IFJqPsq7Q9vx6sCoMsZc3T4P5pUeNw-.jpg?size=807x291&quality=96&type=album)
Мы получаем ошибку синтаксиса, и можем предположить что здесь есть SQLi.
Попробуем отбросить проверку пароля. Для этого закоментируем всё что идёт после имени.
![](https://sun9-53.userapi.com/s/v1/ig2/Rn6vfHtU4_ycTz_VFBqCgcFR1ZBENIcDzLewNdOJwXYqUBywHWn3SaVKby2C3seDg853RWNMxJihf9gvc8gL33MZ.jpg?size=649x362&quality=96&type=album)
Коментарий это два тире (минуса) "--", всё, что идёт после комментария, не обрабытавается (как и в других ЯП).
Уязвимость возникла, из-за того, что вводимые пользователем значения в поле username никаким образом не проверяются и не фильтруются, а просто подставляются в запрос, это видно на отрывке кода, приведённого ниже.
![](https://sun9-84.userapi.com/s/v1/ig2/d2OeJEYZFstpbsTiI1CjFkYAIb3QnVNZCdpch6Eb7C3GheJ3Xb0bkSWA4VOrFmjgvGwvjniDw2t1oNMySC_mmqBo.jpg?size=785x154&quality=96&type=album)
Таким образом мы можем внедрить свой SQL код и выполнять произвольные запросы к базе данных, доставая из неё всё необходимое.
Для лучшего понимания, попробуйте сделать такие запросы напрямую в СУБД mysql, например, вот так.
![](https://sun9-25.userapi.com/s/v1/ig2/XVbY6XWJjyrk7kFXVAC6d_5Dkhm2wg5VgJyA2VoiG3P1ezmZx2-O28MQ10H6gqDxl7xH3JlCdKt_u4RfDYnJ0Ob2.jpg?size=790x181&quality=96&type=album)
есурсы для тренировки.
Данный ресурс указан в ссылках по практике. Это тренировочный сайт одной российской CTF команды. Там есть ряд заданий на SQLi, от простых к сложным.
http://training.hackerdom.ru/board/
Категория: Injections
Если Вы не хотите регестрироваться, то вот ссылка на первое задание (второе откроется после решения первого)
http://sql.training.hackerdom.ru/