NFA017 Web coté serveur


Web et securité

Principes de sécurité

Le monde des bisounours

bisounours

Le monde réel

orcs (dorks?)

Les buts de l'attaquant

burglar

Pourquoi un attaquant cible votre site ?

Outils utilisées par les attaquants

firebug

Toujours supposer que l'attaquant connait votre web et a les même outils que vous

Quelques types d'attaques

burglar

La fuite d'information

information leakage

Lorsque l'attaquant peut examiner des données, fichiers, etc qu'il ne devrait pas être autorisé à voir

Cross-Site Scripting (XSS)

Injection HTML

Quand une faille permet a l'utilisateur d'injecter du code HTML arbitraire dans votre page

question
question

Injection de contenu HTML/CSS

reponse-non-sure.php?question=<b style="color:red">c'est pas juste du texte </b>
				

Cross-site scripting (XSS)

une faille où l'utilisateur est en mesure d'injecter et exécuter du code JavaScript arbitraire dans la page

reponse-non-sure.php?question=<script type='text/javascript'>alert('pouet !');</script>
				

Protection contre les injections HTML / XSS

htmlspecialchars retourne la version HTML échappé d'une chaîne (attention à l'encodage "ISO-8859-1" vs "UTF-8").
  $text = "<p>   toi & moi   </p>";
  $text = <em> htmlspecialchars </em> ($text);
					
						# "&lt;p&gt;toi &amp; moi&lt;/p&gt;"
				

htmlentities est équivalent mais traduit tout les caractères qui ont un équivalent en leur code html (e.g. À devient &Agrave;)

Validation des entrées

Qu'est-ce que la validation de formulaire?

Exemples réél utilisant la validation de formulaire

pole-emploi: verif php
peb:verif JS

Validation coté Client vs. validation coté server

La validation peut être faite:

Exemple de formulaire à valider

<form action="http://foo.com/foo.php" method="get">
	<div>
		nom:  <input name="nom" id="nom" /> <br />
		tel: <input name="tel" id="tel" size="10" maxlength="10" /> <br />
		code postal:   <input name="cp" id="cp" size="5" maxlength="5" /> <br />
		<input type="submit" />
	</div>
</form>
					
nom:
tel:
code postal:

validation basique coté serveur

Rappel: $_REQUEST est un tableau associatif qui contient par défaut le contenu des variables: $_GET, $_POST et $_COOKIE.

$nom  = $_REQUEST["nom"];
$tel = $_REQUEST["tel"];
$cp   = $_REQUEST["cp"];
					if (!$nom || strlen($tel) != 10 || strlen($cp) != 5) {
						print "Erreur nom/tel/cp invalide.";
						}
				

Expressions régulières

/^[a-zA-Z_\-]+@(([a-zA-Z_\-])+\.)+[a-zA-Z]{2,4}$/
				

Expressions régulières en PHP (PDF)

fonction description
preg_match(regex, string) renvoie TRUE si regexp reconnaît (correspond à) string
preg_replace(regex, replacement, string) renvoie une nouvelle chaine ou toutes les sous chaines qui correspondent à regex sont remplacé par replacement
preg_split(regex, string) à partir d'une chaine initiale string, renvoie un tableau de chaine obtenu en la découpant en morceau en utilisant regex comme délimiteur (généralisation de explode)

Validation de formulaire avec des expressions régulières en PHP

$tel = $_REQUEST["tel"];
if (!preg_match("/^[O-9]{10}$/", $tel)) {
	print "Erreur. numéro invalide";
}
				

Expressions régulières de base

/abc/
				

jokers: .

Caractères spéciaux: |, (), \

Quantificateurs: *, +, ?

Autres quantificateurs: {min,max}

Prédicat de position: ^ et $

Ensembles de caractères: []

Intervals : [début-fin]

sequences d'échappement

Exemple d' expression régulière en PHP

					# remplacer les voyelles par des asterix
$str = "the quick    brown        fox";

$str = preg_replace("/[aeiou]/", "*", $str);
					# "th* q**ck    br*wn        f*x"

					# decouper en mot
$words = preg_split("/[ ]+/", $str);
					# ("th*", "q**ck", "br*wn", "f*x")

					# mettre en majuscule les mots qui ont 2 voyelles
						de consecutives
for ($i = 0; $i < count($words); $i++) {
	if (preg_match("/\\*{2,}/", $words[$i])) {
		$words[$i] = strtoupper($words[$i]);
	}
}                        # ("th*", "Q**CK", "br*wn", "f*x")
				

Expressions réguliere en JavaScript

Remplacement de texte en utilisant des expressions régulières

Injection SQL

injection SQL

grades

une faille où l'utilisateur est en mesure d'injecter des données SQL arbitraire dans votre requête

Une attaque par injection SQL

Attention...

bobby tables xkcd comic

Se protéger des injections SQL

mysql::real_escape_string mysqli::real_escape_string
PDO::quote
renvoie une version "SQL-echappé" de la chaine
	  $username = $db->quote($_POST["username"]);
	  $password = $db->quote($_POST["password"]);
	  $query = "SELECT name, ssn, dob FROM users
	  WHERE username = $username AND password = $password";
				

Attaque basées sur les sessions

Attaque de "l'homme du milieu" (Man-in-the-middle: MIM)

man in the middle

quand un "attaquant" écoute votre réseau et lit ou modifie les données

Secure HTTP (HTTPS)

https

Session hijacking

firesheep

Lorsque l'attaquant capture votre ID de session et se fait passer pour vous

Securité des sites web