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


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



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

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

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

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

<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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, информационная безопасность, sql, php




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



Как прокачать Академию в игре Спарта: Война Империй
Графический интерфейс пользователя
C#: объединение текстовых файлов с одинаковыми именами из разных папок