07:27,Четверг, 25.04.2024
Bratvacs.ucoz.com:)
Меню сайта
Мини-чат
Наш опрос
Лучшая отечественная игра
Всего ответов: 0
Калькулятор
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Вы Используете -
Главная » 2016 » Май » 27 »

Внедрение SQL-кода


22:53
Внедрение SQL-кода
Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

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

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

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:


# Предыдущий код скрипта...
$id = $_REQUEST['id'];
$res = mysql_query("SELECT * FROM news WHERE id_news =".$id);
# Следующий код скрипта...


Если на сервер передан параметр id, равный 5 (например так: http://example.org/script.php?id=5), то выполнится следующий SQL-запрос:


SELECT * FROM news WHERE id_news = 5


Но если злоумышленник передаст в качестве параметра id строку -1 OR 1=1 (например, так:


http://example.org/script.php?id=-1+OR+1=1), то выполнится запрос:
SELECT * FROM news WHERE id_news = -1 OR 1=1


Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно — вычисления происходят по кратчайшему контуру в схеме).

Внедрение в строковые параметры

Предположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе (здесь параметры экранируются кавычками):


$search_text = $_REQUEST['search_text'];
$res = mysql_query("SELECT id_news, news_date, news_caption, news_text, news_id_author
                      FROM news WHERE news_caption LIKE('%$search_text%')");


Сделав запрос вида http://example.org/script.php?search_text=Test мы получим выполнение следующего SQL-запроса:


SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news
  WHERE news_caption LIKE('%Test%')


Но, внедрив в параметр search_text символ кавычки (который используется в запросе), мы можем кардинально изменить поведение SQL-запроса. Например, передав в качестве параметра search_text значение ')+and+(news_id_author='1, мы вызовем к выполнению запрос:


SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news
  WHERE news_caption LIKE('%') and (news_id_author='1%')


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

Язык SQL позволяет объединять результаты нескольких запросов при помощи оператора UNION. Это предоставляет злоумышленнику возможность получить несанкционированный доступ к данным.

Рассмотрим скрипт отображения новости (идентификатор новости, которую необходимо отобразить, передается в параметре id):


$res = mysql_query("SELECT id_news, header, body, author FROM news WHERE id_news = " . $_REQUEST['id']);


Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 1,username, password,1 FROM admin, это вызовет выполнение SQL-запроса


SELECT id_news, header, body, author FROM news WHERE id_news = -1 UNION SELECT 1,username,password,1 FROM admin


Так как новости с идентификатором −1 заведомо не существует, из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.

Использование UNION + group_concat()

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


group_concat(col, symbol, col)


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


-1 UNION SELECT group_concat(username, 0x3a, password) FROM admin


Экранирование хвоста запроса

Зачастую, SQL-запрос, подверженный данной уязвимости, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт


$res = mysql_query("SELECT author FROM news WHERE id=" . $_REQUEST['id'] ." AND author LIKE ('a%')");


отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а, и внедрение кода с использованием оператора UNION затруднительно.

В таких случаях, злоумышленниками используется метод экранирования части запроса при помощи символов комментария(/* или -- в зависимости от типа СУБД).

В данном примере, злоумышленник может передать в скрипт параметр id со значением -1 UNION


SELECT password FROM admin/*, выполнив таким образом запрос
SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE ('a%')


в котором часть запроса ( AND author LIKE ('a%')) помечена как комментарий и не влияет на выполнение.

Расщепление SQL-запроса

Для разделения команд в языке SQL используется символ ; (точка с запятой), внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе, однако не все диалекты SQL поддерживают такую возможность.

Например, если в параметры скрипта


$id = $_REQUEST['id'];
$res = mysql_query("SELECT * FROM news WHERE id_news = $id");


злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO

admin (username, password) VALUES ('HaCkEr', 'foo'); то в одном запросе будут выполнены 2 команды
SELECT * FROM news WHERE id_news = 12;
INSERT INTO admin (username, password) VALUES ('HaCkEr', 'foo');

и в таблицу admin будет несанкционированно добавлена запись HaCkEr.
Просмотров: 552 | Добавил: V@dim | Теги: Внедрение SQL-кода | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт

Поиск
Поделится Сайтом
Календарь
«  Май 2016  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Архив записей
Новости Игры
00:00:58

Место для пикника

  • Просмотры:
  • Всего комментариев: 0
  • Рейтинг: 0.0
00:03:55

Без Билета — Африка

  • Просмотры:
  • Всего комментариев: 0
  • Рейтинг: 0.0
00:00:24

На пожар!

  • Просмотры:
  • Всего комментариев: 0
  • Рейтинг: 0.0
00:03:27

Помогите Семенович!

  • Просмотры:
  • Всего комментариев: 0
  • Рейтинг: 0.0
Copyright bratvacs.ucoz.com © 2024
Бесплатный конструктор сайтов - uCoz