如何在服务器上找到过期的Joomla版本,以降低被黑客入侵的风险

今天我想关注一个可能导致被黑客帐户,垃圾邮件等巨大问题的主题:服务器上过时的Joomla安装

当然这也适用于其他软件。 所提到的方法应该以类似的方式对其他软件工作。 由于Joomla广泛分布在整个互联网上,特别是在共享托管系统CMS(内容管理系统)上 ,这个方法迄今只会涵盖Joomla。

先决条件

您至少需要在默认情况下并不总是安装的工具bcsed

让我们开始

起初有一个问题:如何从安装的文件中识别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”,无论他们有哪个版本。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏