Sécurité PHP. FaillesUpload



Documents pareils
TP JAVASCRIPT OMI4 TP5 SRC

Stockage du fichier dans une table mysql:

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Mise en place d un serveur Proxy sous Ubuntu / Debian

Protection des protocoles

Démonstration de la mise en cache via HTML 5 sur iphone

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Programmation Web. Madalina Croitoru IUT Montpellier

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Failles des applications Web. Ce document est extrait du travail de diplôme de M. DIZON dans l état.

Remote Cookies Stealing SIWAR JENHANI (RT4) SOUHIR FARES (RT4)

Les solutions de paiement CyberMUT (Crédit Mutuel) et CIC. Qui contacter pour commencer la mise en place d une configuration de test?

Attaques applicatives

MANUEL D INSTALLATION D UN PROXY

SQUID Configuration et administration d un proxy

Formulaire pour envoyer un mail

Techniques de Programmation pour Internet

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Administration du site

CREATION WEB DYNAMIQUE

Mandataires, caches et filtres

Technologies du Web. Créer et héberger un site Web. Pierre Senellart. Page 1 / 26 Licence de droits d usage

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

Créer un site Web : mode d emploi Sous SPIP, avec le squelette «établissement» de l académie de Versailles

AWS avancé. Surveiller votre utilisation d EC2

TP Service HTTP Serveur Apache Linux Debian

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

PLUGINS Guide du Développeur STEPHANE FERRARI. P l u X m l 5.4

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

Performance, rendement Vs Evolutivité

CHAPITRE 11. Temps réel Remy Sharp

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Analyse statique de code dans un cycle de développement Web Retour d'expérience

Paginer les données côté serveur, mettre en cache côté client

Langage SQL : créer et interroger une base

PHP 5.4 Développez un site web dynamique et interactif

Vulnérabilités et sécurisation des applications Web

Installation / Sauvegarde Restauration / Mise à jour

Création d un «Web Worm»

Installation d OwnCloud 8.0 sous Debian Avec connexion des utilisateurs active directory et mise en place de HTTPS

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

\ \ / \ / / \/ ~ \/ _ \\ \ ` \ Y ( <_> ) \ / /\ _ / \ / / \/ \/ \/ Team

Transférer des fichiers à l aide de WinSCP et 2 contextes d utilisation dans des sites SPIP avec FCK editor

Impact des robots d indexation sur le cache de second niveau de SPIP IMBERTI Christophe - SG/SPSSI/CP2I/DO Ouest 06/06/2012 mis à jour le 05/07/2012

FORMATION / CREATION DE SITE WEB / 4 JOURNEES Sessions Octobre 2006

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

Groupe Eyrolles, 2003, ISBN : X

Editer un script de configuration automatique du proxy

GlobalScape Secure FTP Server Buffer Overflow

JAB, une backdoor pour réseau Win32 inconnu

Découverte d aesecure. Par Christophe Avonture, développeur d aesecure

REPARTITION DE CHARGE LINUX

PHP 4 PARTIE : BASE DE DONNEES

Command Execution: File Inclusion : SQL injection :... 10

Attaques de type. Brandon Petty

INF8007 Langages de script

Mise en oeuvre d un intranet à partir de logiciels Open Source avec intégration des certificats numériques et login unique

WEB APPLICATION FIREWALL AVEC APACHE ET MOD_SECURITY

Le serveur web Apache

Sécurité des applications web. Daniel Boteanu

Manuel d'utilisation de l'administration du site Japo.ch - 1

Sommaire. 1 Introduction Présentation du logiciel de commerce électronique 23

Table des matières. 1 À propos de ce manuel Icônes utilisées dans ce manuel Public visé Commentaires...

Présentation Serveur Apache et pour RePeGlio

Note de synthèse. Développement web sur le CMS Prestashop. Stage du 17 mai au 25 juin Entreprise decoratzia.com 15 rue Erlanger Paris

INTRODUCTION AU CMS MODX

Module http MMS AllMySMS.com Manuel d intégration

Sécurité des applications Retour d'expérience

SERVEUR HTTP Administration d apache

Manuel d'installation

Sécuriser les applications web de l entreprise

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Comparatif CMS. Laurent BAUREN S Bérenger VIDAL Julie NOVI Tautu IENFA

Sommaire Accès via un formulaire d'identification... 4 Accès en mode SSO... 5 Quels Identifiant / mot de passe utiliser?... 6

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

Mysql avec EasyPhp. 1 er mars 2006

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Optimiser les images pour l affichage sur votre site

ADF 2009 Sécurisation d applications PHP/MySQL

Programmation Web TP1 - HTML

Programmation Web. Introduction

Aide à la Détection de Faiblesses d un site Web Mandataire inverse, Modsecurity

Diffuser un contenu sur Internet : notions de base... 13

Bernard Lecomte. Débuter avec HTML

Initiation à linfographie

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Rapport de projet Site web pour une association

Guide d'installation sous Windows

SUPPORT DE COURS / PHP PARTIE 3

Les risques HERVE SCHAUER HSC

Expérience d un hébergeur public dans la sécurisation des sites Web, CCK. Hinda Feriani Ghariani Samedi 2 avril 2005 Hammamet

Transcription:

Sécurité PHP FaillesUpload

Table des matières Introduction...... 3 L upload de fichiers......... 3 Protections coté client...... 4 Protections coté serveur... 5 1. Vérification du type de contenu...... 5 2. Filtrage par extension...... 7 3. Filtrage avec getimagesize()... 9 4..htaccess......... 11 Contre-mesures......... 13 Quelques suggestions...... 13 Conclusion......... 5 2

Introduction Toutes les fonctions WEB d upload de fichiers sont potentiellement vulnérables. L expérience nous montre que régulièrement ces fonctions ne sont pas correctement sécurisées, particulièrement dans certains espaces d administration ou les développeurs sont plus laxistes avec la sécurité. Ces failles sont pourtant très dangereuses et systématiquement testées par les attaquants désireux de prendre le contrôle du site Internet cible. Dans cet article nous aborderons plusieurs exemples de vulnérabilités afin de comprendre comment un auditeur ou pirate pourra les contourner, puis nous terminerons par un exemple de code propre et sécurisé. Les risques liés auxfaillesupload Upload d une backdoor (porte dérobée) Ecrasement de fichiers L upload de fichiers Voici un exemple de code HTML et PHP d upload de fichierssans restrictions pour que les néophytes comprennent le principe. Notez qu il faudra les droits en écriture pour que l on puisse importer des fichiers dans le dossier «images». upload.php <html> <h1>upload image</h1> <formenctype="multipart/form-data" a" method="post" action="upload.php"> <p> <label>image</label> <input type="file" name="image"> <br /><br /> <input class="button" type="submit"> </p> </form> 3

<?php if (isset($_files["image"]) == true) $dir = "./images/"; $file = $dir.basename($_files["image"]["name"]); if (file_exists($file) == true) print "Erreur! Fichier existant."; if (move_uploaded_file($_files["image"]["tmp_name"], $file)) print "Fichier upload : <a href='". $file. "'>ici</a>"; else print "Erreur! Fichier non upload";?> Protections coté client Les restrictions coté client sont les plus facile à contourner, on peut les trouver en HTML ou en JavaScript, par exemple : <input type="hidden" name="max_file_size" value="1000" /> Cette ligne ajoutée dans le formulairehtmlest un champ caché (hidden)) qui limitera la taille du fichier à uploader à 1000 octets. Pour contourner les protections coté client il ya plusieurs méthodes possible.par exemple nous pouvons enregistrer le formulaire sur notre machine, supprimer les protections, mettre l adresse du site et le chemin de la page PHP dans les champs «action» de «form» créant ainsi notre formulaire sans les restrictions. Il nous restera plus qu à l utiliser. 4

Protections coté serveur Etudions quelques protections PHP afin de voir leurs faiblesses. Dans notre démonstration l objectif étant d envoyer le fichier PHP suivant. test.php <?php print "Je suis interprété par PHP";?> 1. Vérification du type de contenu Le code suivant prend en considération le type de contenu du fichier et n autorise que le contenu de type image/png. upload1.php <?php if (isset($_files["image"])($_files["image"]) == true) $dir = "./images/"; $file = $dir.basename($_files["image"]["name"]); if ($_FILES['image']['type']!= 'image/png') print "Erreur! seul les png sont autorisés."; if (file_exists($file) == true) print "Erreur! Fichier existant."; if (move_uploaded_file($_files["image"]["tmp_name"], $file)) print "Fichier upload : <a href='". $file. "'>ici</a>"; else print "Erreur! Fichier non upload";?> 5

Si l on envoie un fichier PHP nous verrons un message d erreur. Si l on envoie un fichier PNG il sera correctement uploadé. La faille dans cette protection est que le type de contenu est envoyé depuis le client. Par conséquent si nous modifions le type de contenu de notre fichier PHP celui-ci sera uploadé. Pour la démonstration nous allons utiliser le navigateur Firefox avec l add-ontamper Data que vous pourrez trouver à l adresse suivante : https://addons.mozilla.org/fr/firefox/addon/966/ Tamper Data est un outil très pratique lors d un audit, il permet de modifier les données qui sont envoyées du navigateur vers le serveur WEB. Considérons que votre navigateur est sur la page du formulaire d upload et que Tamper Data est lancé et que l altération est démarrée. Choisissonsd envoyernotre otre fichier test.php et regardons les données qui transitent lorsque nous altérons la requête. Dans POST_DATA nous voyons notre fichier test.php et son Content-Type. Il nous suffit de le remplacer par image/png pour pouvoir uploader notre fichier PHP. 6

On valide «OK». Coté serveur le fichier a été accepté. 2. Filtrage par extension Imaginons un code PHP qui vérifie que l extension du fichier uploadé soit parmi les extensions valides (exemple :.jpg,.gif,.png). upload2.php <?php if (isset($_files["image"]) == true) $dir = "./images/"; $file = $dir.basename($_files["image"]["name"]); $whitelist = array (".jpg", ".gif", ".png"); $key = false; foreach ($whitelist as $item) if (preg_match("/$item$/i", $_FILES['image']['name'])) $key = true; break; 7

if ($key == false) print "Erreur! seul les images sont autorisés."; if (file_exists($file) == true) print "Erreur! Fichier existant."; if (move_uploaded_file($_files["image"]["tmp_name"], $file)) print "Fichier upload : <a href='". $file. "'>ici</a>"; else print "Erreur! Fichier non upload";?> La faille cette fois ne vient pas que de notre script, celui se contente de vérifier les extensions et si elles correspondent avec celles de la white list,, le fichier est autorisé. Il arrive que la configuration d Apache avec l utilisation d un code comme celui ci-dessus provoque une faille de sécurité. Quand Apache est configuré pour exécuter un script il y a deux façons de le configurer : en utilisant AddHandler ou AddType. Dans les deux cas si la configuration suivante est utilisée l image sera interprétée. mime.conf AddHandler application/x-httpd-php.gif Ou AddType application/x-httpd-php.gif Ce genre de configuration d Apache est utilisé plus fréquemment que l on pourrait le penser, on peut les trouver par exemple dans le cas de figure où un code PHP génère dynamiquement un graphique. Il ne reste plus qu à modifier l extension de notre fichier test.php en test.gif et le tour est joué. 8

Dans la même catégorie, si le serveur Apache utilise la configuration ci-dessous nous sommes en présence d une autre faille. AddHandlerapplication/x-httpd-php.php Le problème est que tous les fichiers ayant dans leurs noms «.php» seront interprétés par PHP, aussi bien test.php que test.php.gif. Cette fois en renommant notre test.php en test.php.gifnotre fichier passera le script de restriction des extensions et sera interprété avec succès. 3. Filtrage avec getimagesize() La fonction getimagesize() détermine la taille de l'image fournie et en retourner les dimensions, elle peut également retourner plus d'informations comme le type de fichier. Utilisons un script qui vérifie le type de l image avec cette fonction et n autorise que les JPG. upload3.php <?php if (isset($_files["image"]) == true) $dir = "./images/"; $file = $dir.basename($_files["image"]["name"]); $imageinfo = getimagesize($_files['image']['tmp_name']); if ($imageinfo["mime"]!= "image/jpeg") print "Erreur! seul les JPG sont autorisés."; if (file_exists($file) == true) print "Erreur! Fichier existant."; if (move_uploaded_file($_files["image"]["tmp_name"], $file)) 9

?> else print "Fichier upload : <a href='". $file. "'>ici</a>"; print "Erreur! Fichier non upload"; Il ne suffira pas de changer le content-type comme on l a vu précédemment, car cette fonction travaille directement sur le fichier uploadé dans le dossier temporaire. Il va falloir ruser un peu et lui fournir une vraie image pour qu il passe le filtre,cette image aura l extension.php pour que Apache demande a PHP de l interpréter et qu il y ait du code PHP dedans. Procédure : Prenons une image quelconque JPG (nommée images.jpg) Utilisons GIMP pour lui insérer du code PHP (Image > Propriétés de l image > Commentaire) Enregistrons Changeons l extension ension en.php : images.php 10

Le fichier a passé le filtre et est sur le serveur. Voyons le résultat : 4..htaccess Une autre façon de sécuriser l envoi de fichiers et de mettre un.htaccess dans le répertoire d upload qui interdit les extensions de fichiers black listés et n autorise que les extensions de fichiers images white listés. Pour notre démonstration nous utiliserons le.htaccess ci-dessous dans le répertoire images. 11

.htaccess Options -Indexes Options -ExecCGI AddHandlercgi-script.php.php3.php4.phtml.pl.py.jsp.asp.htm.shtml.sh.cgi <Files ^(*.jpeg *.jpg *.png *.gif)> orderdeny,allow deny from all </Files> Ainsi que ce script d upload. upload4.php <?php if (isset($_files["image"]) == true) $dir = "./images/"; $file = $dir.basename($_files["image"]["name"]); if (move_uploaded_file($_files["image"]["tmp_name"], $file)) print "Fichier upload : <a href='". $file. "'>ici</a>"; else print "Erreur! Fichier non upload";?> Nous remarquons qu il n y a plus la vérification qui permet de déterminer si un fichier du même nom que celui à uploader existe déjà. La faille réside dans ce manque de vérification. Il devient alors possible d envoyer un fichier.htaccess qui va écraser celui déjà présent. En créant un.htaccess vierge et en l uploadant celui écrasera l ancien, supprimant les restrictions. Il est maintenant possible d exécuter du PHP dans le répertoire images. 12

Contre-mesures Quelques suggestions Voici quelques conseils, qui vous permettront de sécuriser ces failles : Ne jamais se fier à ce que peut envoyer le client. Vérifier la configuration d Apache afin d agir en conséquence. Ne pas placer le.htaccess dans le répertoire d upload. Ne pas permettre tre l écrasement de fichiers. Générer un nom aléatoire pour le fichier uploadé et enregistrer le nom dans une base de données. Ne pas permettre de voir l index of du répertoire d upload. Assigner les bonnes permissions au répertoire. Vérifier le mime-type avec getimagesize() et l extension du fichier. Conclusion Vous avez pu constater que de mauvaises implémentations de sécurité d upload permettent l exécution de code. Dans le cadre d un audit ou d une attaque une backdoor aurait pu être envoyée. Il est vraiment vital pour la sécurité des données que cette fonctionnalité soit correctement protégée. Guillaume LAUMAILLET 13