Big Binary Files Upload (PostgreSQL)

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

PostgreSQL Μεγάλα Αντικείμενα

Η PostgreSQL προσφέρει μια δομή που ονομάζεται μεγάλα αντικείμενα, προσβάσιμα μέσω του πίνακα pg_largeobject, σχεδιασμένη για την αποθήκευση μεγάλων τύπων δεδομένων, όπως εικόνες ή έγγραφα PDF. Αυτή η προσέγγιση είναι προτιμότερη από τη λειτουργία COPY TO, καθώς επιτρέπει την εξαγωγή των δεδομένων πίσω στο σύστημα αρχείων, εξασφαλίζοντας έναν ακριβή αντίγραφο του αρχικού αρχείου.

Για να αποθηκεύσετε ένα πλήρες αρχείο μέσα σε αυτόν τον πίνακα, πρέπει να δημιουργηθεί ένα αντικείμενο στον πίνακα pg_largeobject (που αναγνωρίζεται από ένα LOID), ακολουθούμενο από την εισαγωγή κομματιών δεδομένων, κάθε ένα μεγέθους 2KB, σε αυτό το αντικείμενο. Είναι κρίσιμο αυτά τα κομμάτια να έχουν ακριβώς μέγεθος 2KB (με την πιθανή εξαίρεση του τελευταίου κομματιού) για να εξασφαλιστεί η σωστή λειτουργία της λειτουργίας εξαγωγής.

Για να διαιρέσετε τα δυαδικά δεδομένα σας σε κομμάτια 2KB, μπορείτε να εκτελέσετε τις παρακάτω εντολές:

split -b 2048 your_file # Creates 2KB sized files

Για την κωδικοποίηση κάθε αρχείου σε Base64 ή Hex, μπορούν να χρησιμοποιηθούν οι παρακάτω εντολές:

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

Σημαντικό: Κατά την αυτοματοποίηση αυτής της διαδικασίας, βεβαιωθείτε ότι στέλνετε κομμάτια των 2KB από καθαρό κείμενο. Τα αρχεία με κωδικοποίηση σε δεκαεξαδική μορφή θα απαιτούν 4KB δεδομένων ανά κομμάτι λόγω της διπλασιασμένης μεγέθυνσης, ενώ τα αρχεία με κωδικοποίηση Base64 ακολουθούν τον τύπο ceil(n / 3) * 4.

Τα περιεχόμενα των μεγάλων αντικειμένων μπορούν να προβληθούν για σκοπούς εντοπισμού σφαλμάτων χρησιμοποιώντας:

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

Χρήση της lo_creat & Base64

Για να αποθηκεύσετε δυαδικά δεδομένα, πρέπει πρώτα να δημιουργήσετε ένα 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

Σε περιπτώσεις που απαιτείται ακριβής έλεγχος, όπως η εκμετάλλευση ενός Blind SQL Injection, προτιμάται η χρήση της lo_create για τον καθορισμό ενός σταθερού LOID.

Οι τμήματα δεδομένων μπορούν να εισαχθούν ως εξής:

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

Για να εξαγάγετε και πιθανώς να διαγράψετε το μεγάλο αντικείμενο μετά τη χρήση:

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

Χρήση της lo_import & Hex

Η συνάρτηση lo_import μπορεί να χρησιμοποιηθεί για τη δημιουργία και καθορισμό ενός LOID για ένα μεγάλο αντικείμενο:

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

Μετά τη δημιουργία του αντικειμένου, εισάγεται δεδομένα ανά σελίδα, εξασφαλίζοντας ότι κάθε τμήμα δεν υπερβαίνει τα 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;

Για να ολοκληρωθεί η διαδικασία, τα δεδομένα εξάγονται και το μεγάλο αντικείμενο διαγράφεται:

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

Περιορισμοί

Σημειώνεται ότι τα μεγάλα αντικείμενα μπορεί να έχουν ACLs (Λίστες Ελέγχου Πρόσβασης), περιορίζοντας πιθανώς την πρόσβαση ακόμη και σε αντικείμενα που δημιουργήθηκαν από τον χρήστη σας. Ωστόσο, παλαιότερα αντικείμενα με ευέλικτα ACLs ενδέχεται να είναι ακόμη προσβάσιμα για την εξαγωγή περιεχομένου.

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated