From bcb21bb279fadf7cbaff404798a51e13304ac827 Mon Sep 17 00:00:00 2001
From: Vincent Mazenod <vmazenod@gmail.com>
Date: Mon, 7 Jan 2019 23:30:23 +0100
Subject: [PATCH] js xss csrf

---
 content/Etudiants/zz2-f5-websec.md |  14 ++--
 content/slides/1337/http.html      |  24 ++++++
 content/slides/1337/md/fi.md       |   3 +-
 content/slides/1337/md/http.md     | 128 +++++++++++++++--------------
 content/slides/index.html          |   1 +
 5 files changed, 98 insertions(+), 72 deletions(-)

diff --git a/content/Etudiants/zz2-f5-websec.md b/content/Etudiants/zz2-f5-websec.md
index 403da54..68086b0 100644
--- a/content/Etudiants/zz2-f5-websec.md
+++ b/content/Etudiants/zz2-f5-websec.md
@@ -29,16 +29,16 @@ Tags: cours
 
     * [Upload](slides/1337/upload.htm)
     * [LFI_RFI](slides/1337/fi.htm)
-    * [XSS](https://doc.m4z3.me/_/1337/XSS.htm)
-    * [CSRF](https://doc.m4z3.me/_/1337/CSRF.htm)
-    * [SQLi](https://doc.m4z3.me/_/1337/SQLi.htm)
-      * [Drupalgeddon](https://doc.m4z3.me/_/1337/drupalgeddon.htm)
+    * [XSS](slides/1337/xss.html)
+    * [CSRF](slides/1337/csrf.html)
+    * [SQLi](slides/1337/sqli.htm)
+      * [Drupalgeddon](slides/1337/drupalgeddon.htm!)
 
 * Se protéger
 
-    * [Top10](https://doc.m4z3.me/_/1337/top10.htm)
-    * [anticiper](https://doc.m4z3.me/_/1337/anticiper.htm)
-    * [réagir](https://doc.m4z3.me/_/gdi/cnrs.htm#/cover)
+    * [Top10](slides/1337/top10.htm)
+    * [anticiper](slides/1337/anticiper.htm)
+    * [réagir](slides/gdi/cnrs.htm#/cover)
 
 
 <div class="panel panel-success">
diff --git a/content/slides/1337/http.html b/content/slides/1337/http.html
index 0a38698..b6f5a99 100644
--- a/content/slides/1337/http.html
+++ b/content/slides/1337/http.html
@@ -66,5 +66,29 @@
         ]
       });
     </script>
+    <script>
+      document.addEventListener('DOMContentLoaded', function () {
+        q = "finger guns"; // search query
+
+        request = new XMLHttpRequest;
+        request.open('GET', 'https://api.giphy.com/v1/gifs/random?api_key=GmPNFEPI5osSNgLf9IcWoq00anejpuQY&tag='+q, true);
+
+        request.onload = function() {
+          if (request.status >= 200 && request.status < 400){
+            data = JSON.parse(request.responseText).data.image_url;
+            document.getElementById("giphyjson").innerHTML = JSON.stringify(JSON.parse(request.responseText), null, 2);
+            document.getElementById("giphyme").innerHTML = '<center><img src = "'+data+'"  title="GIF via Giphy"></center>';
+          } else {
+            console.log('reached giphy, but API returned an error');
+           }
+        };
+
+        request.onerror = function() {
+          console.log('connection error');
+        };
+
+        request.send();
+      });
+      </script>
   </body>
 </html>
diff --git a/content/slides/1337/md/fi.md b/content/slides/1337/md/fi.md
index 9631666..64802ff 100644
--- a/content/slides/1337/md/fi.md
+++ b/content/slides/1337/md/fi.md
@@ -244,8 +244,7 @@ allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
 
 ## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php)
 
-* résout le problème du partage de PHP
-  * environnement mutualisé
+* senser résoudre le problème du partage de PHP en environnement mutualisé
 * déprécié en 5.3
 * supprimé depuis 5.4
 * approche non réaliste
diff --git a/content/slides/1337/md/http.md b/content/slides/1337/md/http.md
index 666d426..f1af617 100644
--- a/content/slides/1337/md/http.md
+++ b/content/slides/1337/md/http.md
@@ -49,7 +49,7 @@ Note:
 
 ## requête HTTP de la vraie vie
 
-<pre><code data-trim>
+```http
 GET / HTTP/1.1
 Host:    perdu.com
 User-Agent:  Mozilla/5.0 (X11; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0
@@ -62,7 +62,7 @@ If-None-Match:   "cc-480d5dd98a340"
 Cache-Control:   max-age=0
 
 useless data
-</code></pre>
+```
 
 Connaissez vous Burp Suite?
 
@@ -110,8 +110,7 @@ composée
 
 ## réponse HTTP de la vraie vie
 
-<pre>
-<code data-trim>
+```http
 HTTP/1.1 304 Not Modified
 Date:    Fri, 20 Feb 2015 15:15:01 GMT
 Server:  Apache
@@ -120,16 +119,15 @@ Keep-Alive:  timeout=2, max=100
 Etag:    "cc-480d5dd98a340"
 Vary:    Accept-Encoding
 
-&#x3C;html&#x3E;
-    &#x3C;head&#x3E;&#x3C;title&#x3E;Vous Etes Perdu ?&#x3C;/title&#x3E;&#x3C;/head&#x3E;
-    &#x3C;body&#x3E;
-        &#x3C;h1&#x3E;Perdu sur l&#x27;Internet ?&#x3C;/h1&#x3E;
-        &#x3C;h2&#x3E;Pas de panique, on va vous aider&#x3C;/h2&#x3E;
-        &#x3C;strong&#x3E;* &#x3C;----- vous êtes ici &#x3C;/strong&#x3E;
-    &#x3C;/body&#x3E;
-&#x3C;/html&#x3E;
-</code>
-</pre>
+<html>
+    <head><title>Vous Etes Perdu ?</title></head>
+    <body>
+        <h1>Perdu sur l&#x27;Internet ?</h1>
+        <h2>Pas de panique, on va vous aider</h2>
+        <strong>* <----- vous êtes ici </strong>
+    </body>
+</html>
+```
 
 Note:
 - Notez le header server qui donne déjà de l'information utile
@@ -216,6 +214,39 @@ Note:
 - on est loin du site web au sens CMS, pourautant ces services sont soumis au mêmes vulnérabilités
 
 
+## Exemple
+
+[https://gist.github.com/nealrs/28dbfe2c74dfdde26a30](https://gist.github.com/nealrs/28dbfe2c74dfdde26a30)
+
+```js
+document.addEventListener('DOMContentLoaded', function () {
+  q = "finger guns";
+  api_key = "crack me!";
+  api_url = "https://api.giphy.com/v1/gifs/random";
+  request = new XMLHttpRequest;
+  request.open('GET', api_url + '?api_key=' + api_key + '&tag='+q, true);
+  request.onload = function() {
+    if (request.status >= 200 && request.status < 400){
+      data = JSON.parse(request.responseText).data.image_url;
+      html_data = '<img src = "' + data + '" title="GIF via Giphy">';
+      document.getElementById("giphyme").innerHTML = html_data;
+    }
+  };
+  request.send();
+});
+```
+
+
+<div id="giphyme"></div>
+
+<pre>
+<div id="giphyjson">
+</code>
+</pre>
+
+* [https://developers.giphy.com/docs/](https://developers.giphy.com/docs/)
+
+
 ## HTTP est "__stateless__"
 
 ![alt text](images/http/stateless.jpg "Stateless")
@@ -229,12 +260,18 @@ Note:
 
 * introduits par Netscape en 1994 pour fiabiliser l'implémentation du panier d'achat virtuel
 * envoyés sous forme d'en tête HTTP par le serveur
-<pre><code class="http">Set-Cookie: name=value[; Max-Age=age][; expires=date]
+
+```http
+Set-Cookie: name=value[; Max-Age=age][; expires=date]
     [; domain=domain_name][; path=some_path][; secure]
     [; HttpOnly]
-</code></pre>
+```
+
 * renvoyés inchangés par le client à chaque requête
-<pre><code class="http">Cookie: name=value</code></pre>
+
+```http
+Cookie: name=value
+```
 
 
 ## les cookies
@@ -254,59 +291,24 @@ Note:
 
 ## les sessions
 
- * données gérées côté serveur
+* données gérées côté serveur
 
-    * transimission de l'ID de session uniquement
+  * transimission de l'ID de session uniquement
 
-<pre><code data-trim>
-    Cookie: PHPSESSID=hr0ms75gs6f7vlph0hhct2bjj3
-</code></pre>
+```http
+Cookie: PHPSESSID=hr0ms75gs6f7vlph0hhct2bjj3
+```
 
  * accessibles via __$_SESSION__ en _PHP_
 
 
-## [__SOP__ Same Origin Policy](https://developer.mozilla.org/fr/docs/Web/JavaScript/)
-
-  * concerne [XMLHttpRequest](https://fr.wikipedia.org/wiki/XMLHttpRequest) / [Ajax](https://fr.wikipedia.org/wiki/Ajax_(informatique%29)
-  * restreint les interactions d'une app web aux ressources ayant la même origine
-    * origine
-      * le protocole
-      * le port (si spécifié)
-      * l'hôte
-
-
-## [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
-
-  * Cross Origin Resource Sharing
-  * contrôler les accès en mode cross-site
-  * effectuer des transferts de données sécurisés
-
-### client
-<pre><code data-trim>
-    Origin: http://www.foo.com
-</code></pre>
+## local storage
 
-### serveur
-<pre><code data-trim>
-    Access-Control-Allow-Origin: http://www.foo.com
-</code></pre>
-
-* <span style="color:red">* </span> dans le cas d'une ressource 100% publique
-
-
-## [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
-
-* autorise tous les verbes HTTP
-* remplace [JSONP](https://en.wikipedia.org/wiki/JSONP)
-  * qui n'autorisait que la méthode GET
-
-[MDN|Contrôle d'accès HTTP](https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS)
-
-Note:
-- l'introduction de cette nouvelle possibilité implique nécessairement que les serveurs doivent gérer de nouvelles entêtes, et doivent renvoyer les ressources avec de nouvelles entêtes également
-- doit être supporté par le navigateur
-- la valeur * est possible mais risquée
-- requêtes simples, pré-vérifiées avec le verbe OPTIONS, avec habilitations en forcant l'envoie du cookie
+* un peu comme les cookies MAIS
+  * données gérées coté client uniquement
+    * transmise par js via api ou via le cookie
+  * 5MB / domaine contre 4096bytes pour le cookie
+  * supprimable uniquement via js
 
 
 ## header, cookie, body, query string, script ...
diff --git a/content/slides/index.html b/content/slides/index.html
index 7f6c9de..e004a7b 100644
--- a/content/slides/index.html
+++ b/content/slides/index.html
@@ -26,6 +26,7 @@
     Architecture
     <ul>
       <li><a href="1337/http.html">http</a> / <a href="privacy/tls.html#/0/52">https</a></li>
+      <li><a href="1337/js.html">JS</a></li>
     </ul>
   </li>
   <li>
-- 
GitLab