Iframes in XSS, CSP and SOP
Iframes in XSS
Il existe 3 façons d'indiquer le contenu d'une page en iframed :
Via
src
en indiquant une URL (l'URL peut être de provenance croisée ou de même origine)Via
src
en indiquant le contenu en utilisant le protocoledata:
Via
srcdoc
en indiquant le contenu
Accès aux variables parent et enfant
Si vous accédez au html précédent via un serveur http (comme python3 -m http.server
), vous remarquerez que tous les scripts seront exécutés (car il n'y a pas de CSP pour l'empêcher). Le parent ne pourra pas accéder à la variable secret
à l'intérieur de n'importe quel iframe et seuls les iframes if2 & if3 (qui sont considérés comme étant du même site) peuvent accéder au secret dans la fenêtre d'origine.
Notez comment if4 est considéré comme ayant une origine null
.
Iframes avec CSP
Veuillez noter que dans les contournements suivants, la réponse à la page incluse ne contient aucun en-tête CSP qui empêche l'exécution de JS.
La valeur self
de script-src
ne permettra pas l'exécution du code JS en utilisant le protocole data:
ou l'attribut srcdoc
.
Cependant, même la valeur none
du CSP permettra l'exécution des iframes qui mettent une URL (complète ou juste le chemin) dans l'attribut src
.
Il est donc possible de contourner le CSP d'une page avec:
Notez comment le CSP précédent autorise uniquement l'exécution du script en ligne.
Cependant, seuls les scripts if1
et if2
vont être exécutés mais seul if1
pourra accéder au secret parent.
Par conséquent, il est possible de contourner un CSP si vous pouvez télécharger un fichier JS sur le serveur et le charger via un iframe même avec script-src 'none'
. Cela peut éventuellement être fait en abusant d'un point de terminaison JSONP du même site.
Vous pouvez tester cela avec le scénario suivant où un cookie est volé même avec script-src 'none'
. Il suffit de lancer l'application et d'y accéder avec votre navigateur:
Autres charges utiles trouvées dans la nature
Iframe sandbox
Le contenu dans un iframe peut être soumis à des restrictions supplémentaires grâce à l'attribut sandbox
. Par défaut, cet attribut n'est pas appliqué, ce qui signifie qu'aucune restriction n'est en place.
Lorsqu'il est utilisé, l'attribut sandbox
impose plusieurs limitations :
Le contenu est traité comme s'il provenait d'une source unique.
Toute tentative de soumission de formulaires est bloquée.
L'exécution de scripts est interdite.
L'accès à certaines APIs est désactivé.
Il empêche les liens d'interagir avec d'autres contextes de navigation.
L'utilisation de plugins via
<embed>
,<object>
,<applet>
, ou des balises similaires est interdite.La navigation du contexte de navigation de niveau supérieur du contenu par le contenu lui-même est empêchée.
Les fonctionnalités déclenchées automatiquement, comme la lecture vidéo ou la mise au point automatique des contrôles de formulaire, sont bloquées.
La valeur de l'attribut peut être laissée vide (sandbox=""
) pour appliquer toutes les restrictions mentionnées ci-dessus. Alternativement, elle peut être définie sur une liste de valeurs spécifiques séparées par des espaces qui exemptent l'iframe de certaines restrictions.
Iframes dans SOP
Consultez les pages suivantes :
Bypassing SOP with Iframes - 1Bypassing SOP with Iframes - 2Blocking main page to steal postmessageSteal postmessage modifying iframe locationLast updated