Les bonnes pratiques du développement d'applications spécifiques

XSS, SQL Injection,... Les failles de sécurité des applications Web avec ou sans framework PHP ! - (S01E01)

Posted by JÉRÔME AUGÉ on 30 mars 2016 11:30:00
Find me on:

Dans cette série d'articles, je vais vous présenter quelques failles classiques dans les applications Web/HTML, et quels mécanismes utiliser, ou précautions à prendre, pour s'en prémunir. Ceci est valable que vous utilisiez ou non, un framework PHP. Pour commencer cette série, je vais vous présenter le cross-site scripting (abrégé XSS).

web-app-security.jpg

Vous êtes sur un blog de bonnes pratiques de développement, cette série d'article s'adresse donc en priorité à des personnes familières du développement d'application web : développeur, chef de projet, ingé sys et autre devops. C'est pourquoi je ne m'attarderais pas sur les concepts de base.

Cross-site scripting sur une web-app

Vous le savez surement, le cross-site scripting (XSS) est un type de faille de sécurité qui permet à un utilisateur malveillant (l'attaqueur), authentifié ou non, d'insérer du code HTML et/ou Javascript dans les pages produites par le serveur Web.

Le but est généralement de faire qu'un utilisateur lambda qui consulterait cette page, visualiserait ou exécuterait alors le code malveillant inséré par l'attaqueur. Le résultat peut aller du vol de l'identifiant de session au phishing en prétendant être une interface légitime du site web afin d'obtenir la saisie d'informations sensibles de la part de cet utilisateur.

L'exemple classique est une interface de recherche qui afficherait les termes recherchés, en plus du résultat de la recherche, sous cette forme :

printf("<p>Recherche de %s</p>", $_GET['query']);

Dans ce cas, si la page est appellée avec un argument GET "query" contenant la chaîne "<script>alert('XSS')</script>", alors la page affichera le contenu suivant :

<p>Recherche de <script>alert('XSS')</p></p>

On comprend alors aisement, que le contenu de l'arguement GET "query" apparaît tel quel dans le code HTML de la page, et qu'il sera alors interprété et exécuté par le navigateur qui chargerait cette page.

L'utilisateur malveillant n'aura plus alors qu'a diffuser l'URL de la recherche (e.g. "http://www.example.net/search?q=<script>codeMalveillant();...</script>") à des utilisateurs cibles qui lorsqu'ils cliqueront sur l'URL seront amenés sur cette page qui leur fera exécuter le code Javascript malveillant composé par l'attaquant.

Pour se prémunir contre ce type de faille, il faut généralement identifier le contexte dans lequel la valeur sera affichée, et échapper les caractères de la valeur qui rentreraient en conflit avec la structure de ce contexte.

Pour notre exemple précédent, on est dans un fragment HTML et on souhaite que la valeur ne soit pas interprétée comme du HTML. Pour cela, on pourra échapper les caractères reservés de HTML (ex. échapper le caractère "<" en entité HTML "&gt;", etc.) à l'aide de la fonction PHP htmlspecialchars() afin qu'ils ne soient pas interprétés par le navigateur :

printf("<p>Recherche de %s</p>", htmlspecialchars($_GET['query'], ENT_QUOTES));

On obtiendra alors la page suivante, qui ne déclenchera pas l'exécution du code contenu dans la chaîne fournie en entrée :

<p>Recherche de &lt;script&gt;alert(&#039;XSS&#039;)&lt;/script&gt;</p>

Quand vous utilisez les mécanismes de Vue spécifique de document de Dynacase pour faire un rendu HTML, vous pouvez utiliser la méthode Layout::eSet(), en lieu et place de Layout::set(), afin d'échapper automatiquement les caractères sensibles HTML :

$action->lay->eSet('PRENOM', $doc->getRawValue('US_FNAME'));
$action->lay->eSet('NOM', $doc->getRawValue('US_LNAME'));

Cette méthodeLayout::eSet() est aussi utilisable lors du rendu d'un template ODT pour échapper cette fois les caractères reservés de XML.

Dans un prochain article nous ferons la connaissance de Robert, alias "Little Bobby Table".

Pour aller plus loin :

 

Si vous avez aimé cet article et que vous ne voulez pas manquer les prochains,
abonnez-vous ci-dessous : 

 

Topics: Application métier, Développement spécifique, Développement PHP, Application d'entreprise