Dompurify 3.0.10 bypass - Confusion nodeName and CDATA
22 mai 2024
Cet article se base sur les recherches de RyotaK (https://flatt.tech/research/posts/bypassing-dompurify-with-good-old-xml/).
Confusion nodeName
Il est recommandé de consulter l'article précédent intitulé Dompurify 3.0.9 bypass - Node type confusion, avant de poursuivre la lecture.
La version 3.0.9 de Dompurify présente une vulnérabilité de contournement lorsqu'un contenu XML utilisant l'interface ProcessingInstruction
est utilisé dans une page HTML. La version 3.0.10 corrige ce problème en ajoutant le masque SHOW_PROCESSING_INSTRUCTION
lors du traitement des nœuds XML, permettant ainsi leur prise en compte.
Pour rappel, le format d'une telle instruction est le suivant :
Et l'exploitation de la vulnérabilité peut s'effectuer de cette manière :
Puisque la version 3.0.9 de Dompurify n'analyse pas les instructions de traitement (processing instructions), et que l'interface le permet, l'utilisateur peut librement définir la cible (target
) :
Provoquant l'affichage de la boîte de dialogue :
Grâce au correctif, la version 3.0.10 de Dompurify analyse dorénavent les noeuds de type ProcessingInstruction
.
Lorsque Dompurify analyse une balise, la bibliothèque d'assainissement récupère tout d'abord le nom de la balise à analyser en accédant à la propriété nodeName
:
Puis vérifie que la balise rencontrée soit autorisée :
Par défaut, les balises autorisées sont les suivantes :
Pour un noeud de type ProcessingInstructions
, la propriété nodeName
retourne la valeur de la cible (target
). Ainsi, pour contourner l'assainissement effectué par Dompurify en version 3.0.10, il suffit de renseigner une cible (target
) présente dans la liste de balises autorisées, par exemple <abbr>
(ou <img>
comme l'a fait l'auteur de l'article originel) :
Character data (CDATA)
CDATA
est une section dans un document XML où les données sont traitées comme du texte brut, ce qui signifie que les balises et les entités spéciales à l'intérieur de cette section ne sont pas interprétées comme du code XML mais comme du texte. Cela permet d'inclure des caractères qui pourraient autrement être interprétés comme des balises ou des entités XML.
Une section CDATA
commence par <![CDATA[
et se termine par ]]>
. Voici un exemple :
Le contournement de la version 3.0.9 était dû à l'absence de filtre pour prendre en compte l'interface ProcessingInstruction
. Il en va de même pour les sections CDATA
:
A noter que la variante suivante semble fonctionner également :
Corrections
Concernant l'interface ProcessingInstruction
, Dompurify 3.0.11 a décidé de supprimer toutes les occurrences d'instructions de traitement :
Pour les sections CDATA
, l'ajout du filtre NodeFilter.SHOW_CDATA_SECTION
permet de détecter correctement leur utilisation. Étant donné que la valeur de la propriété nodeName
d'une telle section est #cdata-section
, qui n'est pas une balise autorisée par défaut, le contournement n'est plus possible.
Labs
Afin de tester et d'exploiter ce contournement, une image Docker est disponible ici.
Dernière mise à jour