Automated CMS category, version identification (CMS vulnerability detection)

时间:2021-12-29 05:23:54

catalog

. 引言
. 不同CMS版本标的文件路径调研
. Code Example

1. 引言

微软解决大量CVE补丁更新的检测时候,采取的思路不是根据MD5对单个漏洞文件(.dll、.sys)进行漏洞检测,而是采取基线检测的思路,对目标的.dll、.sys文件进行版本检测,如果当前版本不是最新的,则报告对应的可能存在的疑似漏洞

0x1: 技术方案

. 识别WEB路径
) 进程启动参数
) 解析WEB容器配置文件 . 定位CMS类型
) 从WEB根目录进行递归查找
) 根据相对路径、文本正则特征进行CMS类型定位
) 所有的规则(SEARCHPATHRULE)是逻辑与的关系,必须同时成立后,才能100%定位到该CMS类型
/*
需要注意的是:
有可能出现同一个WEB目录下同时存在同一类、但不同版本的CMS,在搜索的时候需要根据这些CMS的相对根目录分别进行正则匹配,最后统一统计结果,例如
1. D:\wamp\www\dedecms5.5
1) D:\wamp\www\dedecms5.5\plus\mytag_js.php: 路径命中、内容正则匹配成功
2) D:\wamp\www\dedecms5.5\plus\ad_js.php: 未命中
2. D:\wamp\www\dedecms5.7
1) D:\wamp\www\dedecms5.7\plus\mytag_js.php: 路径命中、内容正则匹配成功
2) D:\wamp\www\dedecms5.7\plus\ad_js.php: 路径命中、内容正则匹配成功 则最后的结果为: D:\wamp\www\dedecms5.7
*/ . 识别CMS版本
将上一步得到的CMS目录根目录,和规则库中的版本标的文件的相对路径进行拼接,利用正则匹配从标的文件中获取版本信息数据
/*
对于CMS版本的识别,通用的思路如下
1. 寻找每个版本100%一定都会变化的"标的文件",计算它的MD5值,和事先计算好的最新版的"标的文件"的MD5进行对比
2. 根据相对路径寻找一个"版本信息文件",此文件中明文保存着当前的版本信息
*/ . 计算当前获取的版本信息是否"小于"规则库中的版本信息(这里的小于需要在格式转换的基础上进行比较)
. 特征的匹配、版本信息的提取采取正则规则进行,在正则规则中使用了一些非捕获分组、前后环视控制符,在提取结果的时候需要提取"第一个捕获子组匹配到的文本"

权衡之下,在判断版本的方案中,如果采用方案1的话如果规则库不及时更新的话,可能会造成大规模误报(用户本机的CMS版本高于规则中的版本,但是因为MD5不同也被报出来了),所以采用方案2是相对较合理的方案,这种方案要求规则制定的时候需要case by case地调研不同CMS标识版本信息的路径文件

Relevant Link:

http://www.cnblogs.com/LittleHann/p/4497977.html

2. 不同CMS版本标的文件路径调研

0x1: DEDECMS

<CMSVERSIONINFO>
<ITEM>
<NAME>DEDECMS</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\plus\mytag_js.php</PATH>
<PATTERN>\$pv->SetTemplet</PATTERN>
</RULE>
<RULE>
<PATH>\plus\ad_js.php</PATH>
<PATTERN>\$dsql->GetOne</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\data\admin\ver.txt</PATH>
<PATTERN>[-]{}</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0X2: DISCUZ-X

<CMSVERSIONINFO>
<ITEM>
<NAME>DISCUZ-X</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\api\uc.php</PATH>
<PATTERN>API_RETURN_SUCCEED;</PATTERN>
</RULE>
<RULE>
<PATH>\source\module\member\member_activate.php</PATH>
<PATTERN>getuserbyuid</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\source\discuz_version.php</PATH>
<PATTERN>(?<=DISCUZ_RELEASE)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x3: DISCUZ

Discuz的版本存在2个分支,Discuz(number)是老的分支现在已经不维护了,Discuz-X是新的分支,所以原则上如果检测到当前CMS为数字系列的,都一律报告存在低版本风险

Discuz!版本
版本维护级别
一般性使用问题
严重性使用问题
一般性安全问题
高危安全问题
Discuz!X3.2
Discuz!X3.1
x
Discuz!X3.0
×
x
Discuz!X2.5
×
×
x
Discuz!X2
×
×
×
Discuz!X1.5.1
×
×
×
Discuz!X1.5
×
×
×
≤ Discuz! 7.x
x
x
x
x
         
放弃维护版本
Discuz!X1.0、 Discuz!1.0~Discuz!7.2
<CMSVERSIONINFO>
<ITEM>
<NAME>DISCUZ</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\api\uc.php</PATH>
<PATTERN>API_RETURN_SUCCEED;</PATTERN>
</RULE>
<RULE>
<PATH>\manyou\userapp.php</PATH>
<PATTERN>userapp.php\?script=user</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\discuz_version.php</PATH>
<PATTERN>(?<=DISCUZ_RELEASE)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x4: PHPMYADMIN

<CMSVERSIONINFO>
<ITEM>
<NAME>PHPMYADMIN</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\libraries\core.lib.php</PATH>
<PATTERN>PMA_ifSetOr</PATTERN>
</RULE>
<RULE>
<PATH>\libraries\common.inc.php</PATH>
<PATTERN>PHPMYADMIN</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\libraries\Config.class.php</PATH>
<PATTERN>(?<=PMA_VERSION)(?:.*?)([-]{,}\.[-]{,}\.[-]{,})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION>4.5.</NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x5: ASPCMS

<CMSVERSIONINFO>
<ITEM>
<NAME>ASPCMS</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\inc\AspCms_CommonFun.asp</PATH>
<PATTERN>createStreamFile</PATTERN>
</RULE>
<RULE>
<PATH>\inc\AspCms_SettingClass.asp</PATH>
<PATTERN>setcharset</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\inc\AspCms_Version.asp</PATH>
<PATTERN>(?<="AspCms)(?:.*?)([0-9]{8})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x6: WORDPRESS

<CMSVERSIONINFO>
<ITEM>
<NAME>WORDPRESS</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\wp-admin\credits.php</PATH>
<PATTERN>wp_credits</PATTERN>
</RULE>
<RULE>
<PATH>\wp-admin\canonical.php</PATH>
<PATTERN>redirect_canonical</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\wp-includes\version.php</PATH>
<PATTERN>(?<=wp_version)(?:.*?)([-]{,}\.[-]{,}\.[-]{,})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION>4.3.</NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x7: ECSHOP

<CMSVERSIONINFO>
<ITEM>
<NAME>ECSHOP</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\api\uc.php</PATH>
<PATTERN>API_RETURN_SUCCEED;</PATTERN>
</RULE>
<RULE>
<PATH>\includes\cls_template.php</PATH>
<PATTERN>make_compiled</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\includes\cls_ecshop.php</PATH>
<PATTERN>(?<=RELEASE)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x8: phpcmsv9

<CMSVERSIONINFO>
<ITEM>
<NAME>PHPCMSV9</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\phpcms\base.php</PATH>
<PATTERN>load_sys_class;</PATTERN>
</RULE>
<RULE>
<PATH>\phpsso_server\api.php</PATH>
<PATTERN>pc_base::load_sys_class</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\caches\configs\version.php</PATH>
<PATTERN>(?<=pc_release)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x9: JOOMLA

<CMSVERSIONINFO>
<ITEM>
<NAME>JOOMLA</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\libraries\cms\application\cms.php</PATH>
<PATTERN>afterSessionStart</PATTERN>
</RULE>
<RULE>
<PATH>\libraries\cms\class\loader.php</PATH>
<PATTERN>loadClass</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\libraries\cms\version\version.php</PATH>
<PATTERN>(?<=RELEASE)(?:.*?)([-]{,}\.[-]{,})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION>3.4</NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0X10: EMPIRECMS

<CMSVERSIONINFO>
<ITEM>
<NAME>EMPIRECMS</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\e\web\atom.php</PATH>
<PATTERN>RepSpeRssStr</PATTERN>
</RULE>
<RULE>
<PATH>\e\DoInfo\ecms.php</PATH>
<PATTERN>eCheckAccessDoIp</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\e\class\EmpireCMS_version.php</PATH>
<PATTERN>(?<=EmpireCMS_LASTTIME)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x11: PHPWEB

<CMSVERSIONINFO>
<ITEM>
<NAME>PHPWEB</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\member\includes\member.inc.php</PATH>
<PATTERN>membertypelist</PATTERN>
</RULE>
<RULE>
<PATH>\includes\codeimg.inc.php</PATH>
<PATTERN>SetDraw</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\version.php</PATH>
<PATTERN>(?<=PHPWEB_RELEASE)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x12: METINFO: 无法找到版本文件
0x13: drupal: 无法找到版本文件
0x14: coldfusion: 无法找到版本文件
0x15: z-blog: 无法找到版本文件

0x16: DESTOON

<CMSVERSIONINFO>
<ITEM>
<NAME>DESTOON</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\module\brand\brand.class.php</PATH>
<PATTERN>get_list</PATTERN>
</RULE>
<RULE>
<PATH>\module\brand\admin\setting.inc.php</PATH>
<PATTERN>update_setting</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\version.inc.php</PATH>
<PATTERN>(?<=DT_RELEASE)(?:.*?)([-]{})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION></NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x17: qibosoft: 无法找到版本文件

0x18: SHOPEX

<CMSVERSIONINFO>
<ITEM>
<NAME>SHOPEX</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\core\admin\controller\ctl.cent_save.php</PATH>
<PATTERN>make_shopex_ac</PATTERN>
</RULE>
<RULE>
<PATH>\core\admin\controller\member\ctl.member.php</PATH>
<PATTERN>show_detail</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\core\version.txt</PATH>
<PATTERN>(?<=app)(?:.*?)([-]{,}\.[-]{,}\.[-]{,})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION>4.8.</NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

0x19: ECMALL

<CMSVERSIONINFO>
<ITEM>
<NAME>ECMALL</NAME>
<SEARCHPATHRULE>
<RULE>
<PATH>\includes\models\partner.model.php</PATH>
<PATTERN>reset_error_handler</PATTERN>
</RULE>
<RULE>
<PATH>\admin\includes\priv.inc.php</PATH>
<PATTERN>\$menu_data</PATTERN>
</RULE>
</SEARCHPATHRULE>
<VERSIONINFO>
<PATH>\eccore\ecmall.php</PATH>
<PATTERN>(?<='VERSION)(?:.*?)([0-9]{0,1}\.[0-9]{0,1}\.[0-9]{0,1})</PATTERN>
</VERSIONINFO>
<NEWESTVERSION>2.3.</NEWESTVERSION>
</ITEM>
</CMSVERSIONINFO>

Relevant Link:

http://blog.sina.com.cn/s/blog_67c986fc0100w77z.html

3. Code Example

index.php

<?php
header("Content-type: text/html; charset=utf-8");
set_time_limit();
error_reporting(E_ALL); include "common.lib.php"; if (!empty($_POST))
{
if( !empty($_POST['submit']) && !empty($_POST['filepath']) )
{
$_filepath = $_POST['filepath'];
$fileList = getFileList($_filepath); $ruleValues = parseXMLRule("rule.xml");
foreach ($ruleValues as $ruleValuesItem)
{
$name = $ruleValuesItem["NAME"];
$versionino = $ruleValuesItem["VERSIONINFO"][];
$newestversion = $ruleValuesItem["NEWESTVERSION"];
//获取相对路径、正则内容全匹配成功的CMS根目录(prefix)
$hintPath = isSomeCMSTypeHint($fileList, $ruleValuesItem["SEARCHPATHRULE"]); //遍历所有CMS根目录,获取对应的版本信息
foreach ($hintPath as $hintPathValue)
{
$pattern = "/" . $versionino["PATTERN"] . "/sim";
if (preg_match($pattern, file_get_contents($hintPathValue . $versionino["PATH"]), $matchs))
{
$currentVersion = end($matchs);
//版本比较
if ( CompareVersion($currentVersion, $newestversion) == - )
{
echo "$name: $hintPathValue is not newest version(current: $currentVersion. newest: $newestversion)" . "<br />";
}
else
{
echo "$name: $hintPathValue is newest version($newestversion)" . "<br />";
}
}
else
{
die("get version info faild!");
}
} }
}
}
?> <html>
<body> <h1>主机层WEB漏洞扫描测试平台</h1> <form action="" method="POST">
<label for="filepath">FilePath:</label>
<input type="text" name="filepath" id="filepath" value="D:/wamp/www"/>
<br />
<input type="submit" name="submit" value="Submit" />
</form>

common.lib.php

<?php

    /**
*
*/
class ruleObjecy
{ function __construct()
{
# code...
}
} function get_extension($file)
{
return pathinfo($file, PATHINFO_EXTENSION);
} $files = array();
//递归获取指定目录下所有文件
function getFileList($directory)
{
global $files;
//需要过滤的白名单文件名
$whitelist = array(
=> ".",
=> ".."
);
//需要枚举的目标文件后缀
$extlist = array(
=> "php"
//1 => "txt"
); if(is_dir($directory))
{
if($dh = opendir($directory))
{
while(($file = readdir($dh)) !== false)
{
$white_hint = false;
foreach ($whitelist as $key => $value)
{
if ($value !== $file)
{
$white_hint = false;
}
else
{
//命中一次即退出
$white_hint = true;
break;
}
}
//判断是否命中白名单
if ($white_hint === false)
{
//递归遍历
$curDir = $directory . "/" . $file;
if(is_dir($curDir))
{
getFileList($curDir);
} //判断是否是目标后缀
foreach ($extlist as $extValue)
{
$fileExt = get_extension($file);
if ($fileExt == $extValue)
{
$files[] = $directory . "/" . $file;
break;
}
}
}
}
//关闭文件夹句柄
closedir($dh);
}
}
return $files;
} $CMSVERSIONINFO = array(
=> array(
"NAME" => "DEDECMS",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/plus/mytag_js.php", "PATTERN" => "\\\$pv->SetTemplet"),
=> array("PATH" => "/plus/ad_js.php", "PATTERN" => "\\\$dsql->GetOne")
),
"VERSIONINFO" => array(
=> array("PATH" => "/data/admin/ver.txt", "PATTERN" => "[0-9]{8}")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "DISCUZ",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/api/uc.php", "PATTERN" => "API_RETURN_SUCCEED;"),
=> array("PATH" => "/manyou/userapp.php", "PATTERN" => "userapp.php\\?script=user")
),
"VERSIONINFO" => array(
=> array("PATH" => "/discuz_version.php", "PATTERN" => "(?<=DISCUZ_RELEASE)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "DISCUZ-X",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/api/uc.php", "PATTERN" => "API_RETURN_SUCCEED;"),
1 => array("PATH" => "/source/module/member/member_activate.php", "PATTERN" => "getuserbyuid")
),
"VERSIONINFO" => array(
=> array("PATH" => "/source/discuz_version.php", "PATTERN" => "(?<=DISCUZ_RELEASE)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "PHPMYADMIN",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/libraries/core.lib.php", "PATTERN" => "PMA_ifSetOr"),
=> array("PATH" => "/libraries/common.inc.php", "PATTERN" => "PHPMYADMIN")
),
"VERSIONINFO" => array(
=> array("PATH" => "/libraries/Config.class.php", "PATTERN" => "(?<=PMA_VERSION)(?:.*?)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})")
),
"NEWESTVERSION" => "4.5.1"
),
=> array(
"NAME" => "ASPCMS",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/inc/AspCms_CommonFun.asp", "PATTERN" => "createStreamFile"),
=> array("PATH" => "/inc/AspCms_SettingClass.asp", "PATTERN" => "setcharset")
),
"VERSIONINFO" => array(
=> array("PATH" => "/inc/AspCms_Version.asp", "PATTERN" => "(?<=\"AspCms)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "WORDPRESS",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/wp-admin/credits.php", "PATTERN" => "credits"),
=> array("PATH" => "/wp-admin/canonical.php", "PATTERN" => "redirect_canonical")
),
"VERSIONINFO" => array(
=> array("PATH" => "/wp-includes/version.php", "PATTERN" => "(?<=wp_version)(?:.*?)([0-9]{1,2}\\.[0-9]{1,2}\\.[0-9]{1,2})")
),
"NEWESTVERSION" => "4.3.1"
),
=> array(
"NAME" => "ECSHOP",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/api/uc.php", "PATTERN" => "API_RETURN_SUCCEED;"),
=> array("PATH" => "/includes/cls_template.php", "PATTERN" => "make_compiled")
),
"VERSIONINFO" => array(
=> array("PATH" => "/includes/cls_ecshop.php", "PATTERN" => "(?<=RELEASE)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "PHPCMSV9",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/phpcms/base.php", "PATTERN" => "load_sys_class;"),
=> array("PATH" => "/phpsso_server/api.php", "PATTERN" => "pc_base::load_sys_class")
),
"VERSIONINFO" => array(
=> array("PATH" => "/caches/configs/version.php", "PATTERN" => "(?<=pc_release)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "JOOMLA",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/libraries/cms/application/cms.php", "PATTERN" => "afterSessionStart;"),
=> array("PATH" => "/libraries/cms/class/loader.php", "PATTERN" => "loadClass")
),
"VERSIONINFO" => array(
=> array("PATH" => "/libraries/cms/version/version.php", "PATTERN" => "(?<=RELEASE)(?:.*?)([0-9]{0,1}\.[0-9]{0,1})")
),
"NEWESTVERSION" => "3.4"
),
=> array(
"NAME" => "EMPIRECMS",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/e/web/atom.php", "PATTERN" => "RepSpeRssStr"),
=> array("PATH" => "/e/DoInfo/ecms.php", "PATTERN" => "eCheckAccessDoIp")
),
"VERSIONINFO" => array(
=> array("PATH" => "/e/class/EmpireCMS_version.php", "PATTERN" => "(?<=EmpireCMS_LASTTIME)(?:.*?)([0-9]{12})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "PHPWEB",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/member/includes/member.inc.php", "PATTERN" => "membertypelist"),
=> array("PATH" => "/includes/codeimg.inc.php", "PATTERN" => "SetDraw")
),
"VERSIONINFO" => array(
=> array("PATH" => "/version.php", "PATTERN" => "(?<=PHPWEB_RELEASE)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "DESTOON",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/module/brand/brand.class.php", "PATTERN" => "get_list"),
=> array("PATH" => "/module/brand/admin/setting.inc.php", "PATTERN" => "update_setting")
),
"VERSIONINFO" => array(
=> array("PATH" => "/version.inc.php", "PATTERN" => "(?<=DT_RELEASE)(?:.*?)([0-9]{8})")
),
"NEWESTVERSION" => ""
),
=> array(
"NAME" => "SHOPEX",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/core/admin/controller/ctl.cent_save.php", "PATTERN" => "make_shopex_ac"),
=> array("PATH" => "/core/admin/controller/member/ctl.member.php", "PATTERN" => "show_detail")
),
"VERSIONINFO" => array(
=> array("PATH" => "/core/version.txt", "PATTERN" => "(?<=app)(?:.*?)([0-9]{0,1}\.[0-9]{0,1}\.[0-9]{0,1})")
),
"NEWESTVERSION" => "4.8.5"
),
=> array(
"NAME" => "ECMALL",
"SEARCHPATHRULE" => array(
=> array("PATH" => "/includes/models/partner.model.php", "PATTERN" => "reset_error_handler"),
=> array("PATH" => "/admin/includes/priv.inc.php", "PATTERN" => "\\\$menu_data")
),
"VERSIONINFO" => array(
=> array("PATH" => "/eccore/ecmall.php", "PATTERN" => "(?<='VERSION)(?:.*?)([0-9]{0,1}\\.[0-9]{0,1}\\.[0-9]{0,1})")
),
"NEWESTVERSION" => "2.3.0"
)
); //解析XML格式的规则文件,返回多维数组
function parseXMLRule($filePath)
{
global $CMSVERSIONINFO;
return $CMSVERSIONINFO;
} function isSomeCMSTypeHint($fileList, $ruleValues)
{
//有可能出现同一个WEB目录下同时存在同一类、但不同版本的CMS,在搜索的时候需要根据这些CMS的相对根目录(prefix)建立索引,分别进行正则匹配,最后统一统计结果
$ruleSearchLogger = array();
$result = array(); //rule
foreach ($ruleValues as $seatchruleItem)
{
$searchpath = $seatchruleItem["PATH"];
$pattern = $seatchruleItem["PATTERN"];
$pattern = "/" . $pattern . "/sim"; //file list
foreach ($fileList as $fileListItem)
{
//1. find relevant filepath
//防止出现/plus/mytag_js.php.txt这种情况也被误匹配到
if (stripos($fileListItem, $searchpath) !== false && substr($fileListItem, stripos($fileListItem, $searchpath)) == $searchpath)
{
//2. regex content match
if(preg_match($pattern, file_get_contents($fileListItem), $matches))
{
$prefix = substr($fileListItem, , strpos($fileListItem, $searchpath));
$ruleSearchLogger[$prefix][$searchpath] = ;
}
}
}
} //判断同时满足所有路径规则的CMS根目录前缀
foreach ($ruleValues as $seatchruleItem)
{
$searchpath = $seatchruleItem["PATH"];
foreach ($ruleSearchLogger as $prefix => $ruleSearchLoggerValue)
{
if ( array_key_exists($searchpath, $ruleSearchLoggerValue) )
{
$ruleSearchLogger[$prefix][$searchpath] = ;
}
else
{
$ruleSearchLogger[$prefix][$searchpath] = ;
}
}
} //过滤出完整命中的路径前缀
foreach ($ruleSearchLogger as $prefix => $ruleSearchLoggerValue)
{
$isFound = ; foreach ($ruleSearchLoggerValue as $value)
{
if ($value == )
{
$isFound = ;
continue;
}
else
{
$isFound = ;
break;
}
} if ($isFound == )
{
$result[] = $prefix;
}
} return $result;
} /*
1. 纯数字型版本、2. 点分计数型版本
return:
-1: <
0: =
1: >
*/
function CompareVersion($currentVersion, $newestversion)
{
if($currentVersion == $newestversion) return ; //4.5.6: 点分型
if (preg_match("/[0-9]{1,2}\\./sim", $currentVersion) && preg_match("/[0-9]{1,2}\\./sim", $newestversion))
{ $verArray1 = explode($currentVersion, ".");
$verArray2 = explode($newestversion, "."); $count = count($verArray1) < count($verArray2) ? count($verArray1) : count($verArray2); for ($i = ; $i < $count; $i++)
{
if ( intval($verArray1[$i]) < intval($verArray2[$i]) ) return -; //从主版本开始逐段检测,只要出现一次小于的,就说明 $currentVersion < $newestversion
else if ( intval($verArray1[$i]) > intval($verArray2[$i]) ) return ; //从主版本开始逐段检测,只要出现一次小于的,就说明 $currentVersion < $newestversion
} //在全等的情况下,判断$currentVersion、$newestversion长度
return count($verArray1) >= count($verArray2) ? : -;
}
//20141025: 纯数字型
else if (preg_match("/[0-9]{6,}/sim", $currentVersion) && preg_match("/[0-9]{6,}/sim", $newestversion))
{
if ($currentVersion < $newestversion)
{
return -;
}
else
{
return $currentVersion == $newestversion ? : ;
}
} } ?>

aaarticlea/png;base64,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" alt="" />

0x1: 版本比较

版本比较需要考虑到多种情况

. 获取当前版本失败、获取的当前版本和配置里的基线配置参数格式不一致,遵循"宁可漏报不能误报"的原则,选择忽略
. 格式相同、且长度不相同
) 点分格式: 逐段判断
) 纯数字形式: 解析为年-月-日后逐段判断
. 格式相同,长度不同
将长度段的版本号补全,例如: 3.5. compare 3.5 => 3.5. compare 3.5.

Copyright (c) 2015 LittleHann All rights reserved