injection de code malicieux sur des fichiers images
|
12-01-2015, 21h52
Message : #1
|
|
wass19
Newbie Messages : 18 Sujets : 6 Points: -5 Inscription : Jan 2015 |
injection de code malicieux sur des fichiers images
bonjour
je suis développeur web, et j'ai su recement quon peut injecter un code malicieux (php, javascript, ...) et les uploader en ligne j'utilise bcp le php, et je souhaiterais savoir comment contrer cette attaque existe t'il un script qui analyse le fichier image, et detecte le code par exemple ? j'aimerais si possible apprendre cette technique (je ne cherche pas a faire du mal mais je pense que ça peut servir) et je souhaiterais apprendre a proteger mes sites face a ce genre d'attaques merci de votre aide |
|
12-01-2015, 21h59
Message : #2
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,609 Sujets : 71 Points: 465 Inscription : Jan 2012 |
RE: injection de code malicieux sur des fichiers images
Bonjour,
Tout d'abord ton code PHP ne sera exécuté uniquement si tu fais un include() du fichier (ce qu'il ne faut évidemment pas faire...). Pour lire le contenu de l'image, la fonction file_get_contents ("nom_du_fichier") fera très bien l'affaire et lira le contenu entier du fichier sans chercher à l'interpréter, tandis que le javascript éventuel "contenu" dans une image n'est pas interprété par le navigateur. Ensuite, concernant l'envoi de fichier, le mieux reste encore de vérifier l'extension en autorisant que certaines extensions et en rejetant les autres (pour qu'un attaquant ne puisse pas uploader de fichiers sensibles) ET le type MIME du fichier (vérifier que on reçoit bien une image si le script attend une image). Sinon pour apprendre, y'a quelques challenges assez faciles qui permettent de t'entraîner à exploiter cette faille
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
12-01-2015, 22h15
Message : #3
|
|
ark
Psyckomodo! Messages : 1,033 Sujets : 48 Points: 317 Inscription : Sep 2011 |
RE: injection de code malicieux sur des fichiers images
Salut,
Difficile de repondre a ta question, mais je vais essayer de synthetiser. Alors, en fait, si tu veux te proteger de ce genre de failles, il y a deux regles tres importantes: premierement, fais attention quand tu code, et deuxiemement, ne fais jamais confiance a tout ce que l'utilisateur peut modifier. Pour faire simple, l'utilisateur peut modifier TOUS les paramettres que tu passes via tes requetes, il convient donc de verifier si ce que tu recoit reste correct. Imaginons par exemple, que tu aies un formulaire d'upload d'image, pour un avatar sur ton forum ou autre. Dans ce cas, il convient de s'assurer que le fichier est reellement une image. En effet, un utilisateur malicieux pourrait essayer de faire passer du code php pour une image. Et la precisement, tu te retrouve avec un probleme! En effet, si l'utilisateur peut upload son fichier sur ton serveur, il est donc en mesure d'executer du code php sur cette machine, et donc peut y faire tout et n'importe quoi (poser une backdoor, rooter la machine et y laisser un rootkit...) Sur ce genre de vulnerabilites, en general, la meilleure solution va etre de verifier les extensions du fichier (etablir une liste d'extension autorisees, .gif, .png, .jpg, etc) et rejeter tous les fichier ayant une autre extension que celles presentent dans la liste. Tu peux ensuite recuperer les donnees de l'image, et verifier que le header soit bien present, et que les informations y sont valides. Cependant, bien que ton formulaire soit plutot securise apres que tu aies effectues ces modifications, il se peut pour autant qu'une autre vulnerabilite soit presente, prennons l'exemple d'une page php, qui inclue une page dont le nom est passe en parametre a la requete. par exemple: www.foo.bar/?page=index.php Ici, que ce passerait-il si l'utilisateur modifie le nom de cette page dans l'url? Il pourrait acceder a n'importe quelle page du site. Pas tres important? Erreur! :p En effet, si ce parametre n'est pas verifie, l'utilisateur va pouvoir inclure tout fichier present sur le serveur, et ainsi avoir un acces en lecture sur une grande majorite des fichiers disponibles (/etc/passwd etant le favori sur les serveurs linux :p) Bon, avoir un acces en lecture, c'est genant, mais c'est pas ca le pire. Le pire, c'est que l'utilisateur, juste avant, il a uploade une jolie image pour faire son avatar, et il a mis du code php dans le code de l'image... Qu'est ce qu'il se passe si il inclue son image en modifiant le parametre? Et ben il execute son code php! Et la encore, domage pour ton serveur, mais tu peux songer a reinstaller ^^ En bref, NEVER TRUST USER INPUT !!! Penses a verifier toutes les entrees utilisateurs, meme les plus annodines, escape tout ce que tu envoi en base de donnee avec mysql_real_escape_string() ou un equivalent si tu n'utilise pas mysql. Penses a convertir les characteres speciaux en utilisant l'encodage html, etc. voili voilou :) Sinon, hesites pas a taper un peu sur les challenges (particulierement dans les sections hacking et javascript) pour mieux comprendre ce qui ne va pas avec les manques de verification. |
|
12-01-2015, 22h52
(Modification du message : 12-01-2015, 23h43 par otherflow.)
Message : #4
|
|
otherflow
Newbie Messages : 20 Sujets : 2 Points: 18 Inscription : Aug 2014 |
RE: injection de code malicieux sur des fichiers images
Bonjour wass19
Dans sa méthode la plus simple, l'injection de code par le biais d'une image passe par l'utilisation des espaces laisser vide dans la structure du fichier d'image (exemple : commentaires) pouvant être utilisé pour y insérerez du code pouvant être exécute. Une méthode palliative a ce type d'objet est la recherche des pattern de début et de fin de code (<?php ou <? et ?> pour PHP et <script> (et ces variantes) et </script> pour le Javascript et autre VBscript). La méthode pour parser une image lors de l'envoie via un formulaire peut être de se placer en amont de la fonction move_uploaded_file en créant une fonction de copie sécurise qui ouvrir manuellement le fichier temporaire ($_FILE['champ_formulaire']['tmp_name']) et de parse le contenu de l'image à la volé avant de l'écrire à son emplacement de destination. Pseudo code : Code : Ouvrir $_FILE['champ_formulaire']['tmp_name'] Si il s'agit d'images pouvant être incluse à partir d'un autre site via des balises iframe ou simplement des balises img. Une solution est de télécharger l'image depuis son endroits de d'origine via des fonctions telle que file_get_contents et de la parser et d'autoriser sont utilisation dans le cas ou aucune balise n'a été détecté. Pseudo code : Code : Telecharger IMAGE En espérant avoir été assez clair, bon courage. otherflow |
|
12-01-2015, 23h08
Message : #5
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,609 Sujets : 71 Points: 465 Inscription : Jan 2012 |
RE: injection de code malicieux sur des fichiers images
Mouais, enfin si tu échappes < et > dans l'image, si ces caractères se retrouvent dans les données de l'image (ce qui représente une probabilité de 2/255 pour chaque caractère :]) ben ceux-ci vont être remplacés par d'autres caractères ce qui risque malheureusement de dégrader fortement le contenu de l'image... (sans parler des faux positifs).
A la rigueur, encoder le fichier (en base64/uuencode ou autre chiffrement réversible) pourrait aider à se prémunir contre ce genre d'attaques (moyennant le script décodant l'image à chaque fois, pas vraiment super pour les performances si le site est très fréquenté), ou sinon faire attention à ne pas laisser traîner de failles débiles sur son site et monitorer convenablement les logs (et remonter par mail/SMS/pigeon voyageur des tentatives d'attaques visibles dans les logs) si on a la chance d'avoir un VPS/dédié, même si ça peut paraître assez difficile à mettre en place au premier abord
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
12-01-2015, 23h53
(Modification du message : 12-01-2015, 23h53 par otherflow.)
Message : #6
|
|
otherflow
Newbie Messages : 20 Sujets : 2 Points: 18 Inscription : Aug 2014 |
RE: injection de code malicieux sur des fichiers images
Premier point :
supersnail a écrit :Mouais, enfin si tu échappes < et > dans l'image, si ces caractères se retrouvent dans les données de l'image (ce qui représente une probabilité de 2/255 pour chaque caractère :]) ben ceux-ci vont être remplacés par d'autres caractères ce qui risque malheureusement de dégrader fortement le contenu de l'image... (sans parler des faux positifs). Effectivement, j'ai voulu trop optimiser mon pseudo code. Ils faut détecter et supprimer les patterns complet : <?php ou <? et ?> pour PHP et <script> (et ces variantes) et </script> pour le Javascript et autre VBscript otherflow a écrit :Une méthode palliative a ce type d'objet est la recherche des pattern de début et de fin de code (<?php ou <? et ?> pour PHP et <script> (et ces variantes) et </script> pour le Javascript et autre VBscript). J'ai édité mon post précédant avec une correction Second point : supersnail a écrit :A la rigueur, encoder le fichier (en base64/uuencode ou autre chiffrement réversible) pourrait aider à se prémunir contre ce genre d'attaques. L'encodage sert à la sécurisation du transfère de l'information et non à la sûreté du contenu que l'information forme. L'encodage du fichier laisse la charge offensive présente dans le contenu du fichier. Lors de l'utilisation de l'image la charge offensive sera tout de même exécutable prés le dé-encodage, l'image devant être dé-encodée pour être affichée. otherflow |
|
13-01-2015, 03h03
Message : #7
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: injection de code malicieux sur des fichiers images
(12-01-2015, 21h52)wass19 a écrit : j'ai su recement quon peut injecter un code malicieux (php, javascript, ...) et les uploader en ligne (...) je souhaiterais savoir comment contrer cette attaque c'est un peu comme si quelqu'un te disait "j'ai appris récemment qu'on pouvait se faire aggresser dans le métro, j'aimerais savoir comment éviter ça ?" la question est courte, mais y'a pas de vraie réponse, ni courte ni pleinement satisfaisante, et si on te dit d'aller prendre des cours de self-sécurité tu risques surement de mal le prendre Citation :existe t'il un script qui analyse le fichier image, et detecte le code par exemple ? oui ça s'appelle un antivirus, ou un firewall applicatif bien configuré doit faire le job aussi, mais l'attitude de base va plutôt consister à avoir la maitrise de son code, c'est à dire non seulement savoir faire un programme, mais aussi connaitre de manière très pointue les limites du langage utilisé (en l'occurrence PHP), on trouve d'ailleurs les détails et avertissements de sécurité sur les différentes fonctions directement dans la doc ! (même pas besoin de chercher des repaires de hackers pour ça ) les problèmes peuvent être multiples, particulièrement dans le cas d'un formulaire d'upload de fichiers, pas uniquement en terme d’exécution de code, c'est pour afficher dans une page web pour les internautes ensuite ? une image de 30Mo ça passe ? et je peux en uploader autant que je veux ? à chaque problématique sa solution, on pourrait par exemple envisager d'accepter les fichiers, si ça dépasse 1Mo de données reçues on met fin à la transaction purement et simplement (au niveau de la configuration PHP), puis on essaye de déterminer le type du fichier uploadé, pas en se basant sur l'en-tête http mais sur le contenu du fichier, avec finfo_file() par exemple, si le type du fichier est bien une image, on la redimensionne voire on modifie carrément son format pour la standardiser, s'il y a des trucs foireux à l'intérieur soit l'opération échouera soit les données seront perdues lors de la conversion enfin, à ce stade on peut raisonnablement penser que les données uploadées sont pas trop mal filtrées, dans une optique de verrouillage j'aurais tendance à rajouter un contrôle antivirus dessus (faut voir si c'est efficace au préalable) ou modsecurity en sortie/affichage ou à faire une sonde maison (...) ...et là il se trouve que t'as une injection sql un peu plus loin dans ton code qui n'a rien à voir avec le formulaire d'upload, et ta base de données qui autorise l'écriture dans un fichier, du coup un pirate peut s'en servir pour uploader du code sans même passer par le formulaire d'upload et tout ce qu'on a dit et mis en place n'a servi à rien... vdm la meilleure réponse qu'on puisse te faire en l'absence de cas concret avec son code pour accompagner c'est de continuer à lire autour de la doc PHP, des bypass connus de ce langage, mais aussi apprendre et comprendre le système qui soutient ton interpréteur et le serveur web, les réseaux également particulièrement http etc. et bien évidement quand t'as un doute de nous soumettre un bout de code sur le forum
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
13-01-2015, 21h12
Message : #8
|
|
wass19
Newbie Messages : 18 Sujets : 6 Points: -5 Inscription : Jan 2015 |
RE: injection de code malicieux sur des fichiers images
salut a tous
ça fait plaisir de voir tant de reponses, merci infiniment alors .... Citation :Tout d'abord ton code PHP ne sera exécuté uniquement si tu fais un include() du fichier (ce qu'il ne faut évidemment pas faire...). si le code ne s'éxécute qu'on utilisant les include(), donc il n y a plus de dangers O_o, je me demande qui fera un Code PHP : include(image.jpg) (a pare biensur la faille que ma éxpliqué ark) Citation :Sur ce genre de vulnerabilites, en general, la meilleure solution va etre de verifier les extensions du fichier (etablir une liste d'extension autorisees, .gif, .png, .jpg, etc) et rejeter tous les fichier ayant une autre extension que celles presentent dans la liste. Tu peux ensuite recuperer les donnees de l'image, et verifier que le header soit bien present, et que les informations y sont valides. la je suis d'accord avec vous c'est une exelente idée de verifier l'extention du fichier, mais j'ai 2 questions : si quelqu'un utilise une double extension, comment faire ? c'est quoi le header ? j'ai modifié un fichier image avec notpad++, je lui ai injécté ce code : Code : <script>alert('Je suis');</script> je pense que la solution est de lire le fichier sans l'executer et avec des regex enlever les caracteres ou mot du genre <?php ou <? et ?> et supprimer ce qu'il y a entre eux, est d'enregistrer la nouvelle image désinféctée j'ai éssayé avec la bibliotheque GD, de retrécir l'image et j'ai oubtenu l'erreur que le fichier est corompu O_o pourtant elle s'affiche bien dans le navigateur Citation :c'est un peu comme si quelqu'un te disait "j'ai appris récemment qu'on pouvait se faire aggresser dans le métro, j'aimerais savoir comment éviter ça ?"mdrrrr, vous avez raison, je n'ai pas été clair et je m'en excuse, mais je ny connais rien a cette attaque c'est pour ça que je n'ai pas été clair merci bcp a tous c'est tres sympa de votre pare |
|
13-01-2015, 21h38
Message : #9
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: injection de code malicieux sur des fichiers images
(13-01-2015, 21h12)wass19 a écrit :Citation :la meilleure solution va etre de verifier les extensions du fichierla je suis d'accord avec vous c'est une exelente idée de verifier l'extention du fichier non ça n'est pas une bonne idée justement, même sans parler de double extension tu l'as vu toi même suffit d'un fichier toto.jpg qui contient uniquement du php pour qu'on soit déjà en dehors des clous, la seule méthode valable pour checker le type du fichier c'est de checker son contenu Citation :j'ai modifié un fichier image avec notpad++, je lui ai injécté ce code : bien vu, et au temps pour moi la fonction finfo_file() semble se baser sur le champ Content-type: de la requête http, lui même spoofable, donc on ne peut pas faire confiance à l'info que ça nous donne je vais faire quelques tests de mon côté pour voir et éviter de te dire des conneries ;p cela dit tu peux toujours essayer de convertir le fichier, si ça marche c'est que c’était bien une image (sinon pas), et au moins t'es à peu près sûr que s'il y avait des données foireuses dans l'image après conversion elles sont partis
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
13-01-2015, 21h58
(Modification du message : 13-01-2015, 21h59 par wass19.)
Message : #10
|
|
wass19
Newbie Messages : 18 Sujets : 6 Points: -5 Inscription : Jan 2015 |
RE: injection de code malicieux sur des fichiers images
merci gruik
oui c'est une methode qui me semble tres biable euh c koi spoofable ?? désolé je suis nouveau et je ne connais pas tres bien ces mots O_o :$ |
|
13-01-2015, 22h12
Message : #11
|
|
supersnail
Éleveur d'ornithorynques Messages : 1,609 Sujets : 71 Points: 465 Inscription : Jan 2012 |
RE: injection de code malicieux sur des fichiers images
spoofable = falsifiable (un mot à rajouter dans ton dictionnaire de jargon informatique/sécurité parce qu'on l'utilise souvent celui-là :þ)
Sinon essaie d'éviter le "style" SMS pour m'épargner une cécité précoce :'(
Mon blog
Code : push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp "VIM est merveilleux" © supersnail |
|
13-01-2015, 22h16
Message : #12
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: injection de code malicieux sur des fichiers images
non ben en fait rectification, ça se base pas sur le content-type :
Code BASH :
$ file *.png Code PHP :
<?php Code BASH :
$ php pouet.php
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
13-01-2015, 22h51
Message : #13
|
|
wass19
Newbie Messages : 18 Sujets : 6 Points: -5 Inscription : Jan 2015 |
RE: injection de code malicieux sur des fichiers images
resalut
désolé à l'avenir j'arrete d'ecrire en sms gruik encore une question, que ce qu'il y a dans le fichier faux.png (est ce que vous avez mis un script au milieu comme je l'ai mis avant), ou autre chose ? merci |
|
13-01-2015, 23h21
Message : #14
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: injection de code malicieux sur des fichiers images
dans faux.png j'ai mis la même chose que toi c'est à dire <script>alert('Je suis');</script>
j'ai également fait d'autres tests, en créant des images png et jpg règlo et en mettant des commentaires à l'intérieur ensuite j'ai essayé de convertir les images, d'abord de png -> gif -> png, puis directement png -> png avec l'aide des fonctions imagepng() et imagecreatefrom...(), à chaque fois l'image générée ne contient plus le commentaire, donc on est bon une solution simple consisterait donc en un truc du genre : Code PHP :
if ($buff = imagecreatefromstring(file_get_contents($uploaded_file))) { si imagecreatefromstring() échoue c'est que le fichier n'était pas une image, et si c'est bien un fichier image on le convertit en png systématiquement, on se préoccupe même plus de checker le type du fichier c'est imagecreatefromstring() qui s'en charge il s'agit pas cela dit de récupérer le code tel quel, mais plutôt de comprendre les principes et les pièges auxquels on essaye d'échapper, par ailleurs je suis pas du tout programmeur en php perso...
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
14-01-2015, 00h13
Message : #15
|
|
wass19
Newbie Messages : 18 Sujets : 6 Points: -5 Inscription : Jan 2015 |
RE: injection de code malicieux sur des fichiers images
merci bcp gruik
|
|
« Sujet précédent | Sujet suivant »
|
Utilisateur(s) parcourant ce sujet : 2 visiteur(s)