今天我想关注一个可能导致被黑客帐户,垃圾邮件等巨大问题的主题:服务器上过时的Joomla安装 。
当然这也适用于其他软件。 所提到的方法应该以类似的方式对其他软件工作。 由于Joomla广泛分布在整个互联网上,特别是在共享托管系统CMS(内容管理系统)上 ,这个方法迄今只会涵盖Joomla。
先决条件
您至少需要在默认情况下并不总是安装的工具bc
和sed
。
让我们开始
起初有一个问题:如何从安装的文件中识别joomla版本?
这取决于Joomla的安装版本。 到目前为止,我发现包含版本信息的三个不同的文件:
/libraries/joomla/version.php
/libraries/cms/version/version.php
/includes/version.php
这些文件中最重要的一行是包含在以下变量中的版本号和次要版本 :
var $ RELEASE ='1.0';
var $ DEV_LEVEL ='12';
在下一步,我们将在官方网站上搜索Joomla的最新版本。 在撰写本文时,有三个版本组: 1.5 (1.5.26), 2.5 (2.5.17)和3.2 (3.2.1)。
在您的服务器上查找joomla安装
所有joomla安装有一个共同之处就是文件夹名称“components”
,所以我们用这个名字搜索所有的文件夹。 同时,我们忽略子文件夹“管理员”
中包含的所有组件文件夹。 如果您的服务器上的网站不在那里,则必须调整基本路径/ var / www
。
find /var/www/ -type d -name 'components' ! -wholename '**/administrator/components'
此命令将为您提供所有这些文件夹的列表。 命令dirname
适用于获取包含组件文件夹的路径。 这是Joomla安装的基本路径 。
我们为所有找到的组件文件夹循环执行此操作:
for L in `find /var/www/ -type d -name 'components' ! -wholename '**/administrator/components'` ; do
D=`dirname $L` ;
done
获得主要和次要版本
要获得安装版本,我们将使用组合命令“grep”
和“sed”
。
首先,我们检查我之前提到的三个文件中存在哪个文件存在于安装路径中。
F=$D/libraries/joomla/version.php ;
F2=$D/libraries/cms/version/version.php ;
F3=$D/includes/version.php ;
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
else
echo "No joomla version file found." ;
fi
现在我们从这个文件中读取主要和次要版本:
VERSION=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ;
SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ;
比较版本
由于版本号不是整数,所以我们无法使用-lt
等将它们与bash脚本进行比较。相反,我们需要使用一个名为bc
的外部程序:
ISOK=1 ;
if [[ $(echo "if (${VERSION} < 1.5) 1 else 0" | bc) -eq 1 ]] ; then
# version is lower than 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 ]] ; then
# version is 1.5.x but lower than 1.5.26
ISOK=0 ;
### and so on - further version checks
else
ISOK=1 ;
fi
完整的脚本
现在我们已经准备好将所有零件组装成一个可以使用的脚本,并添加一些小的改进。 脚本将搜索给定基本路径中的所有joomla版本,并打印有关状态的信息。 当然,您不能将1.5.26版本称为“当前”,因为它是1.5分支的最新版本,而对于2.5或3.x分支的更新在某些情况下非常复杂,此脚本将标记为版本为“OK”。 如果你喜欢,你可以改变这个。
以下是脚本的示例输出:
[INFO] version 1.5.26 in /var/www/xxx is ok.
[WARN] outdated Joomla version 1.0.12 in /var/www/yyy
[WARN] outdated Joomla version 1.5.14 in /var/www/zzz
[WARN] outdated Joomla version 2.5.8 in /var/www/aaa
[WARN] outdated Joomla version 1.5.10 in /var/www/bbb
现在:完整的脚本。 只需将其保存为“joomlascan.sh”
即可
bash joomlascan.sh
如果您将文件名作为附加参数(如bash joomlascan.sh list.csv
),您将获得一个名为list.csv
的文件,其中包含所有过时的安装的列表:
/var/www/yyy;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
小费:
如果使用ISPConfig 3,则应将BASEPATH更改为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 ;
这个脚本有一个已知的问题:它不能识别Mambo
。 所以它将标记所有mambo安装为“OK”,无论他们有哪个版本。