F�licitations � Nicolas D�sir qui recevra son prix par la poste d�s qu'il
m'aura donn� son adresse.

La r�ponse:

>    if (defined($query->param('operation'))
>        && &is_valid_operation($query->param('operation'))) {

$query->param('operation') peut retourner soit un scalaire (une variable),
soit un tableau, suivant le contexte Perl liste ou scalaire. Comme
is_valid_operation() est appel� en contexte liste mais qu'en suite on ne
prend que le premier scalaire de la liste:

   my ($operation) = @_;

on ne teste que la validit� du premier �l�ment, et pas s'il y a plus
d'�l�ments.

Ensuite, lorsqu'on passe les param�tres � la fonction d'op�ration, on
utilise � nouveau $query->param('operation') dans un contexte de liste (de
param�tres) et donc le 2�me param�tre $is_admin est d�plac� (remplac� par
le deuxi�me �l�ment de $query->param('operation')).

Quand cela se produira-t-il ?  Il suffit qu'on utilise une URL comme:
 
   http://www.example.com/cgi-bin/buggy.pl?operation=lire&operation=1

>       &do_operation($query->param('operation'), $is_admin);

L'op�ration est donc ex�cut�e avec privil�ge administrateur.

Solution: (une de celles-l�)
   - v�rifier que scalar(@_) vaut 1 dans is_valid_operation().
   - assigner $query->param('operation') � une variable scalaire d�s
     ou avant de valider.
   - passer une r�f�rence au tableau � &do_operation() (si le cas
     multivalu� est normal), ou comme dernier param�tre tableau (risqu�
     si on fait �voluer le code ensuite)
   - utiliser la v�rification de param�tres que Perl peut apporter
     (prototypage) que je n'ai pas encore essay�.

Comme quoi m�me des langages sans pointeurs peuvent �tre sensibles � des
attaques de buffer overflow un peu particuli�res :))


-
Pour poster une annonce: [EMAIL PROTECTED]

Répondre à