====== Mini-audit de Galette ====== ===== Généralités ===== * Galette : Gestionnaire d'Adhérents en Ligne Extrêmement Tarabiscoté mais Tellement Efficace * Site officiel : [[http://galette.tuxfamily.org]] * 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 ((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...)) 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 : * [[http://php.net/manual/fr/function.mysql-real-escape-string.php|mysql_real_escape_string]] * [[http://fr.php.net/manual/fr/mysqli.real-escape-string.php|mysqli_real_escape_string]] * [[http://www.php.net/manual/en/function.pg-escape-string.php|pg_escape_string]] Observons maintenant les diverses bibliothèques fournies avec galette : ^ Lib ^ Version utilisée ^ Dernière version ^ | [[http://adodb.sourceforge.net/|ADOdb]] | 4.92 (29/08/2006) | 5.09a (26/06/2009) | | [[http://www.potentialtech.com/cms/node/6|phppdflib]] | Aucune idée. Vraiment. | 2.9b2 (04/05/2004) :!: | | [[http://www.smarty.net/|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.