上半年的CMS命令执行漏洞报告提交已久。今日,我愿与大家共同研究如何挖掘广泛存在的漏洞,期望对初学者有所启发。
https://github.com/search?q=cms
https://search.gitee.com/?skin=rec&type=repository&q=cms
https://down.chinaz.com/
https://www.a5xiazai.com/
......
1、找最新版的版本较低的,例如1.1、1.2
2、找github star不多的
3、找源码总容量小的
4、尽量不要找使用tp、yii、laravel等框架型CMS
版本与漏洞情况
对于最新版的CMS系统,我们需要掌握其开发与维护状况,因为其中许多基础漏洞可能已被发现并解决。所以,我们不应仅将攻击目标锁定在已检验过的区域。当然,我们也不必感到束手无策,并非每个漏洞都必须逐行代码进行审查。借助适当的工具往往能提高漏洞查找的效率,既节省了时间,也减轻了工作负担。
测试方式选择
https://www.xp.cn/
https://github.com/f1tz/cnseay
https://github.com/chaitin/xray/releases
拿到CMS的源代码之后,不要只专注于深入代码研究。可以尝试黑盒测试,也就是人们常说的灰盒测试,这样做能有效提升发现漏洞的概率。随意抓取一些数据包进行分析,漏洞是否存在通常能很快判断出来。这样操作,不仅能检测出漏洞,还能同时进行扫描,真是一种一举两得的好方法。
编辑器的使用
编辑器确实让代码的查看变得方便快捷。不过,并非每次编写代码时都非得用它。只需在必要时打开即可。我个人比较喜欢使用Nopad++,当然,其他编辑器如Phpstorm也是不错的选择。Phpstorm支持快速跳转函数,这对提高工作效率非常有帮助。
任意文件包含漏洞
./xray_darwin_amd64 webscan --listen 127.0.0.1:7777 --html-output test.html
以某个内容管理系统为例,该系统中有一个叫做$_G['SYSTEM']['PATH']的变量。这个变量似乎是可以被操控的,因此有可能导致任意文件包含的安全风险。但事实上,这个变量在系统启动之初就已经被确定了。至于我们获取的$path变量,系统只是对其进行了权限限制和验证,并没有对其进行过滤。在检查漏洞路径时,需要对/app/目录下的文件进行管理,这一过程中,文件内部还会请求访问其他文件。通过URL分析,我们能够精确确定目标文件的路径。
系统重装漏洞
在系统重装之前,有些人会把用户填写的配置信息保存在PHP文件中,一旦输入了相关代码,这些代码就有可能被运行。以/install/index.php这个文件为例,如果这个文件存在,系统就无法进行重装。在正常操作过程中,当达到step=2这一步骤时,需要输入数据库等关键信息,这个环节很可能隐藏着不少秘密。
CSRF与任意文件写入
在Dedecms这个系统中,就算用户没有管理员的权限,他们也不能随意对文件进行写入。但是,如果这个漏洞和CSRF问题结合起来,只需要利用管理员的cookie,就可以轻松完成操作,这样的风险就变得非常大了。首先,我们必须捕捉到那些用于写入文件的数据包,然后观察这些数据包,发现其中并没有明显的token或者其他类似的字段。随后,在已经登录的浏览器界面内,打开相应的文件,经过一系列的页面切换,留意显示的提示信息,同时,根据网站根目录下文件的写入情况,综合判断操作是否达到了预期的效果。
在日常寻找CMS系统漏洞的实践中,若遇到难以判断漏洞是否存在的情况,我们一般会采取什么办法?期待大家留言分享你们的具体做法,同时,也请不要忘记为这篇文章点个赞并转发一下!
$path = realpath($_GET['path']);
if (!$path) {
if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$_G['GET']['JSON']) {
PkPopup('{content:"不存在的路径,请求路径:' . $_GET['path'] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
ExitJson('不存在的路径,请求路径:' . $_GET['path']);
}
$_G['TEMP']['PATH'] = iconv('GBK', 'UTF-8//IGNORE', $path);
if (strpos($path, $spath) !== 0) {
if (!InArray('edit,save,del,mkdir,mkfile', $type) && !$_G['GET']['JSON']) {
PkPopup('{content:"越权操作,请求路径:' . $_GET['path'] . '",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
ExitJson('越权操作,请求路径:' . $_GET['path']);
}
switch ($type) {
case 'edit' :
if (filetype($path) != 'file') {
if ($_G['GET']['JSON']) {
ExitJson('不存在的文件');
}
PkPopup('{content:"不存在的文件",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
$suffix = substr($path, strrpos($path, '.') + 1);
if (!InArray($suffixs, $suffix)) {
if ($_G['GET']['JSON']) {
ExitJson('不支持的文件格式');
}
PkPopup('{content:"不支持的文件格式",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
$filecontent1 = file_get_contents($path);
$filecontent = htmlspecialchars($filecontent1, ENT_QUOTES);
if ($filecontent1 && !$filecontent) {
if ($_G['GET']['JSON']) {
ExitJson('不支持该文件编码,仅支持UTF-8');
}
PkPopup('{content:"不支持该文件编码,仅支持UTF-8",icon:2,shade:1,hideclose:1,submit:function(){location.href="index.php?c=app&a=filesmanager:index&path="}}');
}
if ($_G['GET']['JSON']) {
ExitJson($filecontent1, TRUE);
}
$path = str_replace('\\', '/', $path);
$paths = explode('/', $path);
$path = '';
for ($i = 0; $i < count($paths); $i++) {
if ($i == count($paths) - 1) {
$filename = $paths[$i];
} else {
$path .= $paths[$i] . '/';
}
}
ExitGourl('index.php?c=app&a=filesmanager:index&path=' . urlencode(realpath($path)) . '&editbtn=' . md5($filename));
break;