Commit bcb21bb2 authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

js xss csrf

parent 6bc57aab
......@@ -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">
......
......@@ -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>
......@@ -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
......
......@@ -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 ...
......
......@@ -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>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment