2010-09-29 4 views
2

Cette question était auparavant asked and answered correctement, mais il ne semblait pas y avoir de solution postée.Fracture de trame uniquement inter-domaine mais pas pour les iframes de la même origine?

Si un site a iframes, et veut empêcher ceux d'être enfermé dans un cadre d'un autre domaine, cadre busting simpliste ne sera pas utile:

<script>if (top != self) top.location = location</script> 

Cependant, depuis les scripts inter-cadres à d'autres domaines devraient générer des exceptions, quelque chose comme cela semble bien fonctionner à l'intérieur de l'iframe:

<script> 
try { 
    if (window.document.domain != top.document.domain) { // throws exception 
    throw "You naughty puppy!"; // Should not ever get here, right? 
    } 
} 
catch() { 
    top.location = "/error/naughtypuppy"; 
} 
</script> 

le if ci-dessus devrait être assez seul pour empêcher le cadrage inter-domaines des iframes. Il devrait seulement retourner false ou lancer une exception, alors de toute façon le script pourrait atteindre l'instruction throw dans un navigateur?

Est-ce que cela suffirait à empêcher le tramage uniquement à partir d'autres domaines?

<script> 
try { 
    var bogus = top.document.domain; 
} 
catch() { 
    top.location = "/error/naughtypuppy"; 
} 
</script> 

Edit: Une solution similaire est fait allusion ici, mais on ne se baserait pas sur le cadre parent d'inclure le code de cadre busting. Detect when iframe is cross-domain, then bust out of it. Essentiellement la même solution que "essayer d'accéder à l'autre image et bust si une exception se produit."

+0

Ah, il y a une réponse déjà: http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it – jbindel

+0

La réponse dans mon commentaire précédent ne serait pas exactement travailler cependant. Le code malveillant ne va pas inclure 'onload =" checkForCross() "' quand il charge le cadre, il serait donc préférable d'inclure la fonction checkForCross sur la page child.html plutôt que sur le cadre parent. – jbindel

+0

Je suppose que je vais considérer ma solution la bonne, alors. – jbindel

Répondre

2

Ce code est vulnérable à une forme d'attaque qui tire parti de la fonction « onbeforeunload ». La page parent (evil) configure un gestionnaire d'intervalle (qui est invulnérable à votre code, en raison de la différence de domaine) et un gestionnaire "onbeforeunload". Le deuxième gestionnaire met à jour juste une variable globale (également invulnérable) pour enregistrer le fait que la fenêtre est "attaquée", puis le temporisateur d'intervalle (s'exécutant assez rapidement pour pouvoir être actif avant que le navigateur ait complété la fenêtre externe mise à jour à votre URL légitime) apparaît et met à jour window.location pour pointer vers une URL contrôlée par l'attaquant qui renvoie une réponse no-op 204. Le navigateur oublie votre requête HTTP et "met à jour" la fenêtre à partir de cette nouvelle transaction initiée par le gestionnaire d'intervalle.

est ici le plus SO question: Frame Buster Buster ... buster code needed

+0

Ah, donc le correctif n'essaie pas de définir l'emplacement. Au lieu de cela, il suffit d'ouvrir une alerte de sécurité, que bien sûr l'utilisateur ignorera. – jbindel

+0

Mais je pense que la vérification d'erreur ci-dessus est correcte ('var bogus = top.document.domain;').Seule la manipulation est susceptible de la même manière que la solution simpliste (OWASP) est susceptible. – jbindel

+0

Oui, il n'y a rien de mal avec le code ici. Notez également que le comportement du navigateur utilisé dans cette attaque peut facilement être corrigé à un moment donné dans les navigateurs modernes (si ce n'est déjà fait, j'ai du mal à faire succomber Chrome, mais je ne suis pas sûr que je sois bien faire les choses). – Pointy

1

J'ai un site qui a encore des cadres et je ne peux pas les enlever pour l'instant. Ce fut la meilleure solution que j'ai pu trouver:

<style>html { display:none }</style> 
<script> 
if (self == top) { 
    document.documentElement.style.display = 'block'; 
} else { 
    top.location = self.location; 
} 
</script> 

A partir de ce lien: XFS 101-cross-frame-scripting-explained

Sur la base d'une présentation de: OWASP_AppSec_Research_2010_Busting_Frame_Busting_by_Rydstedt

Voici un plus mis à jour OWASP Clickjacking page

+0

Ceci n'est pas une réponse à la question. Il demande comment empêcher l'encadrement d'origine croisée tout en permettant la même origine. –

Questions connexes