Tour d'horizon des vulnérabilités web et contremesures communes

21/01/2016

Warning

  • Non exhaustif
  • Enfoncement de portes ouvertes
  • Choix des vulnérabilités arbitraire

Au programme

  1. Qu'est ce que je fous là ?
  2. Côté serveur
  3. Côté utilisateur
  4. Valable des deux côtés
  5. Démo

Qu'est ce que je fous là ?

https://www.flickr.com/photos/nathaninsandiego/4256206760/in/photolist-7u7aZb-iqFb5B-65hYKK-7LurKX-dNffC1-iqFaAv-57Cv1r-7u7bim-nqHpEV-7UGpSk-94vmeq-7LyrPQ-4yrRrn-z5aErc-iqFbje-4FeJ3T-66shNL-dQZP6o-4yw7Jh-dQUfeR-dQZNTu-dQUf6B-dQUfaV-dQZPpS-dQUeWF-qkhKJT-dKwsM1-dTszw8-7wL2oM-7LnZR8-7LnZVD-7xUNuu-66o1Ae-7Lo126-dKwrtd-dSraKe-dKwsjb-8vUZr4-6B6nV9-dQUftp-4hWoCW-dQZNTQ-dQZNQU-dQUf7p-dQUfuX-dQUfn6-dQZNRm-dQUfhi-dQUeYD-dQZNJo

Spoiler

Filtrer, valider, sanitizer toutes vos entrées

C'est tout ?

Soyez stupide !
N'essayez pas d'être malin !

Côté serveur

Injections SQL

						
// FIXME: find a way to escape the flag to prevent mysql injection
//        for now it is not possible but we don't
//        necessarily know who will use this DAO.
						
					

Injections SQL

						
$username = $_GET['name'];
$password = $_GET['password'];
$res = $mysqli->query("SELECT * FROM user WHERE name = '$username'
AND password = '$password'");
						
					

Injections SQL

						
$username = "Le_suisse";
$password = "alpacas_are_not_llamas!";
$res = $mysqli->query("SELECT * FROM user WHERE name = '$username'
AND password = '$password'");
						
					

Injections SQL

						
$username = "Le_suisse";
$password = "alpacas_are_not_llamas!' OR '1'='1";
$res = $mysqli->query("SELECT * FROM user WHERE name = '$username'
AND password = '$password'");
						
					

Injections SQL

						
SELECT * FROM user WHERE name = 'Le_suisse' AND
password = 'alpacas_are_not_llamas!' OR '1'='1';
						
					

Injections SQL

Contremesures

  • Requêtes préparées
  • Whitelisting
  • Utilisateur restreint pour accèder à la DB

Injections de commande

						
$sha1 = $_GET['rev'];
exec('git cat-file -p ' . $sha1, $output);
						
					

Injections de commande

						
$sha1 = '660cd7; chmod -R 777 /';
exec('git cat-file -p ' . $sha1, $output);
						
					

Injections de commande

Contremesures

  • Don't do it?
  • Sanitization

Injections

  • LDAP
  • XML (XPath, XXE)
  • JSON

Authentification et management de session

  • Stockage
  • Taille et entropie token de session
  • Aider vos utilisateurs
  • MFA (RFC4226, RFC6238, FIDO U2F) ?

Côté utilisateur

Cross-site scripting (aka XSS)

						
$html = '<tr>
            <td>'. $this->getLabel() .':</td>
        </tr>';
return $html;
						
					

XSS

						
$html = '<tr>
            <td>'. 'submitted_by' .':</td>
        </tr>';
return $html;
						
					

XSS

						
$html = '<tr>
            <td>'. '<script>alert("Securimag")</script>' .':</td>
        </tr>';
return $html;
						
					

XSS

Contremesures

  • Pas d'insertion de données non traités selon le contexte
  • Moteur de template
  • Flag HTTPOnly sur vos cookies
  • Content Security Policy (CSP) ♥

Cross-Site Request Forgery (aka CSRF)

Non vérification de la légitimité d'une requête avant un changement d'état

CSRF

Contremesures

  • Ajout de «token CSRF»
  • Double submit
  • CAPTCHA, réauthentification

Clickjacking (UI redress attack)

Clickjacking

Contremesures

  • Header X-Frame-Options
  • CSP 1.1+
  • Dernier recours : FrameKiller script

Valable des deux côtés

Surveiller vos dépendances externes

Maintenue et testée !

  • Packages fournies avec le système
  • Composer
  • npm, Bower…

Lisez la doc !

Démo

Questions ?

https://www.flickr.com/photos/stefrobrts/5519001192/