Skip to content
Snippets Groups Projects
Commit bcb21bb2 authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

js xss csrf

parent 6bc57aab
No related branches found
No related tags found
No related merge requests found
...@@ -29,16 +29,16 @@ Tags: cours ...@@ -29,16 +29,16 @@ Tags: cours
* [Upload](slides/1337/upload.htm) * [Upload](slides/1337/upload.htm)
* [LFI_RFI](slides/1337/fi.htm) * [LFI_RFI](slides/1337/fi.htm)
* [XSS](https://doc.m4z3.me/_/1337/XSS.htm) * [XSS](slides/1337/xss.html)
* [CSRF](https://doc.m4z3.me/_/1337/CSRF.htm) * [CSRF](slides/1337/csrf.html)
* [SQLi](https://doc.m4z3.me/_/1337/SQLi.htm) * [SQLi](slides/1337/sqli.htm)
* [Drupalgeddon](https://doc.m4z3.me/_/1337/drupalgeddon.htm) * [Drupalgeddon](slides/1337/drupalgeddon.htm!)
* Se protéger * Se protéger
* [Top10](https://doc.m4z3.me/_/1337/top10.htm) * [Top10](slides/1337/top10.htm)
* [anticiper](https://doc.m4z3.me/_/1337/anticiper.htm) * [anticiper](slides/1337/anticiper.htm)
* [réagir](https://doc.m4z3.me/_/gdi/cnrs.htm#/cover) * [réagir](slides/gdi/cnrs.htm#/cover)
<div class="panel panel-success"> <div class="panel panel-success">
......
...@@ -66,5 +66,29 @@ ...@@ -66,5 +66,29 @@
] ]
}); });
</script> </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> </body>
</html> </html>
...@@ -244,8 +244,7 @@ allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2 ...@@ -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) ## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php)
* résout le problème du partage de PHP * senser résoudre le problème du partage de PHP en environnement mutualisé
* environnement mutualisé
* déprécié en 5.3 * déprécié en 5.3
* supprimé depuis 5.4 * supprimé depuis 5.4
* approche non réaliste * approche non réaliste
......
...@@ -49,7 +49,7 @@ Note: ...@@ -49,7 +49,7 @@ Note:
## requête HTTP de la vraie vie ## requête HTTP de la vraie vie
<pre><code data-trim> ```http
GET / HTTP/1.1 GET / HTTP/1.1
Host: perdu.com Host: perdu.com
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0 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" ...@@ -62,7 +62,7 @@ If-None-Match: "cc-480d5dd98a340"
Cache-Control: max-age=0 Cache-Control: max-age=0
useless data useless data
</code></pre> ```
Connaissez vous Burp Suite? Connaissez vous Burp Suite?
...@@ -110,8 +110,7 @@ composée ...@@ -110,8 +110,7 @@ composée
## réponse HTTP de la vraie vie ## réponse HTTP de la vraie vie
<pre> ```http
<code data-trim>
HTTP/1.1 304 Not Modified HTTP/1.1 304 Not Modified
Date: Fri, 20 Feb 2015 15:15:01 GMT Date: Fri, 20 Feb 2015 15:15:01 GMT
Server: Apache Server: Apache
...@@ -120,16 +119,15 @@ Keep-Alive: timeout=2, max=100 ...@@ -120,16 +119,15 @@ Keep-Alive: timeout=2, max=100
Etag: "cc-480d5dd98a340" Etag: "cc-480d5dd98a340"
Vary: Accept-Encoding Vary: Accept-Encoding
&#x3C;html&#x3E; <html>
&#x3C;head&#x3E;&#x3C;title&#x3E;Vous Etes Perdu ?&#x3C;/title&#x3E;&#x3C;/head&#x3E; <head><title>Vous Etes Perdu ?</title></head>
&#x3C;body&#x3E; <body>
&#x3C;h1&#x3E;Perdu sur l&#x27;Internet ?&#x3C;/h1&#x3E; <h1>Perdu sur l&#x27;Internet ?</h1>
&#x3C;h2&#x3E;Pas de panique, on va vous aider&#x3C;/h2&#x3E; <h2>Pas de panique, on va vous aider</h2>
&#x3C;strong&#x3E;* &#x3C;----- vous êtes ici &#x3C;/strong&#x3E; <strong>* <----- vous êtes ici </strong>
&#x3C;/body&#x3E; </body>
&#x3C;/html&#x3E; </html>
</code> ```
</pre>
Note: Note:
- Notez le header server qui donne déjà de l'information utile - Notez le header server qui donne déjà de l'information utile
...@@ -216,6 +214,39 @@ Note: ...@@ -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 - 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__" ## HTTP est "__stateless__"
![alt text](images/http/stateless.jpg "Stateless") ![alt text](images/http/stateless.jpg "Stateless")
...@@ -229,12 +260,18 @@ Note: ...@@ -229,12 +260,18 @@ Note:
* introduits par Netscape en 1994 pour fiabiliser l'implémentation du panier d'achat virtuel * 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 * 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] [; domain=domain_name][; path=some_path][; secure]
[; HttpOnly] [; HttpOnly]
</code></pre> ```
* renvoyés inchangés par le client à chaque requête * 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 ## les cookies
...@@ -258,55 +295,20 @@ Note: ...@@ -258,55 +295,20 @@ Note:
* transimission de l'ID de session uniquement * transimission de l'ID de session uniquement
<pre><code data-trim> ```http
Cookie: PHPSESSID=hr0ms75gs6f7vlph0hhct2bjj3 Cookie: PHPSESSID=hr0ms75gs6f7vlph0hhct2bjj3
</code></pre> ```
* accessibles via __$_SESSION__ en _PHP_ * accessibles via __$_SESSION__ en _PHP_
## [__SOP__ Same Origin Policy](https://developer.mozilla.org/fr/docs/Web/JavaScript/) ## local storage
* 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>
### serveur * un peu comme les cookies MAIS
<pre><code data-trim> * données gérées coté client uniquement
Access-Control-Allow-Origin: http://www.foo.com * transmise par js via api ou via le cookie
</code></pre> * 5MB / domaine contre 4096bytes pour le cookie
* supprimable uniquement via js
* <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
## header, cookie, body, query string, script ... ## header, cookie, body, query string, script ...
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
Architecture Architecture
<ul> <ul>
<li><a href="1337/http.html">http</a> / <a href="privacy/tls.html#/0/52">https</a></li> <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> </ul>
</li> </li>
<li> <li>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment