Big Binary Files Upload (PostgreSQL)

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi kuwa bingwa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Vitu Kubwa vya PostgreSQL

PostgreSQL inatoa muundo unaojulikana kama vitu vikubwa, vinavyopatikana kupitia meza ya pg_largeobject, iliyoundwa kuhifadhi aina kubwa za data, kama picha au hati za PDF. Njia hii ni bora kuliko kazi ya COPY TO kwani inawezesha kurejesha data kwenye mfumo wa faili, ikihakikisha nakala kamili ya faili ya awali inabaki.

Kwa kuhifadhi faili kamili ndani ya meza hii, kipengee lazima kisasisishwe kwenye meza ya pg_largeobject (kikiwa na LOID), kisha data itakatwe katika vipande vya 2KB na kuingizwa kwenye kipengee hiki. Ni muhimu kwamba vipande hivi viwe saizi ya 2KB (isipokuwa kipande cha mwisho kinaweza kuwa tofauti) ili kuhakikisha kazi ya kurejesha inafanya kazi kwa usahihi.

Ili kugawanya data yako ya binary katika vipande vya 2KB, amri zifuatazo zinaweza kutekelezwa:

split -b 2048 your_file # Creates 2KB sized files

Kwa kuweka kila faili katika muundo wa Base64 au Hex, amri zifuatazo zinaweza kutumika:

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

Muhimu: Wakati wa kiotomatiki mchakato huu, hakikisha kutuma vipande vya 2KB vya herufi wazi. Faili zilizohifadhiwa kwa mfumo wa Hex zitahitaji data ya 4KB kwa kila kipande kutokana na kuongezeka kwa ukubwa, wakati faili zilizohifadhiwa kwa mfumo wa Base64 zitafuata fomula ceil(n / 3) * 4.

Maudhui ya vitu vikubwa vinaweza kuonekana kwa madhumuni ya kutatua matatizo kwa kutumia:

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

Kutumia lo_creat & Base64

Ili kuhifadhi data ya binary, LOID kwanza inaundwa:

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

Katika hali zinazohitaji udhibiti sahihi, kama vile kuchexploit SQL Injection ya Kipofu, lo_create inapendelewa kwa kutoa LOID iliyowekwa.

Vipande vya data vinaweza kisha kuingizwa kama ifuatavyo:

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

Kuhamisha na huenda kufuta kipengee kikubwa baada ya matumizi:

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

Kutumia lo_import & Hex

Kazi ya lo_import inaweza kutumika kuunda na kutoa LOID kwa kipengele kikubwa:

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

Baada ya kuundwa kwa kitu, data inaingizwa kwa kila ukurasa, ikihakikisha kila kipande hakizidi 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;

Kukamilisha mchakato huo, data inaexportiwa na kifaa kikubwa kinafutwa:

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

Vizuizi

Imejulikana kuwa vitu vikubwa vinaweza kuwa na ACLs (Orodha za Kudhibiti Upatikanaji), ambazo zinaweza kuzuia upatikanaji hata kwa vitu vilivyoundwa na mtumiaji wako. Walakini, vitu vya zamani na ACLs zenye ruhusa zinaweza bado kupatikana kwa ajili ya kuiba maudhui.

Last updated