Mini-audit de Galette

Généralités

  • Galette : Gestionnaire d'Adhérents en Ligne Extrêmement Tarabiscoté mais Tellement Efficace
  • Version testée : 0.63.2 (06/10/2009)

C'est parti

Téléchargement et décompression de l'archive

Commençons par nous procurer le code de la version 0.63.2 :

wget http://download.gna.org/galette/galette-0.63.2.tgz
tar xzf galette-0.63.2.tgz
mv galette-0.63.2 galette
cd galette

Observons les permissions des fichiers fournis :

find . -type f -perm /111 -print0 | xargs -0 /bin/ls -ald
-rwxr-x--- 1 xavier xavier  3795 déc.  14  2008 ./docs/CHANGES
-rwxr-x--- 1 xavier xavier  3933 avril 20  2004 ./docs/UPGRADE-linux-fr
-rwxr-x--- 1 xavier xavier 10728 nov.  12  2006 ./lang/make_lang_l12n.py
-rwxr-x--- 1 xavier xavier  2003 janv. 30  2006 ./lang/xgettext.py
-rwxr-x--- 1 xavier xavier  1207 oct.   5 18:03 ./picture.php
-rwxr-x--- 1 xavier xavier  1307 sept. 10  2006 ./public/header.php
-rwxr-x--- 1 xavier xavier  3983 févr. 14  2006 ./templates/default/ajouter_contribution.tpl
-rwxr-x--- 1 xavier xavier  1926 févr. 14  2006 ./templates/default/ajouter_transaction.tpl
-rwxr-x--- 1 xavier xavier  3848 nov.   5  2007 ./templates/default/configurer_fiches.tpl
-rwxr-x--- 1 xavier xavier 10145 juin  13  2008 ./templates/default/galette.css
-rwxr-x--- 1 xavier xavier  7242 juin  16  2006 ./templates/default/gestion_contributions.tpl
-rwxr-x--- 1 xavier xavier  4746 janv. 31  2006 ./templates/default/gestion_transactions.tpl
-rwxr-x--- 1 xavier xavier  2605 juin  12  2008 ./templates/default/mailing_adherents.tpl
-rwxr-x--- 1 xavier xavier 10692 oct.   6 20:56 ./templates/default/preferences.tpl
-rwxr-x--- 1 xavier xavier  1230 juin  16  2006 ./templates/default/traduire_libelles.tpl
-rwxr-x--- 1 xavier xavier  4322 oct.   6 06:25 ./templates/default/voir_adherent.tpl

Ces fichiers ont-ils vraiment besoin d'un flag exécutable ? Cela peut se comprendre pour les scripts utilitaires (*.py) mais beaucoup moins pour :

  • les templates (*.tpl)
  • les scripts PHP (*.php)
  • la documentation (docs/*)

Détail :

-rw-r-----  1 xavier xavier   29 2004-07-13 22:11:55 .cvsignore

Fallait-il vraiment laisser cela dans le paquet final ?

Installation

vim docs/INSTALL
  Requis :  - Serveur web supportant PHP :
          Apache est une bonne option
          Galette a été testé sur Apache 1.3.22 et 1.3.26
        - PHP (Au moins la version 4.1)
          Galette a été testé avec PHP 4.1.2 et 4.3.3
        - Base de données (MySQL ou PostgreSQL)
          Galette a été testé sur MySQL 3.23.49 et PostgresSQL
          7.0.2 et 7.2.1 (version récente recommandée)

Sans vouloir remettre en cause la pertinence des tests upstream, n'en serions-nous point à Apache 2.2, PHP 5.2.11, MySQL 5.1 et PostgreSQL 8.4.1 ?

  Il vous faut maintenant créer un utilisateur et une base pour Galette sur
  votre serveur SQL (MySQL ou PostgreSQL). L'utilisateur créé doit avoir
  tous les droits sur la base créée pour Galette.

  Se reporter à la documentation de votre serveur SQL pour ce faire.
  Web.

Pour ce test, nous choisirons le premier truc qui nous tombera sous la main, à savoir du MySQL. Création des structures par un script d'install ⇒ tous privilèges pour cet utilisateur sur cette base donc ? Bon, pourquoi pas…

GRANT ALL PRIVILEGES ON `galette` . * TO 'galette_user'@'localhost' WITH GRANT OPTION ;
  Connectez-vous ensuite au sous répertoire "install" avec votre navigateur web.
  Dans notre exemple, il s'agit de http://serveur/galette-0.62/install.

  Vous n'avez plus qu'à vous laissez guider par les 10 étapes de l'installeur
  Web.

Rendons-nous joyeusement sur https://webdev/~xavier/galette/install/index.php (oui, c'est comme ça chez moi), faisons une nouvelle installation francophone.

Les permissions des fichiers sont correctes !

Merci mod_suphp.

Si ce n'est pas déjà fait, créez une base de données et un utilisateur pour Galette.
Les droits nécessaires sont CREATE, DROP, DELETE, UPDATE, SELECT et INSERT.

$#%#$%$# Pouvait pas le dire plus tôt non ?

REVOKE ALL PRIVILEGES ON galette. * FROM galette_user@localhost;
REVOKE GRANT OPTION ON galette. * FROM galette_user@localhost;
GRANT CREATE, DROP, DELETE, UPDATE, SELECT, INSERT ON galette.* TO galette_user@localhost;

Remplissons le formulaire pour la connexion à la base de données et passons à l'étape suivante :

Les droits d'accès à la base sont corrects.

Si c'est pas beau la vie. Créons les structures maintenant :

DROP TABLE IF ...
CREATE TABLE galette_adherents ...
DROP TABLE IF ...
CREATE TABLE galette_cotisations ...
DROP TABLE IF ...
CREATE TABLE galette_transactions ...
DROP TABLE IF ...
CREATE TABLE galette_statuts ...
DROP TABLE IF ...
CREATE TABLE galette_types_cotisation ...
DROP TABLE IF ...
CREATE TABLE galette_preferences ...
DROP TABLE IF ...
CREATE TABLE galette_logs ...
DROP TABLE IF ...
CREATE TABLE galette_field_types ...
DROP TABLE IF ...
CREATE TABLE galette_dynamic_fields ...
DROP TABLE IF ...
CREATE TABLE `galette_pictures` ...
DROP TABLE IF ...
CREATE TABLE galette_l10n ...
DROP TABLE IF ...
CREATE TABLE galette_tmppasswds ...
  (Les erreurs sur les opérations DROP et RENAME peuvent être ignorées)
 Les tables ont été correctement créées.

Ah, c'était pour ça le droit de DROP. Et euh, … on peut enlever les droits CREATE et DROP maintenant ?

Veuillez choisir les paramètres du compte administrateur Galette

Alors, utilisateur “admin”, mot de passe “maman”… ah nan, c'pas ça :p

Fichier de configuration crée (includes/config.inc.php)
Paramètres sauvegardés dans la base de données

Voyons ce fichier immédiatement après installation :

-rw------- 1 xavier xavier 298 2009-11-07 19:25:45 includes/config.inc.php

Les permissions sur ce fichier sont nickels. Est-ce volontaire ? D'après le code PHP situé dans install/index.php après création du fichier de configuration (ligne 959 et suivantes)… non. À priori, ça viendrait plutôt de la directive umask=0077 dans la configuration suPHP de mon serveur. Dommage…

  Une fois le script d'installation terminé, et après avoir vérifié que tout
  fonctionne, il est fortement conseillé de supprimer le dossier install/.

Voilà un sage conseil.

Utilisation

On arrive ensuite sur galette/index.php, on s'identifie et wouah ça fonctionne. Cherchons maintenant la petite bête…

Petite balade dans le code

Dans index.php, à partir de la ligne 56 :

        if (
            ($_POST["login"]==PREF_ADMIN_LOGIN && $_POST["password"]==PREF_ADMIN_PASS) ||
            ($_POST["login"]==PREF_ADMIN_LOGIN && md5($_POST["password"])==PREF_ADMIN_PASS)
            )
        {
            $_SESSION["logged_status"]=1;
            $_SESSION["admin_status"]=1;
            $_SESSION["logged_username"]=$_POST["login"];
            $_SESSION["logged_nom_adh"]="Admin";
            dblog("Login");
        }

Intéressant : si on arrive à lire le MD5 du mot de passe de l'administrateur, on n'a pas besoin de s'emmerder à le bruteforcer 1) pour s'identifier avec. Les lignes 75 et 76 de ce même fichier nous indiquent que la même politique s'appliquent à l'identification des autres utilisateurs.

Dans includes/functions.inc.php :

function txt_sqls($champ) {
  return "'".str_replace("'", "\'", str_replace('\\', '', $champ))."'";
}

Cette fonction, utilisée 6 fois dans le reste du code, paraît un peu légère par rapport à des fonctions plus spécialisées telles que :

Observons maintenant les diverses bibliothèques fournies avec galette :

Lib Version utilisée Dernière version
ADOdb 4.92 (29/08/2006) 5.09a (26/06/2009)
phppdflib Aucune idée. Vraiment. 2.9b2 (04/05/2004) :!:
Smarty 2.6.5-dev (13/09/2004) 3.0b1 (31/10/2009)

La plupart des autres fichiers font état d'un copyright 2003-2004.

1)
au risque de tomber sur un mot de passe un tant soit peu solide, ou, pire encore, de s'impatienter pendant que chauffage.localdomain utilise ses 133 MHz pour le bruteforce…
Imprimer/exporter