• Aucun résultat trouvé

Aide à la Détection de Faiblesse d'un site web

N/A
N/A
Protected

Academic year: 2022

Partager "Aide à la Détection de Faiblesse d'un site web"

Copied!
42
0
0

Texte intégral

(1)

1

Journée RAISIN 15/10/2009

Restitution de la formation ADF dispensée par l'UREC

Fabrice.Mendes@dr15.cnrs.fr

Développeur d'application web

Aide à la Détection de Faiblesse

d'un site web

(2)

ADF : plan

Introduction

Contexte

Principales attaques

ASR : défenses passives

ASR : défenses actives

DÉV : de bonnes pratiques

Conclusion

Nota : défenses passives : génériques et statiques, pas

(3)

3

ADF : introduction

À qui s'adresse cette reconstitution ?

Aux développeurs

Aux ASR qui adaptent des outils web

Aux ASR en blackbox

Défauts de cette présentation ?

Rapide survol

Pas de solution magique

Exemples autour de LAMP

(4)

ADF : contexte

Ne pas sous-estimer les enjeux :

Les sites web sont des portes d'entrées sur des SI internes parfois vitaux (confidentialité)

La réputation de l'établissement est une denrée critique

(5)

5

ADF : contexte

Ne pas sous-estimer les enjeux :

Les sites web sont des portes d'entrées...

La réputation de l'établissement...

Ne pas sous-estimer les méchants :

La cyberdélinquance ne dort jamais

Extrême professionnalisation de la cybercriminalité

Moisson de données : vol ou crypto-chantage

Squat : phishing, vente de pilules magiques

Location de botnets

All your base are belong to us...

(6)

ADF : Principales attaques

Les principales attaques :

SysCall non contrôlés et Server Side Include

Traversée de répertoire

SQL Injections

XSS

CSRF

(7)

7

ADF : principales attaques

Appels système naïf :

Server Side Include

(8)

ADF : principales attaques

Traversée de répertoire (

directory traversal

)

Exemple wikipedia

(9)

9

ADF : Principales attaques

SQL Injection

SQL Injection courante de bribe de requête

Truc

'or 1=1 –

=> BINGO !

Ne se limite pas aux commentaires... Union

Permet de contourner des protections, lire, détruire...

Permet la prise d'empreinte du SGBDR

Même quand les messages erreurs sont filtrés il est possible d'extorquer des informations grâce au (deep) blind SQL injection.

S'en protéger correctement n'est pas aisé !

(10)

ADF : Principales attaques

XSS ou Cross Site Scripting :

Comment ça marche et pourquoi...

Pour voler des cookies et donc une session

Rediriger vers un site frauduleux (phishing (cas de hotmail le 01/10/2009 ??))

<IMG SRC=JaVaScRiPt:alert('XSS')>

<IMG """><SCRIPT>alert("XSS")</SCRIPT>">

<IMG

SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&

#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83

;&#83;&#39;&#41;>

<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>

title body div img iframe href= etc.

(11)

11

ADF : Principales attaques

CSRF : Cross Site Request Forgery

(12)

ADF : Principales attaques

CSRF : Cross Site Request Forgery

Une attaque élégante, sans code « hostile »

Difficilement décelable par l'internaute victime

Difficilement décelable par le site victime si pas de contre-mesures

Avec un peu d'imagination le potentiel est énorme :

Accès informations bancaire, réaliser un paiement ?

Accès à l'infrastructure interne :

- Application ultra-sensible qu'on croyait bien au chaud ex Sirhus

- Accès aux interfaces d'administration d'éléments réseau (box)

Heureusement

le méchant n'a pas forcément de retour

Des contre-mesures simples peuvent être insérées dans le code

(13)

13

ADF : défenses passives

Scénario de l'ASR en boîte noire (hébergeur) :

Définition et maîtrise du périmètre

S'approprier la configuration du serveur www

Gestion de l'Espace Web Total

Raffiner les droits et les accès du serveur

Ajout de « gardes »

Un mandataire

Un mandataire filtrant

(14)

ADF : défenses passives

S'approprier la configuration du serveur www

Comprendre la structure de la configuration Apache

Les sections et la syntaxe (directory, files, location, virtualhosts, limit) + inclusion de fichier .conf

Les priorités (par ordre croissant)

- <directory> et .htaccess

- <DirectoryMatch>

- <Files> et <FilesMatch>

- <Location> et <LocationMatch>

Pour des sections de même hiérarchie : ordre d'apparition

/!\ La directive AllowOverride peut permettre à l'hébergé de baisser le niveau de sécurité du serveur /!\

(15)

15

ADF : défenses passives

Configuration Apache (suite) :

Espace Web Total =

{DocumentRoot VH} + {UserDirVH} + {Alias}+{symlinks}

Gérés par les sysadmin, par les webmasters

Raffiner les droits du serveur Apache :

Compte dédié

Vérifier et limiter les répertoires en écriture voire chrooter

Brider les possibilités des modules/interpréteurs (cf ci-après)

Séparer les services : hôte virtuel et/ou machine virtuelle

Pour aller plus loin, utiliser un RBAC :

- SELinux : complexe, frein à l'évolution

- AppArmor : plus limité que SELinux mais bien plus simple

(16)

ADF : défenses passives

Configuration Apache (suite) :

Logger... logger... logger

Limiter la fuite d'information due aux affichages des messages d'erreur auprès de l'internaute (en prod)

Se méfier des Handlers de multi-suffixes « .php.fr » ou sans suffixe « password.inc »

logger...

(17)

17

ADF : défenses passives

Conclusion sur Apache

Assez souple et complexe à la fois. Il faut un peu de temps pour le maîtriser

Peu s'avérer un faux ami :

Règle écrasée par un .htaccess ou autre section

.htaccess piraté et contenant une rewrite rule pernicieuse

La configuration par défaut est assez satisfaisante et la documentation sur la sécurité abondante

(18)

ADF : PHP

Durcir la configuration PHP :

Bannir php3 et register_globals (existe encore ?)

Utiliser le safe_mode si possible mais ce n'est pas suffisant !

Interdire les inclusions d'URL allow_url_include et allow_url_fopen...

Suppression magic_quotes_gpc

open_basedir

Pas de message d'erreur : display_errors

disable_functions (eval) disable_classes

dl() hardening

(19)

19

ADF : PHP

Durcir PHP :

Limiter les risques : suExecPHP permet d'avoir un UID par vhost

Patch Suhoshin

Protection du moteur PHP (accès mémoire)

Runtime protection (include, vhosts)

Fonctionnalités de filtrage

Protection transparente des cookies et sessions (chiffrement, anti-hijack)

Fonctionnalités de journalisation

(20)

ADF : Mandataire

Rôle d'un mandataire (proxy)

Le mandataire peut stocker les réponses pour lees retransmettre directement à la prochaine requête identique. (cache)

Filtrage applicatif : il peut supprimer un contenu non autorisé ou hostile dans sa réponse au client

Anonymat/sécurisation du réseau

Journalisation des requêtes (LCEN)

Implémentations connues : Squid, Apache, SSH (pouvant implémenter SOCK5)

(21)

21

ADF : Mandataire

Rôle d'un mandataire (proxy)

(22)

ADF : Mandataire

Rôle d'un mandataire inverse (reverse proxy)

(23)

23

ADF : Mandataire

Rôle d'un mandataire inverse (reverse proxy)

Point d'entrée unique (un seul port 80 à ouvrir vers l'Internet) => journalisation plus efficace ou pas

Accélération de requêtes aux sites dynamiques (Zope)

Répartition de charge entre plusieurs serveurs web

Cloisonnement des services web (wiki, cms, agenda)

Filtrage et réécritures des requêtes (=> protection en amont contres les failles)

Occultation de la topologie interne du réseau et

« enfouissement » des serveurs web et des bases de données.

(24)

ADF : Mandataire

Inconvénients d'un mandataire inverse

Point d'entrée unique => s'il faillit, tous les sites tombent

Complexification du réseau

Rupture des communications HTTPS qui ne peuvent plus se faire de bout en bout (par ailleurs problème de https et virtual host)

Gestion des redirections fastidieuse et source d'erreur

(25)

25

ADF : mandataire

Apache en mandataire inverse

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so ProxyRequests Off

<Proxy *>

Order deny,allow Allow from all

</Proxy>

ProxyPass /wiki http://wiki.monlabo.interne

ProxyPassReverse /wiki http://wiki.monlabo.interne ProxyPass /cms http://cms.monlabo.interne

ProxyPassReverse /cms http://cms.monlabo.interne

www.monlabo.fr/cms

(26)

ADF : mandataire

Pour les cas plus complexes : mod_rewrite

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule rewrite_module modules/mod_rewrite.so

RewriteEngine On

RewriteRule ^/wiki/(.*)http://wiki.monlabo.interne/$1 [P]

ProxyPassReverse /wiki http://wiki.monlabo.interne

RewriteRule ^/cms/(.*) http://cms.monlabo.interne/$1 [P]

ProxyPassReverse /cms http://cms.monlabo.interne

(27)

27

ADF : mandataire filtrant

mod_security est un module pare-feu applicatif d'Apache. Il protège les sites web d'une collection d'attaques classiques.

D'un abord assez rugueux il fournit de base un

ensemble de règles très efficace mais quelque

peu consommateur de ressources.

(28)

ADF : mandataire filtrant

5 phases pour tout changer

Entre l'entête et le corps

Après le corps requête

Avant en-tête réponse

Avant corps réponse

Durant log

« Empower users to do what

(29)

29

ADF : mandataire filtrant

mod_security permet de :

Détecter des violations du protocole HTTP

Réagir aux anomalies comme l'absence du UA ou de la clause Accept

Bloquer des robots

Se protéger d'un coup contre un lot d'attaques génériques :

Injections PHP

Injections SQL

Exposition de fichiers sensibles

Filoutage sur l'encodage des caractères

Bloquer le dépôt de chevaux de Troie sur le serveur

Jouer avec les crawlers

(30)

ADF : mandataire filtrant

mod_security va plus loin !

On peut protéger une application contre une injection SQL en créant une liste blanche de valeurs pour id (valeur entière)

http://site.org/appli/index.php?id=3

SecRule ARGS:id "!(^[0-9]*$)" log,deny,status:403

http://site.org/appli/index.php?file=home.php

SecRule ARGS:file "!(^(home|liens)\.php$)"

log,deny,status:403

(31)

31

ADF : mandataire filtrant

Un WAF permet donc de protéger une application même en blackbox

Les WAF sont en plein essor mais déjà attaqués

Wafw00f

Waffun

WIMP (Wafs are for Idiots Management Person)

(32)

ADF : défenses actives

Audit « passif » : analyse du code

Rats : analyse PHP mais aussi d'autres langages.

Fork de rats : spike_phpSecAudit

Pas d'analyse très fine (grep-like) mais permet de mettre le doigt rapidement sur les parties à code dangereux (recherche de fonctions). Fait ressortir le code dupliqué.

Ne tient pas compte de la configuration du

serveur, du code mort ou obscurci.

(33)

33

ADF : défenses actives

Audit « actif » : attaque du site web

Wapiti

Nikto

Webfuzzer

Webscan

Principes :

Renvois des valeurs d'attaques connues

Renvois des valeurs aléatoires (fuzzing)

Recherche d'outils connus pour des faiblesses

(34)

ADF : défenses actives

Audit « actif » : Conclusion :

Wapiti : très convaincant sur un formulaire très simple, beaucoup moins sur une application en ligne qui fait un minimum de tests (application non blindée).

Tests longs souvent pour pas grand-chose.

Nécessite des sites de test car risque de crash

=> si on peut, il vaut mieux éprouver des formulaires représentatifs de l'application à tester que toute

l'application. Ce n'est pas « parfait » mais au moins on avance.

Faire du googlehacking contre soi peut-être tout aussi instructif

(35)

35

ADF : de bonnes pratiques

Pour les développeurs, les quasi-lois :

Réduire les angles d'attaque : tout filtrer, tout assainir.

Ne jamais faire confiance à la moindre donnée externe (GET/POST/COOKIE)

N'autoriser que les variables attendues et en vérifier la validité

Mettre dans le DR que le strict nécessaire. « include » du reste toujours possible...

Ne mettre dans l'espace de prod que le strict

nécessaire (pas de scripts puissants mais non filtrés de bricolage)

Limiter les espaces rw et les placer hors DR

Gestion intelligente des erreurs (log, pas echo)

Accès en aux données sensibles (mdp) que par authentification forte (mdp ou email fixe).

(36)

ADF : de bonnes pratiques

Les recommandations fortes :

Limiter l'accès aux populations concernées si possible

Renouveler très souvent les SessionID (chaque fois)

Pas de formulaire sans jeton anti-CSRF

Attention aux race-conditions sur les fichiers générés et leurs droits d'accès

Limiter les dégâts en cas de compromission (pas de stockage de mot de passe en clair par ex)

Favoriser l'usage de frameworks éprouvés (synfony, RoR)

Tests Unitaires !

Envisager la sécurité dès le départ et toujours y songer (se défier des logs produits si on les consulte par le web)

(37)

37

ADF : conclusion

De nos jours, les machines sont une denrée très précieuse

Cette présentation est trop rapide, des solutions ne sont d'effleurer du bouts de lèvres

Les sujets sont assez vastes, rien ne vaut la pratique

La sécurité est souvent la laissée pour compte !

Ne laissez pas ces informations s'envoler...

(38)

Références

À retrouver sur le web

Apache

http://math.univ-angers.fr/~charbonnel

http://httpd.apache.org/docs/2.2/misc/security_tips.html

PHP

« Forum PHP 2007, Audit de code, retour d'expérience », Nicolas Collignon et Louis Nyffenegger

« State of the Art Post Exploitation in Hardened PHP Environments », Stefan Esser, Blackhat USA2009

WAF

« Web Application Firewall (WAF) », Sébastien Gioria, FRHACK, Besançon le 7 septembre 2009

(39)

39

Références

Les documentations officielles de

PHP (sécurité)

MySQL sont une bonne base

(40)

ADF

ANNEXES

(41)

41

ADF : annexe Wapiti 1-2

http://wapiti.sourceforge.net/example.txt

First I use getcookie.py to login in the restricted area and get the cookie in cookies.txt

bash-3.0$ python getcookie.py cookies.txt http://127.0.0.1/vuln/?page=login Please enter values for the folling form :

url = http://127.0.0.1/vuln/login.php login (on) : toto

password (on) : toto

0 : <Cookie PHPSESSID=8qte5k7jr6ogkocrlcrk9obmj2 for 127.0.0.1/>

Then I scan the vuln website using the cookie and excluding the logout script bash-3.0$ python wapiti.py http://127.0.0.1/vuln/ -c cookies.txt -x

http://127.0.0.1/vuln/index.php?page=logout ...

Attacking urls (GET)...

---

Warning fread (article) in http://127.0.0.1/vuln/

Evil url: http://127.0.0.1/vuln/?article=http%3A%2F%2Fwww.google.fr

%2F&page=articles

(42)

ADF : annexe Wapiti 2-2

Attacking forms (POST)...

--- SQL Injection found with

http://127.0.0.1/vuln/login.php

and params = login=%27% 22%2&password=on

coming from http://127.0.0.1/vuln/?page=login SQL Injection found with

http://127.0.0.1/vuln/login.php

and params = login=on&password=%27%22%28

coming from http://127.0.0.1/vuln/?page=login

Références

Documents relatifs

● Le serveur « interroge » le site concerné par la

Les élèves ne disposant pour l’instant que d’informations qualitatives sur l’énergie potentielle et l’énergie cinétique d’un système, le but de

marge brute – remise – prix d’achat net – prix de vente hors taxe – coût d’achat prix de vente toute taxe comprise – prix d’achat net – frais d’achat – prix

* Détermination de la graduation 100 : on plonge le réservoir du thermomètre dans de l’eau en ébullition sous la pression atmosphérique normale.. Le liquide dans le capillaire

De nombreuses approches ont été développées pour améliorer la détection des anomalies à l’aide de méthodes de statistiques ou d’exploration de données (data mining).

Generally, in order to locate legitimate scripts in the original Web application, it is advisable to utilize a simi- lar mechanism as the JavaScript detection component later used

Ce scénario décrit les processus qui surviennent lors des interventions de maintenance précédant généralement un avis de panne pour un objet technique (vous avez également

Elle est d’autant plus importante que la masse de la charge est grande et s’oppose à la mise en mouvement. Elle est caractérisée par le moment d’inertie J, qui s’exprime en