Faille dans nWebSystems Voting System ************************************* Produit : ********* nWebSystems Voting System http://www.nwebsystems.com/ Versions : ********* 1.0 et moins. Date : ****** 11/02/02 Probleme : ********** - Accès à la partie administration. Developpement : *************** nWebSystems VS est une application, comme le dit son nom, concue pour la création et la modification des sondages. La faille va nous permettre d'effectuer toutes les opérations reservées aux admins, comme par exemple rajouter un admin. J'ai localisé la vulnérabilité dans les fichiers loginform.php, qui permet de se logger, et index.php, qui renvois vers les fichiers qui conviennent selon l'action à effectuer. Voici la partie de loginform.php qui nous interesse : ----------------------------------------------------------------------------------- elseif ($uname == $u_name) { if ($pword == $u_pass) { session_register( "sess_id" ); session_register( "sess_user" ); session_register( "sess_level" ); session_register( "loggedin" ); $sess_id = $u_id; $sess_user = $u_name; $sess_level = $u_level; $loggedin = true; if ($loggedin == 'true') { ?> ----------------------------------------------------------------------------------- Retenons que si on s'est loggé avec un bon pseudo et un bon mot de passe, la valeur &loggedin vaut "true". Voyons maintenant la partie interessante d'index.php : ----------------------------------------------------------------------------------- if ($loggedin != 'true') { if ($action == '') { include ('loginform.inc'); } elseif ($action == 'login') { include ('loginform.php'); } else { ?> } } elseif ($loggedin == 'true') { if ($action == '') { include ('success.inc'); } elseif ($action == 'settings') { include ('settings.inc'); } elseif ($action == 'updateset') { include ('settings.php'); } elseif ($action == 'editadmin') { include ('editadmin.inc'); } elseif ($action == 'eadmin') { include ('editadmin.php'); } elseif ($action == 'adduser') { include ('adduser.inc'); } elseif ($action == 'auser') { include ('adduser.php'); } elseif ($action == 'edituser') { include ('edituser.inc'); } elseif ($action == 'euser') { include ('edituser.php'); } elseif ($action == 'addpoll') { include ('addpoll.inc'); } elseif ($action == 'apoll') { include ('addpoll.php'); } elseif ($action == 'editpoll') { include ('editpoll.inc'); } elseif ($action == 'epoll') { include ('editpoll.php'); } elseif ($action == 'viewpoll') { include ('viewpoll.inc'); } elseif ($action == 'denied') { print 'denied'; } elseif ($action == 'logout') { session_unset(); session_destroy();?> ----------------------------------------------------------------------------------- C'est ici qu'on peut voir le manque de sécurité : la seule vérification qui est faite pour executer des commandes en tant qu'admin est que la valeur $loggedin soit bien true : elseif ($loggedin == 'true') { if ($action == '') { include ('success.inc'); } elseif ($action == 'settings') { include ('settings.inc'); } elseif ($action == 'updateset') { etc... Bien, laissons un peu de côté les possiblités de cette faille et voyons l'url qu'un admin devrait taper pour rajouter un user, grâce aux fichiers adduser.inc et adduser.php . adduser.inc : ----------------------------------------------------------------------------------- if ($sess_level != '1') { ?> } elseif ($sess_level == '1') { ?>