Aujourd'hui, je souhaite me concentrer sur un sujet qui peut entraîner d'énormes problèmes de comptes piratés, de spams, etc. :Installations Joomla obsolètes sur votre serveur.
Bien sûr, cela est également valable pour d'autres logiciels. La méthode mentionnée devrait fonctionner de la même manière pour d'autres logiciels. Depuis Joomla est largement répandu sur Internet, en particulier sur l'hébergement mutualisé systèmes CMS (Système de gestion de contenu) , ce guide ne couvrira que Joomla jusqu'à présent.
Prérequis
Vous aurez besoin au moins des outils bc et sed qui ne sont pas toujours installés par défaut.
Commençons
Au début, il y a une question :comment puis-je reconnaître la version de joomla à partir des fichiers installés ?
Cela dépend de la version installée de Joomla. Jusqu'à présent, j'ai trouvé trois fichiers différents contenant les informations de version :
/libraries/joomla/version.php
/libraries/cms/version/version.php
/includes/version.php
Les lignes les plus importantes de ces fichiers sont le numéro de version et la version mineure qui sont contenues dans les variables suivantes :
var $RELEASE ='1.0';
var $DEV_LEVEL ='12';
Dans une prochaine étape, nous recherchons la version la plus récente de Joomla sur le site officiel. Au moment de la rédaction de ce guide, il existe trois groupes de versions :1.5 (1.5.26), 2.5 (2.5.17) et 3.2 (3.2.1).
Trouver des installations joomla sur votre serveur
Une chose que toutes les installations de joomla ont en commun est le nom de dossier "components", nous recherchons donc tous les dossiers portant ce nom. En même temps, nous ignorons tous les dossiers de composants contenus dans un sous-dossier "administrateur". Le chemin de base /var/www doit être ajusté si les sites Web de votre serveur ne s'y trouvent pas.
trouver /var/www/ -type d -name 'composants' ! -nom entier '**/administrateur/composants'
Cette commande vous donnera une liste de tous ces dossiers. La commande dirname convient pour obtenir le chemin contenant le dossier des composants. Ceci est le chemin de base de l'installation de Joomla.
Nous faisons cela en boucle pour tous les dossiers de composants trouvés :
pour L dans `find /var/www/ -type d -name 'composants' ! -wholename '**/administrateur/composants'` ; faire
D=`dirname $L`;
fait
Obtenir la version majeure et mineure
Pour obtenir la version de votre installation, nous utiliserons les commandes combinées "grep" et "sed".
Nous vérifions d'abord lequel des trois fichiers que j'ai mentionnés précédemment existe dans le chemin d'installation.
F=$D/libraries/joomla/version.php;
F2=$D/libraries/cms/version/version.php;
F3=$D/includes/version.php;
si [[ -e "$F" || -e "$F2" || -e "$F3" ]]; alors
if [[ -e "$F" ]] ; alors
F=$F;
elif [[ -e "$F2" ]] ; alors
F=$F2;
elif [[ -e "$F3" ]] ; then
F=$F3;
fi
else
echo "No joomla version file found.";
fi
Nous lisons maintenant la version majeure et mineure de ce fichier :
VERSION=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
Comparer les versions
Comme les numéros de version ne sont pas des entiers, nous ne pouvons pas les comparer dans le script bash en utilisant -lt etc. Au lieu de cela, nous devons utiliser un programme externe appelé bc :
ISOK=1;
if [[ $(echo "if (${VERSION} <1.5) 1 else 0" | bc) -eq 1 ]]; alors
# version est inférieure à 1.5
ISOK=0;
elif [[ $(echo "if (${VERSION} ==1.5) 1 else 0" | bc) -eq 1 &&$(echo "if (${SUBVERSION} <26) 1 else 0" | bc) -eq 1 ]]; alors
# la version est 1.5.x mais inférieure à 1.5.26
ISOK=0;
### et ainsi de suite - vérifications de version supplémentaires
sinon
ISOK=1;
fi
Le script complet
Nous sommes maintenant prêts à assembler toutes les parties dans un script prêt à l'emploi et à ajouter quelques améliorations mineures. Le script recherchera toutes les versions de joomla dans le chemin de base donné et imprimera des informations sur l'état. Bien sûr, vous ne pouvez pas parler d'une version 1.5.26 comme "current" mais comme il s'agit de la version la plus récente de la branche 1.5 et qu'une mise à jour vers la branche 2.5 ou 3.x est très compliquée dans certains cas, ce script marquera cette version comme "OK". Vous pouvez changer cela si vous le souhaitez.
Voici un exemple de sortie du script :
[INFO] la version 1.5.26 dans /var/www/xxx est correcte.
[WARN] version 1.0.12 de Joomla obsolète dans /var/www/yyy
[WARN] version 1.5.14 de Joomla obsolète dans /var/www/zzz
[AVERTISSEMENT] version 2.5.8 de Joomla obsolète dans /var/www/aaa
[AVERTISSEMENT] version 1.5.10 de Joomla obsolète dans /var/www/bbb
Et maintenant :le script complet. Enregistrez-le simplement sous "joomlascan.sh" et appelez-le via
bash joomlascan.sh
Si vous donnez un nom de fichier comme argument supplémentaire (comme bash joomlascan.sh list.csv), vous obtenez un fichier appelé list.csv qui contient une liste de toutes les installations obsolètes :
/var/www/aaa;1.0.12;1.5.26
/var/www/zzz;1.5.14;1.5.26
/var/www/aaa;2.5.8;2.5.17
/var/www/bbb;1.5.10;1.5.26
Astuce :
Si vous utilisez ISPConfig 3, vous devez modifier le BASEPATH en BASEPATH="/var/www/clients/client*/web*".
#!/bin/bash # current version 1.5.x CUR15=26 # aktuelle version 2.5.x CUR25=17 # aktuelle version 3.2.x CUR3=1 #base path of the websites BASEPATH="/var/www/" # write to csv file (optional argument) OUTFILE=$1 if [[ "$OUTFILE" != "" ]] ; then # empty CSV file echo -n "" > $OUTFILE ; fi for L in `find ${BASEPATH} -type d -name 'components' ! -wholename '**/administrator/components' | grep -v '/tmp/'` ; do D=`dirname $L` ; F=$D/libraries/joomla/version.php ; F2=$D/libraries/cms/version/version.php ; F3=$D/includes/version.php ; ISOK=0 ; SHOWNEWEST="" ; IMPORTANCE=0 ; if [[ -e "$F" || -e "$F2" || -e "$F3" ]] ; then if [[ -e "$F" ]] ; then F=$F ; elif [[ -e "$F2" ]] ; then F=$F2 ; elif [[ -e "$F3" ]] ; then F=$F3 ; fi VERSION=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ; SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ; if [[ $(echo "if (${VERSION} < 1.5) 1 else 0" | bc) -eq 1 ]] ; then # version is lower than 1.5 SHOWNEWEST="1.5.${CUR15}" ; IMPORTANCE=3 ; elif [[ $(echo "if (${VERSION} == 1.5) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < ${CUR15}) 1 else 0" | bc) -eq 1 ]] ; then # version is 1.5.x but not most current version SHOWNEWEST="1.5.${CUR15}" ; IMPORTANCE=2 ; elif [[ $(echo "if (${VERSION} == 1.6) 1 else 0" | bc) -eq 1 ]] ; then # version is 1.6 SHOWNEWEST="2.5.${CUR25}" ; IMPORTANCE=2 ; elif [[ $(echo "if (${VERSION} == 1.7) 1 else 0" | bc) -eq 1 ]] ; then # version is 1.7 SHOWNEWEST="2.5.${CUR25}" ; IMPORTANCE=2 ; elif [[ $(echo "if (${VERSION} > 1.7) 1 else 0" | bc) -eq 1 && $(echo "if (${VERSION} < 2.5) 1 else 0" | bc) -eq 1 ]] ; then # version is somewhere between 1.7 and 2.5 SHOWNEWEST="2.5.${CUR25}" ; IMPORTANCE=2 ; elif [[ $(echo "if (${VERSION} == 2.5) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < ${CUR25}) 1 else 0" | bc) -eq 1 ]] ; then # version is 2.5 but lower than current SHOWNEWEST="2.5.${CUR25}" ; IMPORTANCE=1 ; elif [[ $(echo "if (${VERSION} >= 3) 1 else 0" | bc) -eq 1 && $(echo "if (${VERSION} < 3.2) 1 else 0" | bc) -eq 1 ]] ; then # version is 3.0 or 3.1 SHOWNEWEST="3.2.${CUR3}" ; IMPORTANCE=2 ; elif [[ $(echo "if (${VERSION} == 3.2) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < ${CUR3}) 1 else 0" | bc) -eq 1 ]] ; then # version is 3.2 but lower than current SHOWNEWEST="3.2.${CUR3}" ; IMPORTANCE=1 ; else ISOK=1 ; echo "[INFO] version $VERSION.$SUBVERSION in $D is ok." ; fi else # seems not to bee a joomla version ... ISOK=1 ; fi ; if [[ $ISOK -eq 0 ]] ; then echo "[WARN] outdated Joomla version $VERSION.$SUBVERSION in $D" ; if [[ "$OUTFILE" != "" ]] ; then # write CSV file echo "\"$D\";$VERSION.$SUBVERSION;$SHOWNEWEST;$IMPORTANCE" >> $OUTFILE ; fi fi done exit 0 ;
Il y a un problème connu avec ce script :il ne peut pas reconnaître Mambo. Ainsi, toutes les installations de mambo seront marquées comme "OK", quelle que soit leur version.