Простейшая SQL инъекция для чайников
В этой статье я объясню основы SQL Injection с примером, который показывает SQL-инъекцию.
Как следует из названия, эту атаку можно выполнить с помощью SQL-запросов. Многие веб-разработчики не знают, как злоумышленник может вмешиваться в SQL-запросы. SQL-Injection может выполняться в веб-приложении, которое не фильтрует вход пользователя должным образом и не доверяет тому, что предоставляет пользователь. Идея SQL-инъекции - заставить приложение запускать нежелательные SQL-запросы.
Конечно, мы не хакеры, но чтобы уметь защищаться, надо понимать, как действует враг. Все примеры, упомянутые в этой статье, протестированы на такой конфигурации:
- PHP version: 5.4.45
- Веб-сервер:Apache
- Тип сервера баз данных: MariaDB
- Версия сервера: 10.1.26-MariaDB
Большинство веб-приложений имеют страницу входа. Поэтому мы начнем с этого. Предположим, что есть такая форма:
<form name="login_form" id="login_form" method="post" action="sql.php"> Имя пользователя:<input type="text" id="user_name" name="user_name" value=""> Пароль<input type="password" id="pass_word" name="pass_word" value=""> <input type="submit" value="Войти"> </form>Когда пользователь вводит имя пользователя и пароль, он будет отправлен на sql.php через метод HTTP_POST:
<?php $conn = mysql_connect('localhost', 'name', 'pass'); mysql_select_db("db"); if (!$conn) die('Ошибка: невозможно подключиться: ' . mysql_error()); $result=mysql_query("SELECT * from test_in where user_name='".$_POST['user_name']."' and password='".$_POST['pass_word']."'"); $row = mysql_fetch_row($result); if ($row) echo "Вы вошли"; else echo "Вы не вошли"; ?>Пример максимально упрощен для понимания. Что здесь происходит? Мы подключаемся к базе данных, а затем к таблице «test_in» делаем запрос на выборку. Если поля имя пользователя и пароль совпадают, то в результате функция mysql_fetch_row() будет выдавать хотя бы один результат, то есть отличаться от “false”. Пятая строка в данном php-скрипте уязвима. Попробуйте оставить поле пароля пустым, а в логин ввести следующее:
' OR 1=1 --
Тогда результат всегда будет "Вы вошли"!
То есть мы получаем доступ к информации, которая должна по идее выдаваться только пользователю, знающему связку «логин-пароль». Почему так происходит?
Дело в том, что тогда выполняется вот такая строка:
SELECT * from test_in where user_name='' OR 1=1 -- ' and password=''А здесь условие такое: или имя пользователя должно быть равным ничему или же единица должна быть единице. Понятно, что последнее условие выполняться всегда, поэтому и результат будет отличным от “false”. А чтобы не выполнялось еще одно условие (проверка на пароль) – мы закомментируем конец строки. Не забудьте только после перед двумя тире поставить хотя бы один пробел – иначе будет ошибка синтаксиса.
Понятно, что для того, чтобы выполнить такой запрос, надо хотя бы знать, как именно происходит авторизация пользователя. Однако, у взломщиков есть множество шаблонов для sql-инъекций.
Итак, в этой статье мы научились создавать простейшую sql-инъекцию. В следующий статьях я разовью данную тему, а также научу, как защищаться от несанкционированного доступа. А если вам требуется проверить вашу систему, то вы можете обратиться в личку – за небольшую плату я с удовольствием помогу вам.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.