Пример красивых таблиц вывода запроса из mysql. MySQL - запрос в запросе

Простейшая SQL инъекция для чайников


В этой статье я объясню основы SQL Injection с примером, который показывает SQL-инъекцию.

Как следует из названия, эту атаку можно выполнить с помощью SQL-запросов. Многие веб-разработчики не знают, как злоумышленник может вмешиваться в SQL-запросы. SQL-Injection может выполняться в веб-приложении, которое не фильтрует вход пользователя должным образом и не доверяет тому, что предоставляет пользователь. Идея SQL-инъекции - заставить приложение запускать нежелательные SQL-запросы.

Конечно, мы не хакеры, но чтобы уметь защищаться, надо понимать, как действует враг. Все примеры, упомянутые в этой статье, протестированы на такой конфигурации:

  • PHP version: 5.4.45
  • Веб-сервер:Apache
  • Тип сервера баз данных: MariaDB
  • Версия сервера: 10.1.26-MariaDB
Пример внедрения SQL

Большинство веб-приложений имеют страницу входа. Поэтому мы начнем с этого. Предположим, что есть такая форма:

Имя пользователя: Пароль
Когда пользователь вводит имя пользователя и пароль, он будет отправлен на sql.php через метод HTTP_POST: and password="".$_POST["pass_word"]."""); $row = mysql_fetch_row($result); if ($row) echo "Вы вошли"; else echo "Вы не вошли"; ?> Пример максимально упрощен для понимания. Что здесь происходит? Мы , а затем к таблице «test_in» делаем запрос на выборку. Если поля имя пользователя и пароль совпадают, то в результате функция mysql_fetch_row() будет выдавать хотя бы один результат, то есть отличаться от “false”. Пятая строка в данном php-скрипте уязвима. Попробуйте оставить поле пароля пустым, а в логин ввести следующее:

Тогда результат всегда будет "Вы вошли"!

То есть мы получаем доступ к информации, которая должна по идее выдаваться только пользователю, знающему связку «логин-пароль». Почему так происходит?

Дело в том, что тогда выполняется вот такая строка:

SELECT * from test_in where user_name="" OR 1=1 -- " and password="" А здесь условие такое: или имя пользователя должно быть равным ничему или же единица должна быть единице. Понятно, что последнее условие выполняться всегда, поэтому и результат будет отличным от “false”. А чтобы не выполнялось еще одно условие (проверка на пароль) – мы закомментируем конец строки. Не забудьте только после перед двумя тире поставить хотя бы один пробел – иначе будет ошибка синтаксиса.

Понятно, что для того, чтобы выполнить такой запрос, надо хотя бы знать, как именно происходит авторизация пользователя. Однако, у взломщиков есть множество шаблонов для sql-инъекций.

Итак, в этой статье мы научились создавать простейшую sql-инъекцию. В следующий статьях я разовью данную тему, а также научу, как защищаться от несанкционированного доступа. А если вам требуется проверить вашу систему, то вы можете

SQL инъекция - это один из самых доступных способов взлома сайта.
Суть таких инъекций – внедрение в данные (передаваемые через GET, POST запросы или значения Cookie) произвольного SQL кода. Если сайт уязвим и выполняет такие инъекции, то по сути есть возможность творить с БД (чаще всего это MySQL) что угодно.

Как вычислить уязвимость, позволяющую внедрять SQL инъекции?

Довольно легко. Например, есть тестовый сайт test.ru . На сайте выводится список новостей, с возможностью детального просомтра. Адрес страницы с детальным описанием новости выглядит так: test.ru/?detail=1 . Т.е через GET запрос переменная detail передаёт значение 1 (которое является идентификатором записи в табице новостей).

Изменяем GET запрос на?detail=1" или?detail=1" . Далее пробуем передавать эти запросы серверу, т.е заходим на test.ru/?detail=1 " или на test.ru/?detail=1 ".

Если при заходе на данные страницы появляется ошибка, значит сайт уязвим на SQL инъекции.

Пример ошибки, возникающей при проверке уязвимости

Возможные SQL инъекции (SQL внедрения)
1) Наиболее простые - сворачивание условия WHERE к истиностному результату при любых значениях параметров.
2) Присоединение к запросу результатов другого запроса. Делается это через оператор UNION.
3) Закомментирование части запроса.

Практика. Варианты взлома сайта с уязвимостью на SQL внедрения

Итак, у нас есть уже упоминавшийся сайт test.ru . В базе хранится 4 новости, 3 из которых выводятся. Разрешение на публикацию новости зависит от парметра public (если параметр содержит значение 1, то новость публикуется).

Список новостей, разрешённых к публикации

При обращении к странице test.ru/?detail=4 , которая должна выводить четвёртую новость появляется ошибка – новость не найдена.
В нашем случае новость существует, но она запрещена к публикации.

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

Тестирую следующие варианты:
test.ru/?detail=4+OR+1
test.ru/?detail=4+--
test.ru/?detail=4+UNION+SELECT+ *+FROM+news+WHERE+id=4

В итоге удача улыбнулась и два запроса (первый и третий) вернули нам детальное описание четвёртой новости

Разбор примера изнутри

За получение детального описания новости отвечает блок кода:
$detail_id=$_GET["detail"];
$zapros="SELECT * FROM `$table_news` WHERE `public`="1" AND `id`=$detail_id ORDER BY `position` DESC";

Мало того, что $detail_id получает значение без какой либо обработки, так ещё и конструкция `id`=$detail_id написана криво, лучше придерживаться `id`="$detail_id" (т.е сравниваемое значение писать в прямых апострофах).

Глядя на запрос, получаемый при обращении к странице через test.ru/?detail=4+OR+1

SELECT * FROM `news` WHERE `public`="1" AND `id`=4 OR 1 ORDER BY `position` DESC

Становится не совсем ясно, почему отобразилась 4-ая новость. Дело в том, что запрос вернул все записи из таблицы новостей, отсортированные в порядке убывания сверху. И таким образом наша 4-ая новость оказалась самой первой, она же и вывелась как детальная. Т.е просто совпадение.

Разбираем запрос, сформированный при обращении через test.ru/?detail=4+UNION+SELECT+*+FROM+news+WHERE+id=4 .

Тут название таблицы с новостями (в нашем случае это news) бралось логическим перебором.
Итак, выполнился запрос SELECT * FROM `news` WHERE `public`="1" AND `id`=4 UNION SELECT * FROM news WHERE id=4 ORDER BY `position` DESC . К нулевому результату первой части запроса (до UNION) присоединился результат второй части (после UNION), вернувшей детальное описание 4-ой новости.

Защита от SQL инъекций (SQL внедрений)

Защита от взлома сводится к базовому правилу «доверяй, но проверяй». Проверять нужно всё – числа, строки, даты, данные в специальных форматах.
Числа
Для проверки переменной на числовое значение используется функция is_numeric(n);, которая вернёт true, если параметр n - число, и false в противном случае.
Так же можно не проверять значение на число, а вручную переопределить тип. Вот пример, переопределяющий значение $id, полученное от $_GET["id_news"] в значение целочисленного типа (в целое число):
$id=(int)$_GET["id_news"];
Строки
Большинство взломов через SQL происходят по причине нахождения в строках «необезвреженных» кавычек, апострофов и других специальных символов. Для такого обезвреживания нужно использовать функцию addslashes($str);, которая возвращает строку $str с добавленным обратным слешем (\) перед каждым специальным символом. Данный процесс называется экранизацией.

$a="пример текста с апострофом " ";
echo addslashes($a); //будет выведено: пример текста с апострофом \"

Кроме этого существуют две функции, созданные именно для экранизации строк, используемых в SQL выражениях.
Это mysql_escape_string($str); и mysql_real_escape_string($str);.

Первая не учитывает кодировку соединения с БД и может быть обойдена, а вот вторая её учитывает и абсолютно безопасна. mysql_real_escape_string($str); возвращает строку $str с добавленным обратным слешем к следующим символам: \x00, \n, \r, \, ", " и \x1a .

Магические кавычки

Магические кавычки – эффект автоматической замены кавычки на обратный слэш (\) и кавычку при операциях ввода/вывода. В некоторых конфигурациях PHP этот параметр включён, а в некоторых нет. Для того, что бы избежать двойного экранизирования символов и заэкранизировать данные по-нормальному через mysql_real_escape_string($str);, необходимо убрать автоматические проставленные обратные слеши (если магические кавычки включены).

Проверка включённости магических кавычек для данных получаемых из GET, POST или Куков организуется через функцию get_magic_quotes_gpc(); (возвращает 1 – если магические кавычки включены, 0 – если отключены).

Если магические кавычки вкючены (т.е обратные слеши добавляеются) и такое встречается чаще, то их нужно убрать. Это делается через функцию stripslashes($str); (возвращает строку $str без обратных слешей у кавычек и прямых апострофов).

В закючении привожу код с полной экранизацией строк для записи в БД

If(get_magic_quotes_gpc()==1)
{
$element_title=stripslashes(trim($_POST["element_title"]));
$element_text=stripslashes(trim($_POST["element_text"]));
$element_date=stripslashes(trim($_POST["element_date"]));
}
else
{
$element_title=trim($_POST["element_title"]);
$element_text=trim($_POST["element_text"]);
$element_date=trim($_POST["element_date"]);
}

$element_title=mysql_real_escape_string($element_title);
$element_text=mysql_real_escape_string($element_text);
$element_date=mysql_real_escape_string($element_date);

Статья была подготовлена на основе практических навыков по защите веб-систем. Теория дело хорошее, но практика важнее и главное она работает.

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

Ставьте лайки, делитесь с друзьями и коллегами, репостите в соц.сетях.

Все программисты читали или по крайней мере слышали о методах взлома безопасности веб-сайта. Или даже столкнулись с этой проблемой. С другой стороны, бесконечна фантазия тех, кто хочет сломать сайт, поэтому все узкие места должны быть хорошо защищены. Вот почему я хотел бы начать серию коротких статей, где будут представлены основные методы и приемы взлома веб-сайтов.

В первой статье я хотел бы описать и разъяснить некоторые общие методы взлома одного из самых уязвимых частей сайта — форм. Я буду подробно останавливаться на том, как использовать эти методы и как предотвратить атаки, а также расскажу о тестировании безопасности.

SQL инъекции

SQl-инъекция — это такая техника, когда злоумышленник вводит команды SQL в input поле на веб-странице. Этим imput`ом может быть что угодно — текстовое поле в форме, параметры _GET и _POST, cookies и т. д. Этот метод был весьма эффективным до появления фреймворков в мире PHP. Но этот способ взлома может быть по-прежнему опасен, если вы не используете ORM или какие-либо еще расширения для data object. Почему? Из-за способа передачи параметров в SQL запрос.

"Слепые" инъекции

Давайте начнем с классического примера SQL-statement`а, возвращающего пользователя по его логину и хешу от пароля (страница входа)

Пример 1

mysql_query ("SELECT id, login FROM users WHERE login = ? and password = hash(?)");

Я подставил вопросительные знаки в выражение из-за различных вариаций этого решения. Первый вариант, на мой взгляд, самый уязвимый:

Пример 1а

Mysql_query("SELECT id, login FROM users WHERE login = "" . $login . "" and password = hash("" . $password . "")");

В этом случае в коде нет проверки на ввод неправильных данных. Значения передаются прямо из формы ввода в SQL запрос. В самом лучшем случае пользователь введет здесь свои логин и пароль. Что случится в худшем случае? Давайте попробуем хакнуть эту форму. Это можно сделать, передав "подготовленные" данные. Попытаемся войти как первый пользователь из базы данных, а в большинстве случаев — это админский аккаунт. Для этого, передадим специальную строку вместо ввода логина:

" OR 1=1; --

Первая кавычка может быть и одинарной, поэтому одной попыткой взлома можно не обойтись. В конце стоят точка с запятой и два дефиса, чтобы всё, что идёт после превратилось в комментарий. В результате будет выполнен следующий SQL запрос:

SELECT id, login FROM users WHERE login = “;” OR 1=1 LIMIT 0,1; - and password = hash(“;Some password”)

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

Более серьезные способы

В предыдущем примере всё не так уж страшно. Возможности в админской панели управления всегда имеют ограничения и потребуется реально много работы, чтобы поломать сайт. А вот атака через SQL инъекции может привести к куда большим повреждениям системы. Задумайтесь, сколько приложений создаются с главной таблицей "users" , и что будет, если злоумышленник введет такой код в незащищённую форму:

My favorite login"; DROP TABLE users; --

Таблица "users" будет удалена. Это одна из причин почаще делать бэкапы баз данных.

_GET параметры

Все параметры, заполненные через форму, передаются на сервер одним из двух методов — GET или POST. Наиболее распространенный параметр, передаваемый через GET — id. Это одно из самых уязвимых мест для атак, при этом неважно, какого вида урл вы используете — ` http://example.com/users/?id=1 `, или ` http://example.com/users/1 `, или ` http://......./.../post /35 `.

Что произойдет, если мы подставим в урл следующий код?

Http://example.com/users/?id=1 AND 1=0 UNION SELECT 1,concat(login,password), 3,4,5,6 FROM users WHERE id =1; --

Вероятно, такой запрос вернет нам логин пользователя и... хеш от его пароля. Первая часть запроса `AND 1=0` превращает то, что перед ним в false, соответственно никаких записей не будет получено. А вторая часть запроса вернет данные в виде prepared data. А так как первым параметром идет id, следующим будет логин пользователя и хеш его пароля и еще сколько-то параметров. Существует множество программ, с помощью брутфорса декодирующих такой пароль, как в примере. А так как пользователь может использовать один и тот же пароль для разных сервисов, можно получить доступ и к ним.

И вот что любопытно: от такого способа атаки совершенно невозможно защититься методами вроде `mysql_real_escape_string`, `addslashes` и.т. д. В принципе, нет способа избежать такой атаки, поэтому, если параметры будут передаваться так:

"SELECT id, login, email, param1 FROM users WHERE id = " . addslashes($_GET["id"]);"

проблемы не исчезнут.

Экранирование символов в строке

Когда я был новичком в программировании, мне было тяжело работать с кодировками. Я не понимал, в чем между ними различие, зачем использовать UTF-8, когда нужно UTF-16, почему база данных постоянно устанавливает кодировку в latin1. Когда я наконец начал всё это понимать, то обнаружил, что проблем станет меньше, если хранить всё в одном стандарте кодирования. Разбираясь со всем этим, я заметил также и проблемы безопасности, возникающие при преобразовании из одной кодировки в другую.

Проблем, описанных в большинстве предыдущих примеров, можно избежать, используя одинарные кавычки в запросах. Если вы используете addslashes() , атаки через SQL-инъекции, построенные на использовании одинарных кавычек, экранируемых обратным слэшем, потерпят неудачу. Но такая атака может пройти, если просто подставить символ с кодом 0xbf27 , addslashes() преобразует его в символ с кодом 0xbf5c27 - а это вполне валидный символ одинарной кавычки. Другими словами, `뼧` пройдет через addslashes() , а потом маппинг MySQL конвертирует его в два символа 0xbf (¿) и 0x27 (‘).

"SELECT * FROM users WHERE login = ""; . addslashes($_GET["login"]) . ";"";

Этот пример можно хакнуть, передав 뼧 or 1=1; -- в поле логина в форме. Движок SQL сгенерит конечный запрос так:

SELECT * FROM users WHERE login = "¿" OR 1=1; --

И вернет первого пользователя из БД.

Защита

Как же защитить приложение? Есть куча способов, применение которых не сделает приложение совсем неуязвимым, но хотя бы повысит его защищенность.

Использование mysql_real_escape_string

Функция addslashes() ненадежна, так как не предусматривает многие случаи взлома. У mysql_real_escape_string нет таких проблем

Использование MySQLi

Это расширение для MySQL умеет работать со связанными параметрами:

$stmt = $db->prepare("update uets set parameter = ? where id = ?"); $stmt->bind_param("si", $name, $id); $stmt->execute();

Использование PDO

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

$dbh = new PDO("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(":name", $name); $stmt->bindParam(":value", $value); // insert one row $name = "one"; $value = 1; $stmt->execute();

Короткий способ:

$dbh = new PDO("mysql:dbname=testdb;host=127.0.0.1", $user, $password); $stmt = $dbh->prepare("UPDATE people SET name = :new_name WHERE id = :id"); $stmt->execute(array("new_name" => $name, "id" => $id));

Использование ORM

Используйте ORM и PDO и связывайте (используйте bind) параметры. Избегайте SQL в коде, если вы видите в коде SQL, значит, с ним что-то не так.

ORM позаботится о безопасности в самых узких местах в коде и о валидации параметров.

Выводы

Цель этой серии не предоставить полное руководство по взлому сайтов, а обеспечить безопасность приложения и предотвращение атак из любого источника. Я постарался написать эту статью не только для программистов — они должны быть в курсе любых угроз в коде и знать пути, как предотвратить их, но также и для инженеров по качеству — потому, что их работа заключается в том, чтобы отследить и сообщить такие моменты.

Количество сайтов и страничек в Сети неуклонно растёт. За разработку берутся все, кто только может. И начинающие веб-программисты очень часто используют небезопасный и старый код. А это создаёт массу лазеек для злоумышленников и хакеров. Чем они и пользуются. Одна из самых классических уязвимостей — SQL-инъекция.

Немного теории

Многие знают, что большинство сайтов и сервисов в сети используют для хранения базы SQL. Это такой язык структурированных запросов, который позволяет управлять и администрировать хранилища с данными. Известно много различных версий систем менеджмента базами данных — Oracle, MySQL, Postgre. Вне зависимости от имени и типа, они одинаково используют запросы к данным. Именно здесь и кроется потенциальная уязвимость. Если разработчик не смог правильно и безопасно обработать запрос, то злоумышленник может воспользоваться этим и применить особые тактики для получения доступа к базе, а оттуда - и к управлению всем сайтом.

Для избежания таких ситуаций нужно грамотно оптимизировать код и внимательно следить за тем, какой запрос каким способом обрабатывается.

Проверка на SQL-инъекции

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

Например, есть некий_сайт/index.php?id=25

Самый лёгкий способ — поставить после 25 кавычку и отправить запрос. Если никакой ошибки не возникло, то либо на сайте фильтруются все запросы и правильно обрабатываются, либо в настройках отключён их вывод. Если страница перезагрузилась с проблемами, значит, уязвимость для SQL-инъекции есть.

После того как она обнаружена, можно пробовать избавиться от нее.

Для реализации данной уязвимости нужно знать немного о Одна из них — UNION. Она объединяет несколько результатов запроса в один. Так можно вычислить количество полей в таблице. Пример первого запроса выглядит так:

  • некий_сайт/index.php?id=25 UNION SELECT 1.

В большинстве случаев такая запись должна выдать ошибку. Это значит, что количество полей не равно 1. Таким образом, подбирая варианты от 1 и больше, можно установить их точное число:

  • некий_сайт/index.php?id=25 UNION SELECT 1,2,3,4,5,6.

То есть, когда ошибка перестанет появляться, значит, количество полей угадано.

Есть также и альтернативный вариант решения этой проблемы. Например, когда число полей большое — 30, 60 или 100. Это команда GROUP BY. Он группирует результаты запроса по какому-либо признаку, например id:

  • некий_сайт/index.php?id=25 GROUP BY 5.

Если ошибок не было получено, значит, полей больше, чем 5. Таким образом, подставляя варианты из довольно обширного диапазона, можно вычислить, сколько же их на самом деле.

Данный пример SQL-инъекции - для новичков, которые хотят попробовать себя в тестировании своего сайта. Важно помнить, что за несанкционированный доступ к чужому имеется статья Уголовного кодекса.

Основные типы инъекций

Реализовать уязвимости посредством SQL-инъекции можно несколькими вариантами. Далее идут наиболее популярные методики:

    UNION injection. Простой пример данного типа был уже рассмотрен выше. Реализуется он за счёт ошибки в проверке приходящих данных, которые никак не фильтруются.

    Error-based SQL injection. Как понятно из названия, данный тип также использует ошибки, посылая выражения, составленные синтаксически неправильно. Затем происходит перехват заголовков ответа, анализируя которые, можно провести впоследствии SQL-инъекцию.

    Stacked injection. Данная уязвимость определяется выполнением последовательных запросов. Характеризуется он присоединением в конце знака «;». Этот подход чаще реализуется для доступа к реализации чтения и записи данных или же управлением функциями операционной системы, если привилегии это позволяют.

Программные комплексы для поиска SQL-уязвимостей

Наличествующие для проведения SQL-инъекций, программы обычно имеют две составляющих — сканирование сайта на возможные уязвимости и их использование для получения доступа к данным. Существуют такие утилиты практически для всех известных платформ. Их функционал в значительной мере облегчает проверку сайта на возможность взлома SQL-инъекцией.

Sqlmap

Очень мощный сканер, работающий с большинством известных СУБД. Поддерживает различные методики внедрения SQL-инъекций. Имеет возможность автоматического распознавания типа хэша пароля и его взлома по словарю. Присутствует и функционал загрузки и выгрузки файлов с сервера.

Установка в среде Linux выполняется с помощью команд:

  • git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev,
  • cdsqlmap-dev/,
  • ./sqlmap.py --wizard.

Для Windows имеется как вариант с командной строкой, так и с графическим интерфейсом пользователя.

jSQL Injection

jSQL Injection — кроссплатформенный инструмент для тестирования использования SQL уязвимостей. Написан на Java, поэтому в системе должен быть установлен JRE. Способен обрабатывать запросы header, cookie. Обладает удобным графическим интерфейсом.

Установка данного программного комплекса происходит так:

wget https://github.com/`curl -s https://github.com/ron190/jsql-injection/releases| grep-E -o "/ron190/jsql-injection/releases/download/v{1,2}.{1,2}/jsql-injection-v{1,2}.{1,2}.jar"| head-n 1`

Запуск осуществляется с помощью команды java -jar ./jsql-injection-v*.jar

Для того чтобы начать проверку сайта на SQL-уязвимость, нужно ввести его адрес в верхнее поле. Они есть отдельные для GET и для POST. При положительном результате в левом окне появится список доступных таблиц. Их можно просмотреть и узнать некую конфиденциальную информацию.

Для поиска административных панелей используется вкладка «Admin page». На ней с помощью специальных шаблонов выполняется автоматический поиск системных записей привилегированных пользователей. Из них можно получить всего лишь хэш пароля. Но и он имеется в инструментарии программы.

После нахождения всех уязвимостей и инъектирования нужных запросов, утилита позволит залить на сервер свой файл или же, наоборот, скачать его оттуда.

SQLi Dumper v.7

Данная программа — простой в использовании инструмент для поиска и реализации уязвимостей в SQL. Производит оон это на основе так называемых дорков. Их списки можно найти в интернете. Дорки для SQL-инъекций — это специальные шаблоны поисковых запросов. С их помощью можно найти потенциально через любой поисковик.

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

На сайте itsecgames.com имеется специальный набор инструментария, который позволяет на примере показывает как сделать SQL инъекцию и протестировать ее. Для того чтобы воспользоваться, её нужно скачать и установить. Архив содержит в себе набор файлов, который представляет собой структуру сайта. Для его установки понадобится имеющийся в системе набор веб-сервера Apache, MySQL и PHP.

Распаковав архив в папку веб-сервера, надо перейти по адресу, введённому при установке данного программного продукта. Откроется страница с регистрацией пользователя. Здесь нужно ввести свои данные и нажать «Create». Переведя пользователя в новое окно, система предложит выбрать один из вариантов тестирования. Среди них имеется как описываемые инъекции, так и много других тестовых заданий.

Стоит рассмотреть пример SQL-инъекции типа GET/Search. Здесь нужно выбрать ее и нажать «Hack». Перед пользователем предстанет строка поиска и имитация некоего сайта с фильмами. Перебирать фильмы можно долго. Но их всего 10. К примеру, можно попробовать ввести Iron Man. Выведется фильм, значит, сайт работает, и таблицы в нем имеются. Теперь надо проверить, фильтрует ли скрипт особые символы, в частности кавычку. Для этого в строку адреса нужно добавить "». Причём, сделать это надо после названия фильма. Сайт выдаст ошибку Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "%"" at line 1, которая гласит о том, что символы всё-таки обрабатываются неправильно. Значит, можно пробовать подставить свой запрос. Но нужно сначала вычислить количество полей. Для этого используется order by, который вводится после кавычки: http://testsites.com/sqli_1.php?title=Iron+Man" order by 2 --&action=search.

Данная команда просто выведет сведения о фильме, то есть количество полей больше 2. Двойной дефис сообщает серверу, что остальные запросы нужно отбросить. Теперь надо перебирать, подставляя все большие значения до тех пор, пока не выведется ошибка. В итоге получится, что полей будет 7.

Теперь настало время получить что-то полезное из базы. Придётся немного модифицировать запрос в адресной строке, приведя ее к такому виду: http://testsites.com/sqli_1.php?title=Iron+Man" union select 1, database(),user(),4,password,6,7 from users --&action=search. В результате её выполнения выведутся строки с хэшами паролей, которые можно легко превратить в понятные символы с помощью одного из онлайн сервисов. А немного поколдовав и подобрав имя поля с логином, можно получить доступ к чужой записи, например админа сайта.

В продукте имеется масса разновидностей типов инъекций, на которых можно попрактиковаться. Стоит помнить, что применение данных навыков в сети, на реальных сайтах может оказаться уголовно наказуемым.

Инъекции и PHP

Как правило, именно PHP-код и отвечает за необходимую обработку запросов, приходящих от пользователя. Поэтому именно на этом уровне нужно выстраивать защиту от SQL-инъекций в PHP.

  • Данные всегда должны быть обработаны перед помещением в базу. Это можно реализовать либо используя уже имеющиеся выражения, либо организовывая запросы вручную. Здесь тоже стоит учитывать, что числовые значения преобразовываются к тому типу, который необходим;
  • Избегать в запросе появления различных управляющих конструкций.

Теперь немного о правилах составления запросов в MySQL для защиты от SQL-инъекций.

При составлении каких-либо выражений для запроса важно отделять данные от ключевых слов SQL.

  • SELECT * FROM table WHERE name = Zerg.

В данной конструкции система может подумать, что Zerg — это имя какого-либо поля, поэтому нужно заключить его в кавычки.

  • SELECT * FROM table WHERE name = "Zerg".

Однако, бывают ситуации, когда значение само по себе содержит кавычки.

  • SELECT * FROM table WHERE name = "кот-д"ивуар".

Здесь обработается только часть кот-д, а остальная может быть воспринята как команда, которой, естественно, нет. Поэтому возникнет ошибка. Значит нужно такого рода данные экранировать. Для этого используется обратный слэш - \.

  • SELECT * FROM table WHERE name = "кот-д\"ивуар".

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

Существует рекомендация, по которой имя поля должна быть заключена в обратную кавычку. Этот символ находится в левой части клавиатуры, вместе со знаком тильда «~». Это нужно для того, чтобы MySQL могла точно отличить имя поля от своего ключевого слова.

Динамическая работа с данными

Очень часто для получения каких-либо данных из базы используются запросы, сформированные динамически. Например:

  • SELECT * FROM table WHERE number = "$number".

Здесь переменная $number передается в качестве определения значения поля. Что же будет, если в неё попадёт "кот-д"ивуар"? Ошибка.

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

Для самостоятельного добавления слэша можно использовать mysql_real_escape_string.

$number=mysql_real_escape_string($number);

$year=mysql_real_escape_string($year);

$query="INSERT INTO table (number,year,class) VALUES ("$number","$year",11)".

Хотя код и вырос в объеме, все же, потенциально он будет работать гораздо безопаснее.

Плейсхолдеры

Плейсхолдеры — своеобразные маркеры, по которым система узнает что в это место нужно подставить специальную функцию. Например:

$sate = $mysqli->prepare("SELECT District FROM Number WHERE Name=?");

$sate->bind_param("s", $number);

$sate->execute();

Данный участок кода производит подготовку шаблона запроса, затем привязывает переменную number, и выполняет его. Данный подход позволяет разделить обработку запроса и его реализацию. Таким образом, можно уберечься от использования внедрения вредоносного кода в SQL-запросы.

Что может сделать злоумышленник

Защита системы - очень важный фактор, которым нельзя пренебрегать. Конечно, простенький сайт-визитку будет проще восстановить. А если это большой портал, сервис, форум? Какие последствия могут быть, если не думать о безопасности?

Во-первых, хакер может нарушить как целостность базы, так и удалить её целиком. И если администратор сайта или хостер не сделали бэкап, то придётся несладко. Помимо всего, злоумышленник, взломав один сайт, может перейти на другие, размещённые на этом же сервере.

Далее идет хищение личных данных посетителей. Как их использовать — тут все ограничивается лишь фантазией хакера. Но в любом случае последствия будут не очень приятными. Тем более если содержалась финансовая информация.

Также злоумышленник может слить базу себе, а затем вымогать деньги за её возврат.

Дезинформация пользователей от имени лицом им не являющимся, также может нести негативные последствия, так как возможны факты мошенничества.

Заключение

Вся информация в данной статье предоставлена исключительно в ознакомительных целях. Использовать её нужно только для тестирования собственных проектов при обнаружении уязвимостей и их устранения.

Для более углублённого изучения методики того, как провести SQL-инъекцию, нужно начать собственно с исследования возможностей и особенностей языка SQL. Как составляются запросы, ключевые слова, типы данных и применение всего этого.

Также не обойтись без понимания работы функций PHP и элементов HTML. Основными уязвимыми точками для использования инъекций — адресная строка, поиск и различные поля. Изучение функций PHP, способ их реализации и возможности позволят понять, как можно избежать ошибок.

Наличие множества готовых программных инструментов позволяют провести глубокий анализ сайта на известные уязвимости. Один из наиболее популярных продуктов — kali linux. Это образ операционной системы на базе Linux, который содержит в себе большое количество утилит и программ, способных провести разносторонний анализ сайта на прочность.

Для чего нужно знать, как взломать сайт? Все очень просто — это надо для того, чтобы иметь представление о потенциально уязвимых местах своего проекта или сайта. Особенно если это какой-либо интернет-магазин с возможностью оплаты онлайн, где платёжные данные пользователя могут быть скомпрометированы злоумышленником.

Для профессионального исследования существуют службы информационной безопасности смогут проверить сайт по разным критериям и глубине. Начиная от простой HTML-инъекции и до социальной инженерии и фишинга.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: