diff --git a/challenges/web/JavaScript/Dockerfile b/challenges/web/JavaScript/Dockerfile
new file mode 100644
index 0000000..2a41af2
--- /dev/null
+++ b/challenges/web/JavaScript/Dockerfile
@@ -0,0 +1 @@
+FROM php:7.4.7-apache
diff --git a/challenges/web/JavaScript/README.md b/challenges/web/JavaScript/README.md
new file mode 100644
index 0000000..d41a405
--- /dev/null
+++ b/challenges/web/JavaScript/README.md
@@ -0,0 +1,18 @@
+# JavaScript
+
+> web
+
+Author: [Simon Thiboutôt (lilc4t)](https://github.com/masterT)
+
+http://127.0.0.1:12001/
+
+## Setup
+
+Requirements:
+- docker
+
+Start:
+
+```shell
+docker-compose up
+```
diff --git a/challenges/web/JavaScript/docker-compose.yml b/challenges/web/JavaScript/docker-compose.yml
new file mode 100644
index 0000000..4a7569d
--- /dev/null
+++ b/challenges/web/JavaScript/docker-compose.yml
@@ -0,0 +1,8 @@
+version: "2"
+services:
+ web:
+ image: php:7.4.7-apache
+ ports:
+ - "12001:80"
+ volumes:
+ - "./src/:/var/www/html"
diff --git a/challenges/web/JavaScript/login-2-source.html b/challenges/web/JavaScript/login-2-source.html
new file mode 100644
index 0000000..71bbc1d
--- /dev/null
+++ b/challenges/web/JavaScript/login-2-source.html
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+ Login 2
+
+
+
+
+
+
+
diff --git a/challenges/web/JavaScript/src/index.html b/challenges/web/JavaScript/src/index.html
new file mode 100644
index 0000000..9834e86
--- /dev/null
+++ b/challenges/web/JavaScript/src/index.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ JavaScript
+
+
+
+
+
+
+
JavaScript
+
The browser's programming language, it's good for many things, but it's code while always be accessible.
+
Challenges
+
+
+
+
+
+
diff --git a/challenges/web/JavaScript/src/login-1.html b/challenges/web/JavaScript/src/login-1.html
new file mode 100644
index 0000000..9e84c4d
--- /dev/null
+++ b/challenges/web/JavaScript/src/login-1.html
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+ Login 1
+
+
+
+
+
+
+
diff --git a/challenges/web/JavaScript/src/login-2.html b/challenges/web/JavaScript/src/login-2.html
new file mode 100644
index 0000000..7745a01
--- /dev/null
+++ b/challenges/web/JavaScript/src/login-2.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+ Login 2
+
+
+
+
+
+
+
diff --git a/challenges/web/JavaScript/writeup.md b/challenges/web/JavaScript/writeup.md
new file mode 100644
index 0000000..71fef98
--- /dev/null
+++ b/challenges/web/JavaScript/writeup.md
@@ -0,0 +1,55 @@
+# Writeup
+
+## Login 1
+
+- `FLAG-e7ebfbb9dcf5cfb60ae1bb59d40f7695`
+
+Pour voir le drapeau il suffit d'évaluer la chaîne de caractères `"\x46\x4c\x41\x47\x2d\x65\x37\x65\x62\x66\x62\x62\x39\x64\x63\x66\x35\x63\x66\x62\x36\x30\x61\x65\x31\x62\x62\x35\x39\x64\x34\x30\x66\x37\x36\x39\x35"` dans la console du navigateur.
+
+## Login 2
+
+- `FLAG-1fbeb0a21f8d1286086ca419079c62f8a`
+
+Avant tout il faut comprendre ce que le code JavaScript fait, pour ce faire on indente correctement le script, puis on renomme les fonctions et variables.
+
+Par la suite il faut programmer une solution qui fait l'inverse de la fonction d'encryption.
+
+Voici une solution qui affiche le drapeau dans la console du navigateur, lorsqu'exécutée dans celle-ci.
+
+```js
+var cipher = "NzE6NzQ6Njc6Nzg6NDM6NTY6OTY6MjoxMDU6Nzo1MzoxMDU6NTA6NTY6OTg6NTE6OTg6ODM6NDg6OTc6NTU6NTQ6NTY6NjU6MTA1OjEwNDo1MDo4Mzo2MTo4OTo1Mjo2NToxMDE6NjU6NTQ6MTEzOjYyOjM";
+var key = "2718587a3f";
+
+function keyValueAt(key, index) {
+ var value;
+ var keyIndex = index % key.length;
+ var integer = parseInt(key[keyIndex]);
+ if (integer && !isNaN(integer)) {
+ value = integer;
+ } else {
+ value = key.charCodeAt(keyIndex);
+ }
+ return value;
+}
+
+function decrypt(key, cipherBase64) {
+ var plaintext = '';
+ var cipher = atob(cipherBase64).split(':');
+
+ for (let i = 0; i < cipher.length; i++) {
+ var code = parseInt(cipher[i]);
+ if (code % 2 == 0) {
+ code = code + 1;
+ } else {
+ code = code - 3;
+ }
+ var char = String.fromCharCode(code ^ keyValueAt(key, i));
+ plaintext += char;
+ }
+
+ return plaintext;
+}
+
+console.log(decrypt(key, cipher));
+```
+