tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
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のクリアテキストバイトのチャンクを送信することを確認してください。16進数エンコードされたファイルはサイズが倍になるため、チャンクごとに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
制限事項
大きなオブジェクトにはACL(アクセス制御リスト)がある可能性があり、ユーザーが作成したオブジェクトへのアクセスが制限されることがあります。ただし、緩やかなACLを持つ古いオブジェクトは、コンテンツの抽出のために引き続きアクセス可能である場合があります。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。