par
FuZZyLine » 07 juil. 2009, 09:42
Salut,
Bonjour,
Voila mon problème. Un utilisateur de mon site à trouvé une faille, d'un type que je n'avais jamais vu. Il réussit à faire planter apache en injectant du texte dans l'url.
J'ai déja entendu parlé de ca bien que ca fasse un bail. Bref, peu importe
Après installation d'un système me permettant de savoir la page qu'il utilise, j'ai fini par trouver (les logs d'apache faisaient plus de 1 Go, donc inouvrables et inexploitables

).
Il utilise cette technique un peu partout, et ca fonctionne sur l'immense majorité des pages du site. Il injecte de cette facon :
/sujet.php?id=
http://217.218.225.2:2082/index.html?
La variable info est sensée être un nombre. La variable est bien traitée pour éviter les injections SQL, et ne pose aucun problème au serveur SQL, à part un message d'erreur car ce n'est pas le bon type de données. Après vérification de mon code, je pense que ca vient de cette ligne :
header('Location: repondre.php?id='.$_GET['id']);
Alors ma première question : Comment une telle ligne peut-elle faire planter apache ?
A vu de nez je dirais qu'il boucle
Malgré les risques, je suis allé voir l'url qu'il injecte depuis mon navigateur, et il s'agit simplement d'une page de login d'un cpanel, donc rien de méchant.
Deuxième question : Mon site comporte un trop grand nombre de pages pour que je les modifie toutes à la main. Donc mon idée, même si c'est un peu bourrin, serait de, dans une des pages qui est utilisée partout (header.php), filtrer les variables GET, et supprimer celles contenant une url (car je pense que sa méthode fonctionne avec d'autres urls). Donc comment identifier une chaine comme url ?
Merci.
Déja, si, l'ID est numérique:
if (!is_numeric($_GET[id])) die("Tu peux traiter ici... En remplacant die par ce que tu veux.");
...
// suite du process
...
De mon côté, je vérifie l'autorisation de telle ou telle URL et pareil avec les fragments.
define ("authorized", 1);
define ("unauthorized", 2);
define ("restricted", 4);
// Récupération de l'url
$strUrl = ...
// Récupération d'un des fragment du get (sous while ou for)
$strFrag = ...
$arrayAuthorizedUrl = Array("accueil" => 1, "admin" => 4, "member" => 4, "send" => 1);
$arrayAuthorizedFrag = Array("id", "log", ...);
if (!isset($arrayAuthorizedUrl[$url] | (!$arrayAuthorized[$url] & authorized) ) die("...ou traitement");
if (!!isset($arrayAuthorizedFrag[$strFrag]) ) die("...ou traitement");
...
// Suite du process
...
C'est vraiment pas très clair mais ca représente la structure telle qu'est la mienne pour la gestion des entrées. Ce n'est pas la "spuper-extra" protection mais bon, c'est déja un début. J'espere avoir saisi ton problème et t'avoir mis sur la piste d'une solution.
@+

Salut,
[quote="sebcap26"]
Bonjour,
Voila mon problème. Un utilisateur de mon site à trouvé une faille, d'un type que je n'avais jamais vu. Il réussit à faire planter apache en injectant du texte dans l'url.
[/quote]
J'ai déja entendu parlé de ca bien que ca fasse un bail. Bref, peu importe ;)
[quote="sebcap26"]
Après installation d'un système me permettant de savoir la page qu'il utilise, j'ai fini par trouver (les logs d'apache faisaient plus de 1 Go, donc inouvrables et inexploitables :shock: ).
Il utilise cette technique un peu partout, et ca fonctionne sur l'immense majorité des pages du site. Il injecte de cette facon :
/sujet.php?id=http://217.218.225.2:2082/index.html?
La variable info est sensée être un nombre. La variable est bien traitée pour éviter les injections SQL, et ne pose aucun problème au serveur SQL, à part un message d'erreur car ce n'est pas le bon type de données. Après vérification de mon code, je pense que ca vient de cette ligne :
[php]header('Location: repondre.php?id='.$_GET['id']);[/php]
Alors ma première question : Comment une telle ligne peut-elle faire planter apache ?
[/quote]
A vu de nez je dirais qu'il boucle ;)
[quote="sebcap26"]
Malgré les risques, je suis allé voir l'url qu'il injecte depuis mon navigateur, et il s'agit simplement d'une page de login d'un cpanel, donc rien de méchant.
Deuxième question : Mon site comporte un trop grand nombre de pages pour que je les modifie toutes à la main. Donc mon idée, même si c'est un peu bourrin, serait de, dans une des pages qui est utilisée partout (header.php), filtrer les variables GET, et supprimer celles contenant une url (car je pense que sa méthode fonctionne avec d'autres urls). Donc comment identifier une chaine comme url ?
Merci.
[/quote]
Déja, si, l'ID est numérique:
[php]
if (!is_numeric($_GET[id])) die("Tu peux traiter ici... En remplacant die par ce que tu veux.");
...
// suite du process
...
[/php]
De mon côté, je vérifie l'autorisation de telle ou telle URL et pareil avec les fragments.
[php]
define ("authorized", 1);
define ("unauthorized", 2);
define ("restricted", 4);
// Récupération de l'url
$strUrl = ...
// Récupération d'un des fragment du get (sous while ou for)
$strFrag = ...
$arrayAuthorizedUrl = Array("accueil" => 1, "admin" => 4, "member" => 4, "send" => 1);
$arrayAuthorizedFrag = Array("id", "log", ...);
if (!isset($arrayAuthorizedUrl[$url] | (!$arrayAuthorized[$url] & authorized) ) die("...ou traitement");
if (!!isset($arrayAuthorizedFrag[$strFrag]) ) die("...ou traitement");
...
// Suite du process
...
[/php]
C'est vraiment pas très clair mais ca représente la structure telle qu'est la mienne pour la gestion des entrées. Ce n'est pas la "spuper-extra" protection mais bon, c'est déja un début. J'espere avoir saisi ton problème et t'avoir mis sur la piste d'une solution.
@+ ;)