Sécurité et Audit d'application WEB



Étapes d’un audit d’application WEB :

  1. Identification de la version du serveur WEB;
  2. Identification de la plateforme utilisée (Content Management System et Langage) utilisé ;
  3. Identification des failles associées à la plateforme ;
  4. Cartographie du site (identification des fichiers et de la base de données) ;
  5. Vérification des méthodes et technologies de transfert d’informations ;
  6. Identification des failles communes ;
  7. Analyse du code source pour identification des erreurs de conceptions restantes.

La majeure partie des failles de Sécurité Web provient d’erreur de développement.

Identification du serveur

1. Identifier le type et la version du serveur

  • Avec Telnet ou ncat : telnet 192.168.0.1 80
    HEAD / HTTP/1.0
    On peut aussi utiliser une erreur pour charger une page : GEE / JOJO/5.0 ou GET / HTTP/1.0
    Par message d’erreur en demandant une page inexistante : GET /toto/titi.asp HTTP/1.0
  • Avec Nmap : nmap -sV -p 80 -vvv 192.168.0.1
  • Avec Nikto : nikto -h www.google.fr -findonly
  • Avec Wget : wget -S –spider www.google.fr
  • Avec Httprint, par statistique sur la réponse : httprint -h http://www.google.fr -s signature.txt
  • Par technologie : ASP.NET = IIS
  • Par historique Internet : http://toolbar.netcraft.com/site_report?url=http://www.google.fr

2. Identification de la plate forme utilisée (CMS et Langage)


3. Identification des failles liées à la plateforme


4. Cartographie du site


5. Vérification des méthodes et technologies de transfert d’informations :

  • Vérifier que ces méthodes soient désactivées : OPTIONS, PUT, CONNECT, DELETE et TRACE
  • Utilisation d’un proxy HTTP/HTTPS : Zap ou Burp
  • Par défaut un URL de type http://www.google.fr/search?hl=fr&q=test montre l’utilisation de méthode GET (paramètres séparés par &).
  • Vérifier les fichier de style (CSS), javascripts (JS), et défaut (phpinfo.php, /admin:. . .).
  • Vérifier la verbosité des messages d’erreur.

6. Identification des failles communes

Failles de sécurité : développement

  • XSS (Cross-Site Scripting) : Permet à un utilisateur de faire exécuter du javascript à une page vue par un autre utilisateur.
  • CSRF/XSRF (Cross-Site Request Forgery) : Utilise les droit de l’utilisateur consultant une page pour lui faire exécuter une tâche grâce au javascript.
  • XSSI (Cross Site Script Inclusion) : Variante du XSRF qui permet d’inclure un fichier à exécuter sur une page.
  • Injection SQL : Correspond à envoyer des données non prévues à une page, afin de s’authentifier, ou effectuer des tâches sur la base de données.
  • Faille include : Inclusion d’un fichier pour exécution sur un serveur de notre code.
  • Failles de sécurité : serveur/navigateur WEB
  • Path Traversal : Consiste à essayer d’accéder à des fichiers normalement inatteignables (fichiers système, configuration, mots de passe) en essayant de remonter dans l’arborescence.
  • Data tampering : Utilisation du Path Traversal pour remplacer un fichier (par exemple système) lors d’un upload de fichier sur un serveur.
  • Code Execution : Attaque utilisant une faiblesse du navigateur WEB pour exécuter du code sur la machine client.

Failles de sécurité : technologies

  • AJAX (Asynchronous JavaScript And XML) : Moyen de dialogue utilisant les technologies HTML/XHTML, XML, CSS, DOM, Javascript, XMLHttpRequest, peut permettre l’exploitation de failles (DOS, Phishing, integer overflow. . .).
  • ISAPI (Internet Server Application Programming Interface) : Interface de programmation (ou API) de l’application IIS de Microsoft, fonctionne comme un langage de page dynamique de type PHP, ASP, CGI, sous forme de DLL.
  • SWF (ShockWave Flash) : application flash décompilable, pouvant comporter des mots de passe et être vulnérable.

Outils gratuits pour l’identification et l’exploitation de vulnérabilité


7. Analyse du code source pour identification des erreurs de conceptions restantes.

Configuration

  • Rendre anonyme la bannière de connexion du serveur et des services.
  • Personnaliser les messages d’erreurs et limiter au strict minimum les informations transmises.
  • Protéger le serveur WEB par un pare-feu ou un reverse-proxy de type Apache+ModSecurity, avec des règles de filtrage éprouvées, le mode Apache mod_rewrite permet aussi d’implémenter l’URL Rewriting.
  • Supprimer les fichiers inutiles (exemples : info.php, phpinfo.php).
  • Mettre à jour le serveur Web et les modules Web installés.

Base de données

  • Renommer la base de données, les comptes et tables par défaut.
  • Appliquer des droits sur la base de données et sauvegarder les mots de passe sous forme de hash.
  • Utiliser des comptes utilisateurs SQL à accès limité (en lecture seule) quand cela est possible.
  • Utiliser des procédures stockées, à la place du SQL dynamique. Les données entrées par l’utilisateur sont alors transmises comme paramètres, limitant ainsi les risques d’injection.
  • Utiliser des requêtes SQL préparées (requêtes à trous envoyées au serveur, qui se charge d’échapper les caractères selon le type de paramètre).
  • Effectuer un contrôle des requêtes en limitant les droits aux commandes telles que EXEC, SELECT, INSERT, DROP, CREATE, ALTER, UPDATE…

Requêtes et variables

  • Vérifier le lien de référence (referrer) contenu dans les requêtes (compliquer à implémenter).
  • Tester systématiquement les valeurs transmises : $_GET$_POST$_COOKIE$_REQUESTAJAX
  • Préférer l’envoi des données via la méthode $_POST plutôt que $_GET.
  • Ne pas utiliser $_REQUEST (permet l’utilisation du même paramètre en $_GET et $_POST).
  • S’assurer à chaque requête de l’authentification de l’utilisateur et que l’action correspond à ses droits.
  • Les cookies et numéros de session doivent avoir une limite de validité.
  • Ne jamais transmettre de données confidentielles aux clients (son numéro de client dans l’URL. . .).
  • Utiliser l’attribut .innerText au lieu de .innerHtml afin de se protéger contre les XSS, n’utiliser .innerHtml que pour de l’affichage HTML (technologie AJAX).
  • Vérifier le type et la validité des variables à exploiter isset()is_numeric()ereg()filter_var()filter_input()filter_var_array() ou filter_input_array().
  • Utiliser la fonction PHP mysql_real_escape_string() ou addslashes() (depuis PHP6 les Magic Quotes ont disparus) qui permet de convertir les caractères non standards ( » devient n »).
  • Désactiver les Magic Quotes qui sont insuffisantes contre les injections (et inutiles en cas d’exploitation de pages externes) et qui utilisent trop de ressources (voir fichier php.ini magic_quotes_gpc = Off).
  • Pour afficher une variable, utiliser systématiquement : htmlspecialchars(...,ENT_QUOT) qui permet de convertir les caractères en HTML et de se protéger contre des failles XSS.
  • Dans les messages des forums désactiver l’utilisation du javascript.
  • Désactiver allow_url_include pour évitr les failles include (inclusion de fichiers distants).
  • En cas d’utilisation de technologie AJAX (XmlHttpRequest), encoder les données transmises (escape()encodeURI()encodeURIComponent()).
  • Toujours prévoir un historique des traitements effectués (avec : requête, compte, IP, date et heure).

Posts les plus consultés de ce blog

Guide pas à pas de la gestion de l’impression dans Windows Server 2008