Défi javascript

Messages postés
1
Date d'inscription
samedi 11 novembre 2006
Statut
Membre
Dernière intervention
13 novembre 2006
-
Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
-
Bonjour a tous,

je suis tombé il y a peu sur un "challenge javascript" : un système d'authentification login/password qui protége une page donc. Le but étant d'acceder à la page bien sur.

J'ai quelques questions pour les experts:

phrase=prompt("Une phrase : ");
bcd=phrase.substr(2);

Avec ces deux lignes du dessus, existe t'il une chaine de caractère (très astucieuse certainement) supérieur a 5 caractères qui réponde à la condition suivante :

if(bcd == "yte")

?

Voici le code du challenge et pourquoi je vous pose cette question :

<script type="text/javascript">
        function p(a,i,c) {
                var x=a.charCodeAt(i)+c;
                return String.fromCharCode(x);
        }

        m="Wrong, wrong, totally wrong :)";
        phrase=prompt("Starting easy (maybe). Enter a passphrase");
        if (phrase.length<5 || phrase.length>50) phrase="abrakadabra";
        bcl=bcI=bc1=p(phrase,3,-2)+p(phrase,1,-4)+p(phrase,4,15)+p(phrase,2,-17);
        bcd=phrase.substr(2);
        bcI+=p(phrase,0,-74);
        xx=p(phrase,5%phrase.length,-65)+p(phrase,6%phrase.length,-58);
        yy=p(phrase,7%phrase.length,-22)+p(phrase,8%phrase.length,-5);
        t=parseInt(p(phrase,5%phrase.length,-66),10);
        bd='<script t'+bcd+'="text/javascript">   \
        function che'+yy+'() {   \
                var name,pass,abc=new Array(14,29,26,15,'+xx+'),ok;   \
                name=document.getElementById(\'idname\').value;   \
                pass=document.getElementById(\'idpass\').value;   \
                ++t;   \
                ok=0;   \
                for (i=0; i<name.le'+bcl+'; ++i) if
(name.charCodeAt(i)^pass.charCodeAt(i)==abc[i%abc.length]) ++ok;   \
                if (ok!=5) return;   \
                if (name.charAt(name.le'+bc1+'-1)!="g") return;   \
                if (pass.charAt(pass.length-1)!="e") return;   \
                if (((name.le'+bcI+'^pass.le'+bcl+')!=3) return;   \
                if
(name.charAt(1)+pass.charAt(0)+name.charAt(3)+pass.charAt(2)!="rynu")
return;   \
                if (name.le'+bcl+'*(pass.le'+bcI+'>34) return;   \
                m="Very well. You\'ve got it. Add \'?name="+name+"&amp;pass="+pass+"\'
(without quotes) to the url";   \
                if (t>1) { // you don\'t have many attempts...\n  \
                        m="Wrong, wrong, totally wrong :)";\n   \
                }   \
        }\n</script'+'>';
        document.write(bd);
</script>
<center>
<form action="" method="get"
onsubmit="window.setTimeout('alert(m);',500);
window.setTimeout('check();',10); return false;">
        Name: 

        Pass: &amp;nbsp

        

        
</form>


L'auteur du challenge, a donné des indices essentiels et vrais :

- le "passphrase" (variable phrase) a une longueur supérieur à 5, contient au moins un espace, et génére un script sans erreurs (execute la fonction check() entre autre).
- En entrant la bonne combinaison passphrase&pass&username , on est automatiquement redirigé vers la page de vérification, comment est ce possible avec ce code? c'est la le point très important.

J'ai essayé tout ce que je sais, j'ai trouvé bien entendu une valeur pour la passphrase, qui génére un code sans erreurs, en l'occurence "skype", mais comme le dit l'auteur cela ne me permet pas de faire une éventuelle "redirection" plus tard et la passphrase ne contient pas d'espaces et fait 5 caractères, donc ce n'est pas ca.

Ce défi m'obsede tellement, que je suis pret à rémunérer celui qui resoudra ce problème (pas grand chose bien sur), voila ceux qui ont des idées je serai ravi de les entendre.

Merci beaucoup.
Bonne soirée a tous.

4 réponses

Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

Je te confirme que la phrase est bien "skype ".
Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
3
Salut pourrais-tu donner l'adresse du site où tu as trouvé ca??

Car ce que je peux te dire c'est qu'il n'y a aucune redirection automatique. En fait ce que moi je pense
c'est qu'il faut entrer le passphrase ( skype fonctionne ) et ensuite il faut mettre un login et mot de passe puis après ca nous envoie une alerte en nous disant si c'est ok ou pas.

Et puis le fait que le passphrase contient au moins un espace ne sert strictement a rien car il n'y a aucun test sur ca.
Le passphrase ne sert seulement qu'à générer la fonction check().
Ensuite ... chose totalement inutile il faut ecrire un login et un pass et cliquer sur le bouton login et si la combinaison est bonne ca nous renvoie une alert en nous disant de rajouter a l'url les élements &name=...&pass=...
Il n'y vraiment aucune utilité car ce n'est pas du tout sécurisé ( contrairement a un enregistrement dans une base de données )

Voila donc pour avoir plus d'informations je veux bien aller voir le site où tu as vu ca.

Pour information j'ai décoder le login et le pass mais je te les donnerai après avoir vu le site si cela te convient.

J'attends ta réponse

-- The Rubik's Man --
Messages postés
1251
Date d'inscription
mercredi 7 août 2002
Statut
Modérateur
Dernière intervention
10 avril 2013

rubiks,

à mon avis ça vient d'un site comme 2enigmatik4u
Je n'ai pas poussé l'analyse du check mais dans "abc=new Array(14,29,26,15,'+xx+')," on utilise xx qui découle quand même sur la longueur de la phrase, cela peut influencer la valeur de login et password.

Nickadele
----------------------------------------------
non, ma belle ne s'appel pas Adèle
Messages postés
224
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
6 juin 2007
3
Oui mais si tu regardes un peu plus prés tu vois que la variable bcd doit etre " ype " pour que ca fasse "<script type="text....."
et cette variable est créée par " phrase.substr(2); " donc le passphrase ne peux pas faire plus de 5 caracteres... et doit se terminer par " ype ".

de plus c'est sur que les 2 premiers caractères sont " sk " (voir les calculs permettant d'obtenir " ck " pour faire le nom "check"

Par contre je suis sur que l'auteur a fait ce code en introduisant une erreur qui fait que sans changer quelque chose c'est impossible de valider la fonction meme si on a trouvé le bon login et mot de passe.

Le probleme vient de la variable t !! car au départ avec le passphrase skype la valeur est a 1 puis ensuite la variable est incrémentée donc est égale à 2.... et donc la condition " if (t>1)" est vraie et donc ca ne marche pas... meme si on a le bon couple login / pass.
Donc ce qu'il faut changer c'est :
t=parseInt(p(phrase,5%phrase.length,-66),10); => t=parseInt(p(phrase,5%phrase.length,-66),10) - 1;

Voila et maintenant essayez avec :
      passphrase : skype
      login : youare
      pass : wrong

il fallait une petite heure de calcul sur le code pour déchiffrer la combinaison

Si vous avez des questions... n'hésitez pas

-- The Rubik's Man --