что такое sql инъекция

Базовые sql-инъекции в приложениях, использующих язык SQL. Руководство для чайников

Примечание переводчика

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

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

Оригинальное название статьи: Продвинутые SQL-инъекции в приложениях, использующих язык 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 выражение выглядит следующим образом:

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

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

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

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

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

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

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

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

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

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

Источник

Взламываем сайты: шпаргалка по SQL инъекциям

Типы SQLi

Существует 5 основных типов SQL инъекций:

Далее мы разберем их детальней.

Уязвимые точки

Уязвимые точки для атаки находятся в местах, где формируется запрос к базе: форма аутентификации, поисковая строка, каталог, REST-запросы и непосредственно URL.

Защита от SQLi

Для каждого сервера и фреймворка есть свои тонкости и лучшие практики, но суть всегда одинакова.

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

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

Естественно, не забывайте про ограничение прав доступа к базе.

Тем не менее, кибербезопасность – это тот случай, когда понимание принципов нападения – лучший способ защиты.

Классические атаки

Самый простой пример критически уязвимого для SQLi кода выглядит следующим образом:

Представляя такой антипример, можно понять принцип действия атак, которые мы рассмотрим ниже.

Комментирование

Использование однострочных комментариев позволяет игнорировать часть запроса, идущую после вашей инъекции. Например, ввод в уязвимое поле Username запроса admin’— позволит зайти на ресурс под администратором, потому что поверка пароля будет закомментирована. Конечно, сейчас такой тип уязвимости встречается очень редко, но помнить о ней стоит.

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

А некоторые особые комментарии позволят определить тип базы данных в целях дальнейшей эксплуатации уязвимостей:

Манипуляции со строками

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

В MySQL для обхода сложных паттернов можно представлять строки в шеснадцатиричном виде, с помощью функции HEX() или вводить их посимвольно:

Обход аутентификации

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

Union injection

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

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

Последовательные запросы

Если целевой сервис работает на SQL Server и ASP/PHP, либо на PostgreSQL и PHP, можно использовать простой знак ‘;’ для последовательного вызова вредоносных запросов:

Возможный урон

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

Error-Based

Чтобы побороть этот тип атак, достаточно запретить вывод ошибок на проде. Тем не менее, давайте на примере разберем, чем вам может грозить игнорирование этой меры.

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

Слепые инъекции

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

Читайте также:  что значит поцелуй руки у турков

Условные выражения

Атаки с использованием IF и WHERE – основа слепого метода. Они являются одной из причин, почему используемые вами операторы должны быть закодированы в программе, а не генерироваться абы как. Синтаксис для разных баз будет отличаться:

Boolean-based

Если атакующий все же может получить информацию о наличии или отсутствии ошибки из HTTP-статуса, в сервисе имеется уязвимость к обычной слепой атаке. Рассмотрим запрос, который позволит нам при помощи алгоритма бинарного поиска посимвольно определить название первой таблицы и в дальнейшем всех данных:

Time-Based

Если атакующий не наблюдает никаких отличий в ответах сервера, остается полностью слепая атака. Примером будет использование функций SLEEP или WAIT FOR DALAY:

Конечно, реальные примеры будут выглядеть примерно как boolean-based, только true и false атакующий будет отличать по времени отклика. Недостатки такого метода очевидны. Если выбрать слишком маленькую задержку, будет сильное влияние сторонних факторов типа пинга. Если слишком большую – атака займет очень много времени и её, скорее всего, остановят.

Конечно, по SQLi можно писать целые книги, но мы постарались объяснить ключевые принципы с примерами.

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

SQL-инъекция

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

Содержание

Введение в SQL

OR – логическое ИЛИ. AND – логическое И. Пример использования:

LIKE – оператор сравнения строк, Для оператора LIKE символ «%» соответствует любой строке. Пример использования:

UNION – объединяет две выборки в одну. Запрос будет выполнен правильно, только если выборки имеют одинаковое количество столбцов. Пример использования:

GROUP BY – группирует результаты выборки по выбранным столбцам. Пример использования:

ORDER BY – упорядочивает результаты выборки по выбранным столбцам. Пример использования:

Типы SQL-иньекций

Типы SQL-иньекций разделяются по нескольким параметрам. Одним из критериев является тип запроса, в который мы можем встраивать наши инструкции. Основные типы запросов, которые будут рассмотрены, это SELECT, INSERT, UPDATE и DELETE.

SELECT

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

Рассмотрим подробнее, какие существуют подгруппы SELECT-SQL иньекций.

Union-based

Первый метод заключается в добавлении конструкции UNION, позволяющей обьединять результаты нескольких SQL-запросов. Для этого требуется, чтобы у запросов было одинаковое количество столбцов возвращаемых значений (у некоторых баз данных, таких, как IBM DB2, к тому же требуется, чтобы соответствующие столбцы были одинаковых типов).

Пример: Сайт, возвращающий имя и логин пользователей по id, использует следующий SQL-запросов

Для успешной эксплуатации потребуется дописать запрос, введя следующее:

В итоге запрос будет выглядеть, как:

И нам вернутся все пароли пользователя.

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

Error-based

Суть Error-based заключается в том, что мы можем извлекать нужную нам информацию из запроса посредством просмотра ошибок работы вызываемых функций. Одной из таких функций в БД MySQL является extractvalue().

Пример запроса, который вернет нам версию базы данных в сообщении ошибки:

Blind

Слепыми SQL-иньекциями называют технику эксплуатации, когда результат работы SQL-запроса определяется по косвенным признакам, например, по времени ответа.

Boolean-based

Рассмотрим подробнее принцип работы boolean-based sql injection:

Пусть есть SQL-запрос:

Отличаться запрос от предыдущих примеров будет тем, что полученная почта не будет высвечиваться, а, например, обрабатываться на Backend (пусть отправка письма восстановления аккаунта).

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

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

чтобы наш запрос принял вид:

В таком случае, мы увидим ошибку отсутствующей почты (при существующем аккаунте с только, если первая буква пароля не ‘a’. После чего мы можем перебирать по 1 букве и получать значения из базы данных.

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

Time-based

Time-based отличается от boolean-based тем, что результат работы запроса мы определяем по времени задержки ответа от сервера. Пример запроса:

То получим следующий запрос:

И в случае, если версия базы данных будет 5, то, например, страница веб-сайта загрузится на 15 секунд медленнее.

INSERT

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

Есть запрос, добавляющий пользователя в БД:

Таким образом, если мы в поле логина введем следующее:

UPDATE

Основывается на том же методе, что и в INSERT SQL-INJECTION.

Введем в input следующее:

И в итоге получим запрос, помещающий в поле почты пользователя с версию БД:

Остальное

Stacked

Суть Stacked SQL injection сводится к тому, что возможно за раз отправить несколько SQL-запросов. Чаще всего такой тип SQL-injection эксплуатируют у баз данных MSSQL.

Для эксплуатации введем:

И получим два запроса:

Login bypass auth

В некоторых случаях требуется не получить значение из базы данных, а завершить запрос так, чтобы от БД вернулось верное значение.

Наглядным примером этого является уязвимый запрос в БД на авторизацию:

И получившийся запрос, возвращающий единицу:

Защита от SQL-инъекций

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

Читайте также:  Бета лактоглобулин что это и где содержится

Источник

SQL Инъекция

SQL Инъекция

SQL инъекция является одним из наиболее распространенных методов взлома веб-страниц.

SQL в Веб странице

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

Посмотрите на следующий пример, который создает оператор SELECT, добавляя переменную (txtUserId) в строку select. Переменная извлекается из пользовательского ввода (getRequestString):

Пример

Остальная часть этой главы описывает потенциальные опасности использования пользовательского ввода в инструкции SQL.

SQL Инъекция, основанная на 1=1, всегда true

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

Если нет ничего, что могло бы помешать пользователю ввести «Неправильный» ввод, пользователь может ввести какой-то «Умный» ввод, например:

Тогда оператор SQL будет выглядеть следующим образом:

Приведенный выше SQL является допустимым и возвращает все строки из таблицы «Users», так как OR 1=1 всегда истинно.

Разве приведенный выше пример выглядит опасным? Что делать, если таблица «Users» содержит имена и пароли?

Приведенная выше инструкция SQL во многом совпадает с этой:

Хакер может получить доступ ко всем именам пользователей и паролям в базе данных, просто вставив 105 OR 1=1 в поле ввода.

SQL Инъекция, основанная на «»=»», всегда true

Вот пример входа пользователя на веб сайте:

Пример

uName = getRequestString(«username»);
uPass = getRequestString(«userpassword»);

sql = ‘SELECT * FROM Users WHERE Name =»‘ + uName + ‘» AND Pass =»‘ + uPass + ‘»‘

Результат

Хакер может получить доступ к именам пользователей и паролям в базе данных, просто вставив » OR «»=» в текстовое поле пользователя или парол:

Код на сервере создаст допустимую инструкцию SQL, подобный этому:

Результат

Приведенный выше SQL является допустимым и возвращает все строки из таблицы «Users», так как OR»=»» всегда имеет значение TRUE.

SQL Инъекция на основе пакетных инструкций SQL

Большинство баз данных поддерживают пакетный инструкций SQL.

Приведенная ниже инструкция SQL вернет все строки из таблицы «Users», а затем удалит таблицу «Suppliers».

Пример

Посмотрите на следующий пример:

Пример

И следующие входные данные:

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

Результат

SQL Используйте параметры для защиты

Для защиты веб сайта от SQL инъекции можно использовать параметры SQL.

Пример ASP.NET Razor

Обратите внимание, что параметры представлены в инструкции SQL маркером @.

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

Пример другой

Примеры

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

Источник

HackWare.ru

Этичный хакинг и тестирование на проникновение, информационная безопасность

Уязвимость SQL-инъекция (ч. 1): Основы SQLi, простая инъекция с UNION

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  что значит катаральный аппендицит

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

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

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

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

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

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

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

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

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

Далее перечень СУБД и вариантов выводимых ими ошибок:

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

Ошибка в MSSQL ASPX:

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

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

Ошибка в PostgreSQL:

Ошибка в MS SQL Server:

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

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

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

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

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

Далее выполним ряд тестов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как я сказал, количество полей должно быть в обоих 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 или нет

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

База данных INFORMATION_SCHEMA

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Строительный портал