{{#include ../../../banners/hacktricks-training.md}} ### 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. Vir **die stoor van 'n volledige lêer** 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 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 binêre data** in 2KB stukke te verdeel, kan die volgende opdragte uitgevoer word: ```bash 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: ```bash base64 -w 0 # Encodes in Base64 in one line xxd -ps -c 99999999999 # 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: ```sql select loid, pageno, encode(data, 'escape') from pg_largeobject; ``` #### Gebruik `lo_creat` & Base64 Om binêre data te stoor, word 'n LOID eers geskep: ```sql 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: ```sql INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 0, decode('', 'base64')); INSERT INTO pg_largeobject (loid, pageno, data) VALUES (173454, 1, decode('', 'base64')); ``` Om die groot objek na gebruik te voer en moontlik te verwyder: ```sql SELECT lo_export(173454, '/tmp/your_file'); SELECT lo_unlink(173454); -- Deletes the specified large object ``` #### Gebruik `lo_import` & Hex Die `lo_import` funksie kan gebruik word om 'n LOID vir 'n groot objek te skep en te spesifiseer: ```sql 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: ```sql update pg_largeobject set data=decode('', 'hex') where loid=173454 and pageno=0; update pg_largeobject set data=decode('', 'hex') where loid=173454 and pageno=1; ``` Om die proses te voltooi, word die data uitgevoer en die groot objek verwyder: ```sql select lo_export(173454, '/path/to/your_file'); select lo_unlink(173454); -- Deletes the specified large object ``` ### Beperkings Daar word opgemerk dat **groot voorwerpe moontlik ACL's** (Toegangsbeheerlisensies) 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. {{#include ../../../banners/hacktricks-training.md}}