На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Простейшая 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-инъекцию. В следующий статьях я разовью данную тему, а также научу, как защищаться от несанкционированного доступа. А если вам требуется проверить вашу систему, то вы можете обратиться в личку – за небольшую плату я с удовольствием помогу вам.



тегистатьи IT, безопасность, sql, php





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




ЧПУ с помощью PHP для чайников
График функции на C++ в GUI с анимацией


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.