Contexte
Le modèle d'objet de document (DOM), en informatique, est la structure hiérarchique des éléments de la page web telle que perçue par le navigateur. Les développeurs utilisent souvent JavaScript pour accéder et manipuler les objets et les nœuds du DOM ainsi que leurs propriétés. Cependant, si les données manipulées ne sont pas sécurisées, cela peut conduire à des vulnérabilités basées sur DOM.
Les vulnérabilités basées sur DOM se produisent lorsque des sites Web contiennent du code JavaScript qui prend des données potentiellement contrôlables par des attaquants, appelées "sources", et les transmet à des fonctions ou objets potentiellement dangereux, appelés "récepteurs". Par exemple, une source courante est l'URL, que l'on peut accéder avec la propriété location de JavaScript. Les attaquants peuvent construire des liens pour amener les utilisateurs vers des pages web vulnérables, avec une charge utile dans la chaîne de requête de l'URL.
Les sources peuvent inclure la chaîne de requête, les cookies, les messages Web, etc. Les récepteurs comprennent des fonctions telles que eval(), qui traite les arguments comme du code JavaScript, et des objets DOM tels que document.body.innerHTML, qui peut potentiellement permettre à des attaquants d'injecter du code HTML malveillant et d'exécuter du code JavaScript arbitraire.
Pour exploiter ou atténuer les vulnérabilités basées sur DOM, il est important de comprendre le flux de contamination des données de sources aux récepteurs. Les développeurs doivent être conscients des données potentiellement contrôlables par des attaquants et des fonctions ou objets potentiellement dangereux. En adoptant des pratiques de développement sécurisé, les développeurs peuvent éviter ou réduire les risques de vulnérabilités basées sur DOM.
Fondamentalement, les vulnérabilités basées sur DOM surviennent lorsqu'un site Web transmet des données d'une source à un récepteur, qui traite ensuite les données de manière non sécurisée dans le contexte de la session du client.
La source la plus courante est l'URL, à laquelle on accède généralement avec l'objet location. Un attaquant peut construire un lien pour envoyer une victime vers une page vulnérable avec une charge utile dans la chaîne de requête et des portions fragmentées de l'URL. Considérez le code suivant :
goto = location.hash.slice(1)
if (goto.startsWith('https:')) {
location = goto;
}
La redirection ouverte basée sur DOM est une vulnérabilité de sécurité qui peut être exploitée par les attaquants pour rediriger les utilisateurs vers des sites malveillants. Cette vulnérabilité se produit lorsqu'un site Web manipule la propriété location.hash de manière non sécurisée.
La propriété location.hash contient une chaîne de caractères qui suit le symbole "#" dans l'URL. Si l'URL contient un fragment de hachage commençant par "https:", ce code extrait la valeur de la propriété location.hash et la définit comme la propriété location du window. Les attaquants peuvent exploiter cette vulnérabilité en construisant une URL malveillante contenant un fragment de hachage avec des instructions pour rediriger les utilisateurs vers des sites Web malveillants.
https://www.website.com/example#https://www.attacker-user.net
Cette vulnérabilité est appelée "redirection ouverte" car elle permet à un attaquant de rediriger les utilisateurs vers des sites Web malveillants en exploitant les failles de sécurité du site Web ciblé. Les attaquants peuvent utiliser cette vulnérabilité pour voler des informations sensibles telles que les noms d'utilisateur, les mots de passe, les informations de carte de crédit, etc.
Sources communes
document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
Database
Sinks communes
Voici une liste qui donne un aperçu rapide des vulnérabilités courantes basées sur le DOM (Document Object Model) ainsi qu'un exemple de "puits" pouvant mener à chaque vulnérabilité. Pour consulter une liste plus exhaustive des différents "puits" pertinents, nous vous invitons à vous référer aux pages spécifiques aux vulnérabilités en cliquant sur les liens ci-dessous.
Vulnérabilité basée sur DOM | Exemple |
---|---|
DOM XSS | document.write() |
Open redirection | window.location |
Cookie manipulation | document.cookie |
JavaScript injection | eval() |
Document-domain manipulation | document.domain |
WebSocket-URL poisoning | WebSocket() |
Link manipulation | element.src |
Web message manipulation | element.src |
Link manipulation | postMessage() |
Ajax request-header manipulation | setRequestHeader() |
Local file-path manipulation | FileReader.readAsText() |
Client-side SQL injection | ExecuteSql() |
HTML5-storage manipulation | sessionStorage.setItem() |
Client-side XPath injection | document.evaluate() |
DOM-data manipulation | element.setAttribute( |
Denial of service | RegExp() |
Comment prévenir les vulnérabilités
En matière de sécurité informatique, il n'existe pas de solution miracle pour éliminer complètement la menace des attaques basées sur le DOM (Document Object Model). Cependant, la meilleure façon d'éviter ces vulnérabilités est, en général, de ne pas autoriser les données provenant de sources non fiables à modifier dynamiquement les valeurs transmises à des récepteurs.
Si la fonctionnalité de l'application nécessite néanmoins ce comportement, il est nécessaire de mettre en place des défenses côté client. Dans de nombreux cas, les données pertinentes peuvent être validées en ne permettant que les contenus connus pour être sûrs (liste blanche). Dans d'autres cas, il faudra nettoyer ou encoder les données. Cette tâche peut être complexe et, selon le contexte d'insertion des données, peut impliquer un échappement JavaScript, un encodage HTML et un encodage URL dans un ordre précis.
Pour connaître les mesures à prendre pour prévenir des vulnérabilités spécifiques, il est recommandé de consulter les pages de vulnérabilités correspondantes liées dans le tableau ci-dessus.